Comment by nanolith
10 months ago
It is true that C does not have a single tool enforced by the language platform.
But, there is plenty of excellent documentation available for using build and packaging tools of your choice to work similarly to Cargo.
In practice this comes off as a rather motte and bailey argument. "There's plenty of ways to make building C as easy as Cargo." OK, show me. "Well, you use this and do this and this." OK, that didn't work because of $THIS_REASON. "Oh that's easy to fix you just do this thing." {Repeat several times.} OK, I guess it's working now, but there's no way that was as easy as cargo. "What are you talking about, it was a series of easy steps that only involved reading dozens of pages of docs, a couple of not-quite-current-but-close-to-accurate Stack Overflow posts, upgrading to the correct version of the build tool, and directly posting on a couple of mailing lists!"
To be honest, the moment I have to evaluate a dozen tools, pick one, and use it, even if that tool does manage to be "$TOOL build" and literally nothing else which I don't think is anywhere near something people can count on in the C world, it has already proved to be harder than "cargo build".
First, I did not say anywhere in my reply, "as easy as Cargo". I said "similar to Cargo." Huge difference.
C has been around for over 50 years. It predates many of the modern "everything including the kitchen sink" style of language platforms. It has spread across so many platforms and uses that a Cargo like integration is not going to happen.
But, this does not mean that build, package, and install tools don't exist. If you want me to provide you with a single tool to rule them all, well, that's impossible for the reasons I listed above. But, depending on which platforms you care about and which features you want, there are plenty of existing tools.
If your goalpost is "change C to be like Rust and have a single build tool", then that's impossible. If your goalpost is "find me a tool that does X, Y, and Z", then there that is certainly possible. There are Cargo clones for C/C++ that work just fine.
While less aggressively "motte & bailey" then the sibling reply from PH95VuimJjqBqy, you basically proved my point rather than disproving it. You can't name a single tool that is as easy as cargo. I know that's because if you do there will be a dozen replies from users of that tool going "Oh, my, no it was quite difficult to set up, ultimately didn't work for us, and we had to abandon it for this other tool."
I do not understand the mindset that believes that if you explain why a problem is hard, it is somehow no longer hard, or somehow it no longer "counts". Yes. C is a sprawling multi-decade monster that never started out with a good build tool because it was just too early in history for that to be the sort of concern it is now. I certainly wouldn't dream of claiming there aren't reasons C is complicated to build, even ones that are generally good when you consider the entire history of the project. The world would not be better off if we had somehow waited for C to be perfect before using it, because it is precisely the act of using C that has taught us the ways to improve other languages. I credit the platform for that, I do not deduct points.
However, none of that changes the fact that it is a bear to build anything non-trivial in C, and the simple act of reading a list of your tool options is literally already harder than "cargo build". I basically don't believe by assertion that there are tools that can solve this with just a relatively dainty (by C standards) little declarative file and a single command execution. I'm sure they have a "happy path" that looks like that but as soon as I leave it it'll explode in complexity, and I'm basically guaranteed to leave it at some point for any non-trivial project.
14 replies →
> If your goalpost is "change C to be like Rust and have a single build tool", then that's impossible. If your goalpost is "find me a tool that does X, Y, and Z", then there that is certainly possible. There are Cargo clones for C/C++ that work just fine.
My goal is to be able to build my project with as little effort as possible. "Effort" includes evaluating different tools and reading their documentation.
When selecting a language to write a new project in, the history of the language isn't something I care about.
6 replies →
There is a price to easy. In my experience, cargo build times tend to be soulkillingly long. But I don't like waiting more than a few hundred ms for incremental builds. So for me, cargo build is actually harder than make to attain an enjoyable build system.
Make is annoying but Makefile issues are found quickly and easily when running `find . | entr -c make` and saving the source file often.
Build times have nothing to do with cargo but with the language itself. They're not the "price to easy", it's the price of the static compiler checks.
10 replies →
> To be honest, the moment I have to evaluate a dozen tools, pick one, and use it, even if that tool does manage to be "$TOOL build" and literally nothing else which I don't think is anywhere near something people can count on in the C world, it has already proved to be harder than "cargo build".
C will build and run in places rust can't.
so I should argue C is better because in my chosen metric (diversity of platforms) it wins.
Thank you for that demonstration of the motte & bailey argument.
1 reply →
> But, there is plenty of excellent documentation available for using build and packaging tools of your choice to work similarly to Cargo.
Sure, and there's plenty of documentation for Cargo too. Or at least I assume there is, but I've never had reason to read it.
Do you see the problem with what you're saying?
> Do you see the problem with what you're saying?
No, I don't. At some point, you read documentation, or a tutorial, or example code to use Cargo.
These exist for other build and package systems, some of which are clones of Cargo.
If you want a white glove experience (e.g. cargo new), such systems exist as well for C. Cargo is nothing new.
> At some point, you read documentation, or a tutorial, or example code to use Cargo.
...and the point you're pretending you don't understand, is that the parts I needed were simple enough that I now have it memorized.
> These exist for other build and package systems, some of which are clones of Cargo.
These exist... but you're not going to even mention any, because you're aware that they aren't equivalent. They don't ship with your C compiler, they don't work for every C project without configuration, etc.
I'm open to the possibility that there are better C build tools than the ones I've been using, but they literally cannot be as easy as Cargo because they're hampered by supporting decades of legacy features (and mistakes) of C, the fact that none of them are the standard, etc.
And look, no hate on C. It's done its job for decades and if we're measuring by the problems that have been solved in a language, it's arguably the best language in existence. I've certainly chosen it for a lot of my own projects. But do you really think it's perfect? Are you really unwilling to admit that there is anything newer languages do better?
1 reply →