Thread with 44 posts

jump to expanded post

‪the thing about build scripts is that nobody cares about them. you write your project in c, c++, rust, whatever… some language you know well and enjoy using. but in order to actually configure/compile/link/package it, inevitably you need Some Other Language to help you‬

Open thread at this post

‪you don't care about the beauty of your build system. build systems are hell. you just want it to work. almost always the resulting code is far from beautiful. if it is readable and well-structured, it probably hasn't made contact with multiple platforms or configurations yet‬

Open thread at this post

‪so, build scripts are the kind of unloved, neglected code where bugs too easily hide. but i think we collectively make this worse for ourselves by writing this code in unloved languages we don't or can't fully understand. python is just about acceptable. but bash? that's arcane.‬

Open thread at this post

‪this may be unpopular, but cmake's configuration language is also arcane in my opinion. my experience with reading its documentation trying to figure out what code does and how to do anything vaguely complex with it is only pain. but that's an aside. it's okay for simple projects‬

Open thread at this post
R , @r@glauca.space
(open profile)

@hikari for C projects we used to use hand-written makefiles derived from a blend of devkitPro's makefile system combined with knowledge we had picked up from the O'Reilly gnu make book, and it just worked. nowadays we tend to use either Rust or we get really jaded and use the "fuck it" build system of a "build.sh" containing just build commands without any dependency tracking

Open remote post (opens in a new window)
Jordan , @jrose@belkadan.com
(open profile)

@hikari “but they have! check out nushell or fish! or that other one!” you want me to learn another language and put it in my repository? making it a build dependency? yeah right

(which is why the best answer so far is “make your package manager do it”, but that’s definitely only an 80/20 solution)

Open remote post (opens in a new window)
genders: ♾️, 🟪⬛🟩; Soni L. , @SoniEx2@chaos.social
(open profile)

@jrose @hikari you can make shell unusable with the help of protobuf main,

(protobuf shell was supposed to integrate with protobuf main to make it more usable, but we never made a protobuf shell. we did, however, make exactly one executable that uses the protobuf main calling convention over regular linux spawn, because shoving raw binary data into argv was too exciting to pass up!)

Open remote post (opens in a new window)
genders: ♾️, 🟪⬛🟩; Soni L. , @SoniEx2@chaos.social
(open profile)

@jrose @hikari ah, yeah... protobuf is particularly suited to this due to its strong backwards and forwards compatibility design, further we can embed the schema into the binary so you can compare the one in the binary with the one in the protobuf shell script and whatnot. which should help, we think.

protobuf main still allows you to redirect stdin tho. =^-^=

Open remote post (opens in a new window)
mia , @mia@movsw.0x0.st
(open profile)

@hikari what strikes me every time with software projects that use cmake is how messy and unstructured the build system files are. everyone does it a little differently, and there’s near-infinite potential for oversights.

how little effort is usually put into cleanliness is proof that cmake is user-hostile by design.

Open remote post (opens in a new window)
mia , @mia@movsw.0x0.st
(open profile)

@littlefox @hikari almost every time i ran into portability issues or wrong assumptions about some platform, it was solely the build system’s fault. the code itself was usually portable enough.

if a build system makes devs deal with platform abstractions themselves, it’s not a cross-platform build system. it’s not even a “linux” build system, assuming the dev uses some linux distro. it only works reliably on the dev’s machine.

Open remote post (opens in a new window)
lohikäärmekettu Saphira :therian: , @littlefox@gotosocial-dev.svc.0x0a.network
(open profile)

@mia @hikari hm, I beg to differ - well-written CMake does not really contain nasty platform stuff, if any at all

All the dependency resolution is either done via cmake-included Find$Dependency modules or, as automated fallback, stuff like pkgconfig and specifying unfound dependencies yourself is also possible by default (though it could be nicer).

I would be curious though, what kinda problems you see/saw here

Open remote post (opens in a new window)
mia , @mia@movsw.0x0.st
(open profile)

@littlefox @hikari
Find modules are often broken (e.g. finding the dependency but not picking up libraries that need to be linked), honestly the whole idea of cmake having its own mechanism is bad
* pkg-config support is poorly implemented (and discouraged)
* you can’t generate .pc files from cmake especially if you’re shipping static libraries because the information you need to do that correctly is not accessible
* almost no one uses GNUInstallDirs, lots of hardcoded paths
* dependencies tied to user-facing options cannot be implemented reliably and in a fail-early manner
* cache invalidation is unreliable

just some examples of practical problems i ran into with cmake. i haven’t used it often and try to avoid packaging projects using it.

Open remote post (opens in a new window)