On Wed, Mar 09 2022, Junio C Hamano wrote: > Eric Sunshine <sunshine@xxxxxxxxxxxxxx> writes: > >> On Tue, Mar 8, 2022 at 6:58 PM Eric Sunshine <sunshine@xxxxxxxxxxxxxx> wrote: >>> On Tue, Mar 8, 2022 at 6:55 PM Eric Sunshine <sunshine@xxxxxxxxxxxxxx> wrote: >>> > On Tue, Mar 8, 2022 at 6:44 PM Carlo Marcelo Arenas Belón >>> > <carenas@xxxxxxxxx> wrote: >>> > > + local _GLIBC_VERSION=$(getconf GNU_LIBC_VERSION 2>/dev/null) >>> > > + if echo "$_GLIBC_VERSION" | cut -d. -f1-2 | >>> > > + awk '{ if ($2 - 2.34 < 0) exit 1 }' >>> > >>> > No need for `cut` since `awk` can accomplish the same by itself. >>> > >>> > if echo "$_GLIBC_VERSION" | awk '/^glibc / { if ($2 - 2.34 < 0) exit 1 }' >>> > >>> > should work, I would think. >>> >>> Nevermind, I forgot you want to better support "2.34.9000" matches. >>> Though, awk should still be able to do so on its own, one would >>> expect, but not too important. >> >> 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 }' > > If we are losing "cut" (which I think is a good thing to do), we > probably can lose the pipe, too and refer to $_GLIBC_VERSION as an > element in ARGV[] and make the command used as "if" condition to a > single "awk" script? > > 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: diff --git a/Makefile b/Makefile index 6f0b4b775fe..f566c9c5df2 100644 --- a/Makefile +++ b/Makefile @@ -732,6 +732,7 @@ TEST_BUILTINS_OBJS += test-parse-pathspec-file.o TEST_BUILTINS_OBJS += test-partial-clone.o TEST_BUILTINS_OBJS += test-path-utils.o TEST_BUILTINS_OBJS += test-pcre2-config.o +TEST_BUILTINS_OBJS += test-glibc-config.o TEST_BUILTINS_OBJS += test-pkt-line.o TEST_BUILTINS_OBJS += test-prio-queue.o TEST_BUILTINS_OBJS += test-proc-receive.o diff --git a/t/helper/test-glibc-config.c b/t/helper/test-glibc-config.c new file mode 100644 index 00000000000..3c3cc2a8ba5 --- /dev/null +++ b/t/helper/test-glibc-config.c @@ -0,0 +1,12 @@ +#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 +} diff --git a/t/helper/test-tool.c b/t/helper/test-tool.c index e6ec69cf326..c01422f5cab 100644 --- a/t/helper/test-tool.c +++ b/t/helper/test-tool.c @@ -35,6 +35,7 @@ static struct test_cmd cmds[] = { { "genrandom", cmd__genrandom }, { "genzeros", cmd__genzeros }, { "getcwd", cmd__getcwd }, + { "glibc-config", cmd__glibc_config }, { "hashmap", cmd__hashmap }, { "hash-speed", cmd__hash_speed }, { "index-version", cmd__index_version }, diff --git a/t/helper/test-tool.h b/t/helper/test-tool.h index 20756eefdda..dc061bc7833 100644 --- a/t/helper/test-tool.h +++ b/t/helper/test-tool.h @@ -26,6 +26,7 @@ int cmd__fast_rebase(int argc, const char **argv); int cmd__genrandom(int argc, const char **argv); int cmd__genzeros(int argc, const char **argv); int cmd__getcwd(int argc, const char **argv); +int cmd__glibc_config(int argc, const char **argv); int cmd__hashmap(int argc, const char **argv); int cmd__hash_speed(int argc, const char **argv); int cmd__index_version(int argc, const char **argv); I mainly copied the pcre2-config template I added in 95ca1f987ed (grep/pcre2: better support invalid UTF-8 haystacks, 2021-01-24), which likewise would have been quite a bit more complex to do from non-C.