From 1d084fba1bd144538dfea22c322f1c148c821148 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 14 Feb 2022 10:40:34 +0900 Subject: [PATCH] Add ./configure check for "lz4" command Some environments may compile with --with-lz4 while the command "lz4" goes missing, causing two failures in the TAP tests of pg_verifybackup (008_untar.pl and 010_client_untar.pl) as the code assumed that the command always existed with a hardcoded value in src/Makefile.global. Rather than this method, this adds a ./configure check based on PGAC_PATH_PROGS() to find automatically the command and get an absolute path to it. Both tests need to be adjusted for the case where the command does not exist, actually, as Makefile.global would set now LZ4 to an empty value in this case. The TAP tests of pg_receivewal already do that. Per report from buildfarm member copperhead, as an effect of dab2984. The origin of the failure is actually babbbb5 that did not centralize the check for the existence of a "lz4" command at ./configure to shave a few cycles. Note that one just needs to tweak an environment to move "lz4" out of the way to reproduce the problem, which is what I did to test this change. Per discussion with Robert Haas, Tom Lane, Andres Freund and myself. Discussion: https://postgr.es/m/Ygc51WVAFGocSu4h@paquier.xyz --- configure | 55 +++++++++++++++++++ configure.ac | 1 + src/Makefile.global.in | 2 +- src/bin/pg_verifybackup/t/008_untar.pl | 5 +- src/bin/pg_verifybackup/t/010_client_untar.pl | 5 +- 5 files changed, 63 insertions(+), 5 deletions(-) diff --git a/configure b/configure index 0d52af5529..9305555658 100755 --- a/configure +++ b/configure @@ -650,6 +650,7 @@ CFLAGS_ARMV8_CRC32C CFLAGS_SSE42 have_win32_dbghelp LIBOBJS +LZ4 UUID_LIBS LDAP_LIBS_BE LDAP_LIBS_FE @@ -13832,6 +13833,60 @@ fi fi +if test -z "$LZ4"; then + for ac_prog in lz4 +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_LZ4+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $LZ4 in + [\\/]* | ?:[\\/]*) + ac_cv_path_LZ4="$LZ4" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_LZ4="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +LZ4=$ac_cv_path_LZ4 +if test -n "$LZ4"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LZ4" >&5 +$as_echo "$LZ4" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$LZ4" && break +done + +else + # Report the value of LZ4 in configure's output in all cases. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LZ4" >&5 +$as_echo_n "checking for LZ4... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LZ4" >&5 +$as_echo "$LZ4" >&6; } +fi + if test "$with_lz4" = yes; then for ac_header in lz4.h do : diff --git a/configure.ac b/configure.ac index 2afc822b12..16167329fc 100644 --- a/configure.ac +++ b/configure.ac @@ -1485,6 +1485,7 @@ failure. It is possible the compiler isn't looking in the proper directory. Use --without-zlib to disable zlib support.])]) fi +PGAC_PATH_PROGS(LZ4, lz4) if test "$with_lz4" = yes; then AC_CHECK_HEADERS(lz4.h, [], [AC_MSG_ERROR([lz4.h header file is required for LZ4])]) fi diff --git a/src/Makefile.global.in b/src/Makefile.global.in index 05c54b27de..9dcd54fcbd 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -350,7 +350,7 @@ XGETTEXT = @XGETTEXT@ GZIP = gzip BZIP2 = bzip2 -LZ4 = lz4 +LZ4 = @LZ4@ DOWNLOAD = wget -O $@ --no-use-server-timestamps #DOWNLOAD = curl -o $@ diff --git a/src/bin/pg_verifybackup/t/008_untar.pl b/src/bin/pg_verifybackup/t/008_untar.pl index 03f98966bd..6927ca4c74 100644 --- a/src/bin/pg_verifybackup/t/008_untar.pl +++ b/src/bin/pg_verifybackup/t/008_untar.pl @@ -54,8 +54,9 @@ for my $tc (@test_configuration) skip "$method compression not supported by this build", 3 if ! $tc->{'enabled'}; skip "no decompressor available for $method", 3 - if exists $tc->{'decompress_program'} && - !defined $tc->{'decompress_program'}; + if exists $tc->{'decompress_program'} + && (!defined $tc->{'decompress_program'} + || $tc->{'decompress_program'} eq ''); # Take a server-side backup. my @backup = ( diff --git a/src/bin/pg_verifybackup/t/010_client_untar.pl b/src/bin/pg_verifybackup/t/010_client_untar.pl index 159a4f86df..3616529390 100644 --- a/src/bin/pg_verifybackup/t/010_client_untar.pl +++ b/src/bin/pg_verifybackup/t/010_client_untar.pl @@ -53,8 +53,9 @@ for my $tc (@test_configuration) skip "$method compression not supported by this build", 3 if ! $tc->{'enabled'}; skip "no decompressor available for $method", 3 - if exists $tc->{'decompress_program'} && - !defined $tc->{'decompress_program'}; + if exists $tc->{'decompress_program'} + && (!defined $tc->{'decompress_program'} + || $tc->{'decompress_program'} eq ''); # Take a client-side backup. my @backup = (