News for hackers. Stuff that matters.
Re:Allowing CMake functions to return(value) by rumanator on Tuesday August 18, 2020 @03:03PM (#24202843)
> Most part of my career I used Visual Studio and when switched to Linux I was slightly shocked. Compared to MSVS, makefiles felt like bows and arrows against machine gun.

I honesty have no idea how some people come up with these absurd comparisons. I mean, who in their right mind feel is appropriate to compare a Makefile with a build system? And how clueless about things are "in the Linux world" do you need to be to claim that Makefiles are how people build software in Linux?

I mean, I've been using Linux for a couple of decades now and I can't remember the last time I saw a project that relied on Makefiles to build. At best projects use some kind of Makefile generator. The ancient ones use autotools and even those are going the way of the dodo.

> CMake allows us to handle almost all those things right except one - it doesn’t have return values

This is a red flag. If you're hoping to write functions with cmake... You're doing it wrong. Very wrong. You add targets, and you add rules to the target. If you find yourself wanting to do anything other than this then you should take a step back and read a modern cmake tutorial again, because odds are you're doing it wrong.

Re:Allowing CMake functions to return(value) by dlivingston on Tuesday August 18, 2020 @03:14PM (#24202999)
> I've been using Linux for a couple of decades now and I can't remember the last time I saw a project that relied on Makefiles to build.

Makefiles, at least in my corner of the industry, are exceedingly common for projects with a build process of medium-to-low complexity.

Re:Allowing CMake functions to return(value) by 1ris on Tuesday August 18, 2020 @05:11PM (#24204396)
I would love to use makefiles and git submodules instead of this msbuild/nuget contraption. That would be way less sophisticated, but I would welcome it. msbuild seems like a good example of microsofts tendency to overengineer simple things. But sometimes its suprisingly simple. different build configuration are just strings stiched together like "x64|Debug", and then are are conditionals to that value. Msbuild it's kind of a CLR language, but you can't debug it. The xml sytax and the syntax you use in the attributes feels arkward but sometimes limited for no good reason. Is <Message Text="Backup files: @(Compile->'%(filename).bak')" /> what i would want, if I'm used to linq? No, not me. @ and % are not intuitive for me. I usually have to try out what works. Accessing members of objects is odd. Calling System.String.Format feels like I'm supposed to do it. Anything interesting has to be done with custom task, and these are hard to debug aswell. For example studio would unload the .dlls, so you have to close it every time. That thing feels like a classic turing tarpit. A very complicated turing tarpit.

Then again, if your build should output a .nupkg, the whole infrastructure seems to be lacking. You are left alone doing things that seem like they should be part of a package manager. e.g. handling of the version number. The whole build system knows the build output, but you have to specify it by hand again, in a different file.

Re:Allowing CMake functions to return(value) by kazinator on Tuesday August 18, 2020 @05:42PM (#24204692)
> I can't remember the last time I saw a project that relied on Makefiles to build

I don't know what GNU/Linux you're using, because in my experience, most packages going into a distro use make.

Oh, and then there is that whole denominator in the GNU/Linux fraction that's built with GNU Make.

Maybe you don't see Makefiles because you're relying on binary packages?

Re:Allowing CMake functions to return(value) by jcelerier on Tuesday August 18, 2020 @06:02PM (#24204877)
> I don't know what GNU/Linux you're using, because in my experience, most packages going into a distro use make.

no, they use autotools or cmake, which happens to generate makefiles. the package authors themselves definitely don't write any makefiles by hand except maybe for trivial packages (and frankly I'm not sure)

Re:Allowing CMake functions to return(value) by kazinator on Tuesday August 18, 2020 @06:29PM (#24205098)
Autotools generate a Makefile project, and nothing but a Makefile project. All the buiding in the development cycle is done by typing "make". Autotools projects include a template makefile: Makefile.am. Make is not concealed in any way.

Also note that not all Autotools-based projects use Automake. Using only Autoconf, with a hand-maintained Makefile, is a thing.

The goal of Autotools is to produce a software distribution that doesn't require the end user to have Autotools. The end user has a shell to run the configure script, and that's it. If that works, they run "make".

About the most sophisticated generation the user will see is that some Makefile.in template is passed through sed to substitute @@XYZ@@ variables.

Re:Allowing CMake functions to return(value) by de_watcher on Wednesday August 19, 2020 @03:45AM (#24208122)
Make is like an assembly language of the build systems. This layer gives structure and debuggability (otherwise you're spending time poking at some opaque UI or something).
Re:Allowing CMake functions to return(value) by anand-bala on Wednesday August 19, 2020 @01:22AM (#24207409)
This is true for Autotools projects, but isn't true for CMake, Bazel, Meson, and others. Let's take CMake for example, which is IMHO the most popular build tool: most modern CMake projects prefer to use the Ninja build system over Make.

And coming back to Autotools, some of the largest Autotools projects (see the GNOME ecosystem) has been moving/moved to Meson, which can also be used to generate Ninja rules instead of Makefiles.

CMake Generators: https://cmake.org/cmake/help/latest/manual/cmake-generators.... Meson: https://mesonbuild.com/ Bazel: https://bazel.build/

GNOME and Meson: https://wiki.gnome.org/Initiatives/GnomeGoals/MesonPorting

Re:Allowing CMake functions to return(value) by rumanator on Wednesday August 19, 2020 @01:55AM (#24207561)
> Autotools generate a Makefile project

That's what all build systems do. Hell, cmake's description is "cross-platform Makefile generator".

The rationale is quite obvious: the DAG part is solved problem. The hard part is extracting platform-dependent info, perform validations, and use it to generate the DAG.

And a Makefile is a DAG.

Re:Allowing CMake functions to return(value) by bluGill on Tuesday August 18, 2020 @09:28PM (#24206273)
I use modern cmake as much as I can, but I often run into things that cmake cannot do without a function. Most of our custom code generation tools for example, cmake doesn't know how to turn them into c++ without a function (which is in turn a wrapper of add custom command /target

I've gotten rid of several of our pre modern cmake functions, but more remain.

Re:Allowing CMake functions to return(value) by jcelerier on Wednesday August 19, 2020 @03:59AM (#24208192)
> This is a red flag. If you're hoping to write functions with cmake... You're doing it wrong. Very wrong. You add targets, and you add rules to the target. If you find yourself wanting to do anything other than this then you should take a step back and read a modern cmake tutorial again, because odds are you're doing it wrong.

so how do you propose to do code generation, parsing stuff like /etc/lsb_release to work around a bug for people building under ubuntu 16.04, or that kind of thing ?

Re:Allowing CMake functions to return(value) by sebastos on Tuesday August 18, 2020 @03:38PM (#24203340)
Link to a free and open modern cmake tutorial?
Re:Allowing CMake functions to return(value) by rumanator on Tuesday August 18, 2020 @03:42PM (#24203389)
You can pretty much google for "modern cmake tutorial" to get a long list of tutorials on how to write target-based cmake projects.
Re:Allowing CMake functions to return(value) by moonbug on Tuesday August 18, 2020 @03:50PM (#24203484)
spoiler: they're all crap.
Re:Allowing CMake functions to return(value) by nickez on Tuesday August 18, 2020 @04:56PM (#24204242)
And worse, they all achieve the same goal in different ways...
Re:Allowing CMake functions to return(value) by MaxBarraclough on Wednesday August 19, 2020 @05:06AM (#24208530)
A great point. There should a single standard and well-documented way to do things. The documentation should be official, the user should not be expected to trawl the blogosphere and piece together the knowledge they need. There should be plenty of complete examples.

Ideally the official Find... packages should not make use of deprecated CMake functionality, they should be actively maintained to follow the current best-practices, so that they can serve as examples of the right way to do it.

As I rambled about in my longer comment yesterday, this kind of work shouldn't require you to think, it should just be an exercise in applying boring, samey, dependable boilerplate.

Re:Allowing CMake functions to return(value) by sebastos on Tuesday August 18, 2020 @05:02PM (#24204295)