CMake Announcement from Boost Steering Committee
lists.boost.org
lists.boost.org
Also copy-pasting sometimes work better simply because very few developers actually able to check how their own configuration work across multiple platforms and endless number of Linux distributions. It's might look easy to make your own configuration, but once you try to at least cover Windows, Mac and Deb-based Linux it's take weeks to debug everything. Instead you can copy-paste someone else module, change few lines and it's will already cover everything you need.
EDIT: typo: on -> once
That a lot of FOSS projects (understandably) have poor support for Windows doesn't mean that all of them do. It also doesn't mean there isn't demand for FOSS projects on that platform.
Yeah, why should 80% of the OS market share mind to people who develop software for a living?
Neither Buck and Bazel are nowhere near as Cmake.
As someone who works with C++ and cross compiles code to arm. I really appreciate and enjoyed with recent trends in porting codes to cmake build(prebuild?) system .
I think even building packages for Linux distros is hard with these systems and cross compilation is barely documented too (however seems that it is supported, even for Windows). There are no discovery of libraries installed in system and features of system (killer feature of autotools).
I was an early adopter (years and years ago) of Scons, but the Python dependency turned out to be an absolute disaster, purely in terms of infrastructure (especially that everybody had to have a lot of "things" installed).
While CMake isn't exactly great, a) it is reasonably understandable, and b) the boost build system was essentially a single-project-build system, and c) it's a huge improvement over autoconf, and d) it doesn't need a lot of infrastructure aside from what ships with it (to contrast with 'interpreted' build systems).
Can anyone share a good survey article/paper on the fundamental issues related to build systems, or what is the criteria for a good system (other than popularity)?
Is this a tricky issue because it's tangled with configuration-management and package-management, and OS-filesystem-hierarchy in general? (in which case you can not solve this problem without standardization efforts at multiple levels).
I'm not looking whether to chose CMake or its competitors, but looking for insight into the minds of build-system creators (something deeper than just annoyance with existing tools).
(addition of history discussion would be even better)
It has a pretty good overview of the what the goals of a build system should be, and section 7 compares several different build systems
http://eprint.ncl.ac.uk/file_store/production/226639/BA1AC95...
Replying to my own comment to add a 4-5 year old HN discussion about an article from 2003: https://news.ycombinator.com/item?id=7220917
edit: Discussion of Guix, a package management system that interacts with a given build system: https://news.ycombinator.com/item?id=4821488
Too bad that C++ has invested so heavily in modernizing the language, but it can't invest in a sane, standard build tool. :(
You have the problem backwards. IDEs wouldn't need distinct project files if build systems could reasonably describe the project structure out of the box. There is no need for every tool to know about every other tool. This is a solved problem in most modern programming languages.
No it's not. Not even close.
Just out of curiosity what what's your current IDE?
No, it really isn't, but... have fun whatever you're doing. :)
But they do, and ignoring hard constraints imposed by reality doesn't help increase adoption rates.
> There is no need for every tool to know about every other tool.
If you want your product to be supported by an IDE but you don't have any say on how that IDE is developed, the only sure way you have to get your product supported by that IDE is to get your product to output the IDE project files.
But they don't, and saying they're "imposed by reality" is not a compelling argument. They need information about a project; there is no reason that information needs to be generated by a build tool instead of the same files that the rest of the toolchain use. They may also need a file to save a user editor preferences, but there is no reason that needs to be the project metadata file.
> the only sure way you have to get your product supported by that IDE is to get your product to output the IDE project files.
This is patently false. Almost every interesting IDE is pluggable, so a single plugin is written and maintained for each programming language that supports a reasonable project metadata file. CMake is the odd exception which generates files for IDEs because the project metadata is buried in the mess of imperative glue code used to build the project in lieu of a proper build tool.
Why do you think that is? No doubt you'll say it's because the other options are worse, but I'll just say that I like CMake. I miss CMake when I use other languages and I can set up a complicated project with CMake quicker and easier than I can with other tools.
As always, it's what you know.
Even if 1% of projects need a fully imperative language, it's absurd to foist that on every other project by default. Besides that, I have a lot of criticism for CMake the language, starting with its implicit import mechanism, ridiculous syntax, everything's-a-string, slow execution speed, etc.
Is using C++ for everything include web interface is sane solution? I could guess reasons for having build bot and web UI in C++, but not sure if it's good way to get more contributors.
It seems like CMake is quite popular now, with LLVM having moved to it a few years ago.
This will of course require some proper configuration on Boost side, but no doubt they'll handle it.
I did some semi-serious experimenting with it at one point and it was just... well, awful. It basically did very few things right.
(BTW, don't take this as criticism of the authors of said system. I just don't "we" had learned enough and infrastructure was incredibly far behind what we have now. So I don't "blame" them in the least. It's just a product of its time.)
(Because, honestly, I've never heard of a "good one", but there are "less bad ones".)
FWIW, I like "cabal-install", the Haskell equivalent of cargo. It also suffers from the same problems as soon as you start to use multiple languages in a project (except C, that's quite well supported). I stress the word "project". If a "project" to you is just a single language then I'm, first of all, happy for you... Unfortunately that's not the reality for many of us, and THAT is why we need build systems.
EDIT: Point being: A language-specific build system can be great, but as soon as you get a big project with multiple languages it leaves you, the Master of the Build, with a big problem because you suddenly have to incorporate every $OTHER_LANGUAGE into the build... somehow. All of that integration is on you and is specific to your situation.
A build system on the other hand leaves each language implementation with a simple problem: how do I integrate with build system X? One that's settled it works for everyone using build system X, so we're not duplicating that huge amount of effort you would put in in the language-specific-build-tool situation.
(Obviously, this imaginary perfect build tool "interface" is highly non-trivial, but that doesn't mean we shouldn't strive for it.)
EDIT: Again, I'm not saying CMake is perfect, but then you haven't offered anything better, so... NYAH? Do you have something better? It's easy to complain about build systems (I do it all the time), but not so easy to come up with something better. Btw, have we dispatched the single-language assumption at this point? (Because, unless "your" language is C or C++, it's not going to happen unless POSIX is miraculously displaced).
Alternate solutions include Docker, Nix, or even plain makefiles depending on what your artifact needs to be.
Posix is unrelated to invoking multiple build tools and assembling their results.
I try to do something similar with my own project https://github.com/jachris/cook – it's not ready though, but you can take a look at it.
Think of Cmake as a portable, high level layer over make.
Now this is a statement I didn't expect. I currently use make for my simple projects and, as commented a few mintues ago, looking for insight into what makes a good build-system (ignoring popularity).
I used automake/autoconf briefly but it always tripped me up (though I should admit I never learned it properly).
Could you expand on why you think autoconf is superior?
To me, the official GNU docs are unreadable, and the only useful and mildly palatable documentation available on the web comes in the form of blog posts published by people who managed to learn how to get autotools projects to work and took their time to tell the world how they managed to accomplish that feat of technical prowess.
Once that initial part of the learning curve is surpassed, autotools presents itself as a remarkably robust and resilient build system which is highly extensible, which supports virtually all use cases that any user may need to implement.
Build systems such as CMake are started as better alternatives to autotools, and they do succeed in that venture by providing better documentation and presenting a smoother learning curve to accomplish basic tasks. Yet, once a project grows out of the scope of basic use cases.... Everything starts to break, while autoconfs soldier on like a champ.
IDE Support: KDevelop and CLion both support CMake as a flag ship project file.
Why? A CMakeLists.txt has all you need: the project's debug/release build commands, include's for completions, and library files.
Growing ubiquity: More and more open source projects are build around CMake
CoreCLR, Swift, lua, SFML, opencv, cafe, zlib, libevent, blender, protobuf
Some fast facts about these tools:
- CMake is complicated. Sure, there are macros. But it's not a bad thing. CMake's complexity is proportional to what it takes to do the job: finding header files and libraries across platforms, detecting compiler features, and so on.
- This isn't the kind of a job that can be solved by a simple, beautiful 50 line file.
For instance: Stuff like finding SDL2 header files across platforms is hard because OS leave them in /usr/include, /usr/local/include, then within that, some keep them under SDL or SDL2 within that. Ergo, custom modules need to be built to handle the differences that have organically manifested in distros over the years.
- In order to have software binaries built for as many platforms as possible, a build system needs to be able to test that certain functions exist.
For instance, tmux: https://github.com/tmux/tmux/blob/45ee118/configure.ac#L427. The only way for tmux to know if it should "polyfill" getopt is to run a small snippet of code.
If your system has it, it stores HAVE_GETOPT. If not, it has to get fill in getopt at https://github.com/tmux/tmux/blob/45ee118/compat/getopt.c via https://github.com/tmux/tmux/blob/45ee118/compat.h#L352
- Understand the point of these kind of tools is solve a problem: Getting your source to build across a range of platforms, not just Ubuntu!
- Not to mention, CMake has compatibility for various generator outputs. For instance, it can output Visual Studio projects, XCode projects, and even more popular, Ninja (https://ninja-build.org/)
- CMake gives leaves helpful debug output when so you can get help when you're troubleshooting (cmake --system-information sysinfo.txt)
As a big CMake fan, I don't think CMake's success has anything to do with their super ugly custom language. What CMake does could be a lot more ergonomic, especially from a typical user's standpoint.
Real pain is that a lot of CMake features are badly documented and most of available information is outdated, but this is usual problem at least for open source C++ projects so it's doesn't cause a lot of frustration and no one try to fix it.
Another point I'd like to add here: CMake basically takes to you what autoconf/automake can do (+ 5/10 years of improvement on UX/UI), but it:
a) doesn't use absurd amounts of slow shell code trying to detect features that no (non-EOL) OS has been missing for the last 20 years.
b) is actually reasonably readable. (Ok, m4 is sort of readable, but it a bit weird in places.)
c) is actually better documented (IME) than autoconf/automake. What people usually do for autoconf/automake is just copy/paste another project/snippet. .. hence leading to the 20+ years problem. (I'll definitely agree that the docs aren't great, but that's at least a problem that can practically be fixed unlike the copy/paste problem of autoconf/-make.)
[1] http://mxe.cc/