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
This commit is contained in:
Michael Paquier 2022-02-14 10:40:34 +09:00
parent 3f74daa8df
commit 1d084fba1b
5 changed files with 63 additions and 5 deletions

55
configure vendored
View File

@ -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 :

View File

@ -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

View File

@ -350,7 +350,7 @@ XGETTEXT = @XGETTEXT@
GZIP = gzip
BZIP2 = bzip2
LZ4 = lz4
LZ4 = @LZ4@
DOWNLOAD = wget -O $@ --no-use-server-timestamps
#DOWNLOAD = curl -o $@

View File

@ -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 = (

View File

@ -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 = (