One thing I'm missing in the Rust ecosystem of bindings to C libraries is easy conditional compilation based on the build-time library version. Something like the GTK_CHECK_VERSION() macros in C.

In Rust bindings, it's common to expose some baseline version API, then have feature flags to expose (and depend on) newer versions of the library. But there's no simple way to do, as a downstream user:

#[cfg(have_gtk_4_12)]
use_new_api();
#[cfg(not(have_gtk_4_12))]
fallback_with_old_api();

#rust

Related: how do distros track these build-time dependency checks? E.g. my app did a build-time check and used the GTK < 4.12 code path, then the distro updated GTK to 4.12, so now my app needs to be rebuilt to take advantage of the new API. How is this tracked?

I guess this question is more relevant for rolling-release distros, but it's very possible for a build-time check to test for a minor version which would be updated even in a non-rolling-release distro.

#linux #fedora

@YaLTeR well, I suppose they put gtk as a dependency of the program, and then they rebuild all its dependents, although probably it's not quite as simple as I'm thinking here. I can totally imagine, for example, arch, doing that

@esoteric_programmer I'd expect the opposite, i.e. dependencies aren't tracked this precisely, and updates to shared libraries never cause a rebuild of their dependents. Doing otherwise will lose much of the benefit provided by shared libraries. Also, if rebuilding dependents was a common practice, there wouldn't be such backslash against statically linked languages like Rust and Go.

@YaLTeR

@minoru @YaLTeR well, either that or soname stuff would be done to keep the program running, because if it's linked against a specific gtk version and that's no longer in the filesystem, things can break. And yeah, I'm imagining something like this happening because the rust and go model popularized this practice, but yeah, probably not.