pkgsrc/regress/infra-unittests/gnu-configure-strict.sh
2020-05-23 12:11:33 +00:00

511 lines
13 KiB
Bash

#! /bin/sh
# $NetBSD: gnu-configure-strict.sh,v 1.5 2020/05/23 12:11:33 rillig Exp $
#
# Tests for GNU_CONFIGURE_STRICT handling in mk/configure/gnu-configure.mk.
#
set -eu
. './test.subr'
test_case_set_up() {
create_file 'setup.mk' <<-EOF
ECHO= echo
FIND= find
GREP= grep
SED= sed
SORT= sort
TR= tr
RUN= @set -eu; # be extra strict
ERROR_MSG= echo 'error:'
GNU_CONFIGURE_PREFIX= unused-GNU_CONFIGURE_PREFIX
PREFIX= unused-PREFIX
OPSYS= NetBSD
WRKDIR= $PWD
WRKSRC= $PWD
CONFIGURE_SCRIPT?= ./configure
EOF
}
if test_case_begin 'single configure'; then
create_file 'testcase.mk' <<-EOF
GNU_CONFIGURE_STRICT= yes
CONFIGURE_DIRS= .
CONFIGURE_ARGS= --enable-known
CONFIGURE_ARGS+= --disable-known
CONFIGURE_ARGS+= --with-known
CONFIGURE_ARGS+= --without-known
.include "setup.mk"
.include "mk/configure/gnu-configure.mk"
EOF
create_file 'configure' <<-EOF
enable_known
with_known
EOF
run_bmake 'testcase.mk' '_check-unknown-configure-options' \
1> "$tmpdir/output" 2>&1 \
&& exitcode=0 || exitcode=$?
assert_that "$tmpdir/output" --file-is-empty
test_case_end
fi
if test_case_begin 'neither --enable nor --with given'; then
# Make sure that there is no shell syntax error in the for loop.
#
# This test also covers the case where the configure script has
# some options that are not mentioned in CONFIGURE_ARGS.
create_file 'testcase.mk' <<-EOF
GNU_CONFIGURE_STRICT= yes
CONFIGURE_DIRS= .
.include "setup.mk"
.include "mk/configure/gnu-configure.mk"
EOF
create_file 'configure' <<-EOF
enable_known
with_known
EOF
run_bmake 'testcase.mk' '_check-unknown-configure-options' \
1> "$tmpdir/output" 2>&1 \
&& exitcode=0 || exitcode=$?
assert_that "$tmpdir/output" --file-is-empty
test_case_end
fi
if test_case_begin 'some unknown options'; then
create_file 'testcase.mk' <<-EOF
GNU_CONFIGURE_STRICT= yes
CONFIGURE_DIRS= .
CONFIGURE_ARGS= --enable-unknown-1
CONFIGURE_ARGS+= --disable-unknown-2
CONFIGURE_ARGS+= --with-unknown-3
CONFIGURE_ARGS+= --without-unknown-4
.include "setup.mk"
.include "mk/configure/gnu-configure.mk"
EOF
create_file 'configure' <<-EOF
enable_known
with_known
EOF
run_bmake 'testcase.mk' '_check-unknown-configure-options' \
1> "$tmpdir/output" 2>&1 \
&& exitcode=0 || exitcode=$?
assert_that "$exitcode" --equals '1'
assert_that "$tmpdir/output" --file-is-lines \
'error: [gnu-configure.mk] option --enable-unknown-1 not found in ./configure' \
'error: [gnu-configure.mk] option --disable-unknown-2 not found in ./configure' \
'error: [gnu-configure.mk] option --with-unknown-3 not found in ./configure' \
'error: [gnu-configure.mk] option --without-unknown-4 not found in ./configure' \
'*** Error code 1' \
'' \
'Stop.' \
"$make: stopped in $PWD"
test_case_end
fi
if test_case_begin 'unknown options in multiple configures'; then
create_file 'testcase.mk' <<-EOF
GNU_CONFIGURE_STRICT= yes
CONFIGURE_DIRS= .
CONFIGURE_ARGS= --enable-main
CONFIGURE_ARGS+= --with-main
CONFIGURE_ARGS+= --enable-sub1
CONFIGURE_ARGS+= --with-sub1
CONFIGURE_ARGS+= --enable-sub2
CONFIGURE_ARGS+= --with-sub2
.include "setup.mk"
.include "mk/configure/gnu-configure.mk"
EOF
create_file 'configure' <<-EOF
enable_main
with_main
EOF
create_file 'subdir1/configure' <<-EOF
enable_sub1
EOF
create_file 'subdir2/configure' <<-EOF
with_sub2
EOF
run_bmake 'testcase.mk' '_check-unknown-configure-options' \
1> "$tmpdir/output" 2>&1 \
&& exitcode=0 || exitcode=$?
assert_that "$exitcode" --equals '1'
assert_that "$tmpdir/output" --file-is-lines \
'error: [gnu-configure.mk] option --enable-sub2 not found in ./configure ./subdir1/configure ./subdir2/configure' \
'error: [gnu-configure.mk] option --with-sub1 not found in ./configure ./subdir1/configure ./subdir2/configure' \
'*** Error code 1' \
'' \
'Stop.' \
"$make: stopped in $PWD"
test_case_end
fi
if test_case_begin 'realistic example from gettext-tools-0.20.2 as of 2020-05-21'; then
# Each of the subdirectories flags several options as unrecognized,
# but in summary, each of the given options is used in at least one
# subdirectory, which in this case is gettext-tools.
create_file './configure' <<-EOF
enable_option_checking
enable_silent_rules
enable_dependency_tracking
enable_java
enable_csharp
enable_largefile
enable_threads
enable_shared
enable_static
with_pic
enable_fast_install
with_aix_soname
with_gnu_ld
with_sysroot
enable_libtool_lock
enable_nls
enable_rpath
with_libiconv_prefix
enable_c__
with_included_gettext
with_libintl_prefix
enable_cross_guesses
enable_relocatable
enable_libasprintf
enable_curses
with_libncurses_prefix
with_libtermcap_prefix
with_libxcurses_prefix
with_libcurses_prefix
enable_namespacing
with_libtextstyle_prefix
enable_openmp
enable_acl
with_included_libunistring
with_libunistring_prefix
with_included_libxml
with_libxml2_prefix
with_included_regex
with_emacs
with_lispdir
with_git
with_cvs
with_bzip2
with_xz
EOF
create_file './gettext-runtime/configure' <<-EOF
enable_option_checking
enable_silent_rules
enable_dependency_tracking
enable_java
enable_csharp
enable_largefile
enable_threads
enable_shared
enable_static
with_pic
enable_fast_install
with_aix_soname
with_gnu_ld
with_sysroot
enable_libtool_lock
enable_nls
enable_rpath
with_libiconv_prefix
enable_c__
with_included_gettext
with_libintl_prefix
enable_cross_guesses
enable_relocatable
enable_libasprintf
EOF
create_file './gettext-runtime/libasprintf/configure' <<-EOF
enable_option_checking
enable_silent_rules
enable_dependency_tracking
enable_shared
enable_static
with_pic
enable_fast_install
with_aix_soname
with_gnu_ld
with_sysroot
enable_libtool_lock
enable_cross_guesses
EOF
create_file './gettext-tools/configure' <<-EOF
enable_option_checking
enable_silent_rules
enable_dependency_tracking
enable_java
enable_csharp
enable_largefile
enable_threads
enable_shared
enable_static
with_pic
enable_fast_install
with_aix_soname
with_gnu_ld
with_sysroot
enable_libtool_lock
enable_nls
enable_rpath
with_libiconv_prefix
enable_c__
with_included_gettext
with_libintl_prefix
with_installed_libtextstyle
with_libtextstyle_prefix
with_installed_csharp_dll
enable_openmp
enable_cross_guesses
enable_acl
with_included_libunistring
with_libunistring_prefix
with_included_libxml
with_libxml2_prefix
enable_relocatable
with_included_regex
with_emacs
with_lispdir
with_git
with_cvs
with_bzip2
with_xz
EOF
create_file './gettext-tools/examples/configure' <<-EOF
enable_option_checking
enable_silent_rules
enable_nls
EOF
create_file './libtextstyle/configure' <<-EOF
enable_option_checking
enable_silent_rules
enable_dependency_tracking
enable_largefile
enable_shared
enable_static
with_pic
enable_fast_install
with_aix_soname
with_gnu_ld
with_sysroot
enable_libtool_lock
enable_cross_guesses
enable_rpath
with_libiconv_prefix
enable_curses
with_libncurses_prefix
with_libtermcap_prefix
with_libxcurses_prefix
with_libcurses_prefix
enable_namespacing
EOF
create_file 'testcase.mk' <<-EOF
GNU_CONFIGURE_STRICT= yes
CONFIGURE_DIRS= .
CONFIGURE_ARGS+= --disable-csharp
CONFIGURE_ARGS+= --disable-java
CONFIGURE_ARGS+= --with-included-libcroco
CONFIGURE_ARGS+= --without-git
CONFIGURE_ARGS+= --with-xz
CONFIGURE_ARGS+= --without-included-gettext
CONFIGURE_ARGS+= --without-emacs
CONFIGURE_ARGS+= --disable-openmp
CONFIGURE_ARGS+= --prefix=/home/pbulk/pkg
CONFIGURE_ARGS+= --build=x86_64--netbsd
CONFIGURE_ARGS+= --host=x86_64--netbsd
CONFIGURE_ARGS+= --infodir=/home/pbulk/pkg/info
CONFIGURE_ARGS+= --mandir=/home/pbulk/pkg/man
.include "setup.mk"
.include "mk/configure/gnu-configure.mk"
EOF
run_bmake 'testcase.mk' '_check-unknown-configure-options' \
1> "$tmpdir/output" 2>&1 \
&& exitcode=0 || exitcode=$?
# There is one option that is unknown in all configure scripts.
#
# This was already reported by the implementation before May
# 2020. That check was expensive to run though, therefore it
# had to be run manually.
#
# In May 2019, when GNU_CONFIGURE_STRICT=no was added to the
# package, the check reported: "good: all 8 options are used
# somewhere". With the update to 0.20.2, the option had been
# removed but the check was never run again. This made the
# check pretty useless since detecting outdated definitions was
# its primary purpose.
#
# In May 2020, if the old check had been run, it reported:
# "option --with-included-libcroco is unknown in all 6 configure
# scripts".
#
# The May 2020 implementation of this check does not require
# packages with multiple configure scripts to set this variable,
# which immediately flags these outdated definitions instead of
# hiding them just because it had worked some day in the past.
# Furthermore, it is very cheap to run since it statically
# analyzes the configure scripts instead of running them.
#
# This approach also has its drawbacks though. It does not
# detect cases in which only some of the configure scripts are
# actually used for a build but the unknown option is defined in
# one of the unused configure scripts. This case happens less
# often than a regular package update, therefore it is
# acceptable.
assert_that "$exitcode" --equals '1'
assert_that "$tmpdir/output" --file-is-lines \
'error: [gnu-configure.mk] option --with-included-libcroco not found in ./configure ./gettext-runtime/configure ./gettext-runtime/libasprintf/configure ./gettext-tools/configure ./gettext-tools/examples/configure ./libtextstyle/configure' \
'*** Error code 1' \
'' \
'Stop.' \
"$make: stopped in $PWD"
test_case_end
fi
if test_case_begin 'configure script without enable_http variable'; then
# textproc/opensp as of 2020-05-22 has a configure script
# generated by Autoconf 2.59. That configure script recognizes
# --enable-http but does not have a corresponding variable
# definition in a line of their own.
#
# The word --enable-http appears twice in that file. Once in the
# --help text, and once in a shell comment saying "Check whether
# --enable-http or --disable-http was given". The shell comment
# is too unreliable, and the help text only contains either enable
# or disable, but not both. Therefore the simplest solution is to
# scan for the common pattern ${enable_http+set}.
# In lang/mono4, the option name "libgc" creatively differs from
# the name "gc" that is mentioned in the help text:
#
# AC_ARG_WITH(libgc,
# [ --with-gc=...],
# [libgc=$with_gc],
# [libgc=$libgc_default]
# )
#
# This way, even though --with-gc is documented in the help,
# specifying it triggers the "unrecognized options: --with-gc"
# warning 3 times, once for each configure script.
create_file 'configure' <<-EOF
if test "\${enable_http+set}" = set; then
:
fi
if test "\${enable_nls+set}" = set; then
:
fi
EOF
create_file 'testcase.mk' <<-EOF
GNU_CONFIGURE_STRICT= yes
CONFIGURE_DIRS= .
CONFIGURE_ARGS+= --enable-http
CONFIGURE_ARGS+= --enable-nls
.include "setup.mk"
.include "mk/configure/gnu-configure.mk"
EOF
run_bmake 'testcase.mk' '_check-unknown-configure-options' \
1> "$tmpdir/output" 2>&1 \
&& exitcode=0 || exitcode=$?
assert_that "$exitcode" --equals '0'
assert_that "$tmpdir/output" --file-is-empty
test_case_end
fi
if test_case_begin 'custom CONFIGURE_SCRIPT in relative directory'; then
create_file 'pkgname-1.0/configure.gnu' <<-EOF
if test "\${enable_option+set}" = set; then :; fi
EOF
mkdir 'build'
create_file 'testcase.mk' <<-EOF
GNU_CONFIGURE_STRICT= yes
CONFIGURE_DIRS= build
CONFIGURE_SCRIPT= ../pkgname-1.0/configure.gnu
CONFIGURE_ARGS= --enable-option
.include "setup.mk"
.include "mk/configure/gnu-configure.mk"
EOF
run_bmake 'testcase.mk' '_check-unknown-configure-options' \
1> "$tmpdir/output" 2>&1 \
&& exitcode=0 || exitcode=$?
assert_that "$exitcode" --equals '0'
assert_that "$tmpdir/output" --file-is-empty
test_case_end
fi
if test_case_begin 'custom CONFIGURE_SCRIPT in absolute directory'; then
create_file 'pkgname-1.0/configure.gnu' <<-EOF
if test "\${enable_option+set}" = set; then :; fi
EOF
mkdir 'build'
create_file 'testcase.mk' <<-EOF
GNU_CONFIGURE_STRICT= yes
CONFIGURE_DIRS= build
CONFIGURE_SCRIPT= \${WRKDIR}/pkgname-1.0/configure.gnu
CONFIGURE_ARGS= --enable-option
.include "setup.mk"
.include "mk/configure/gnu-configure.mk"
EOF
run_bmake 'testcase.mk' '_check-unknown-configure-options' \
1> "$tmpdir/output" 2>&1 \
&& exitcode=0 || exitcode=$?
assert_that "$exitcode" --equals '0'
assert_that "$tmpdir/output" --file-is-empty
test_case_end
fi