On Fri, Mar 11 2022, Eric Sunshine wrote: > On Wed, Mar 9, 2022 at 3:14 PM Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> wrote: >> On Wed, Mar 09 2022, Junio C Hamano wrote: >> > Eric Sunshine <sunshine@xxxxxxxxxxxxxx> writes: >> >> This seems to work, though it's getting a bit verbose: >> >> >> >> awk '/^glibc / { split($2,v,"."); if (sprintf("%s.%s", v[1], v[2]) >> >> - 2.34 < 0) exit 1 }' >> > >> > In general it is a good discipline to question a pipeline that >> > preprocesses input fed to a script written in a language with full >> > programming power like awk and perl (and to lessor extent, sed) to >> > see if we can come up with a simpler solution without pipeline >> > helping to solve what these languages are invented to solve, and I >> > very much appreciate your exploration ;-) >> >> I agree :) But the first language we've got here is C. Rather than >> fiddle around with getconf, awk/sed etc. why not just the rather >> trivial: >> >> +#include "test-tool.h" >> +#include "cache.h" >> + >> +int cmd__glibc_config(int argc, const char **argv) >> +{ >> +#ifdef __GNU_LIBRARY__ >> + printf("%d\n%d\n", __GLIBC__, __GLIBC_MINOR__); >> + return 0; >> +#else >> + return 1; >> +#endif >> +} > > It feels overkill to add this just for this one case which is > otherwise done easily enough with existing shell tools. > > That said, perhaps I'm missing something, but I don't see how this > solution helps us get away from the need for `expr`, `awk`, or `perl` > since one of those languages would be needed to perform the arithmetic > comparison (checking if glibc is >= 2.34). In this case they're \n delimited, so we can use the shell's native whitespace splitting to $(())-compare $1 and $2. But probably better is to just amend that to call it as "test-tool libc is-glibc-2.34-or-newer" or whatever. Then just do: if (__GLIBC__ > 2 || (__GLIBC__ == 2 && 34 >= __GLIBC_MINOR__)) return 0; return 1;