Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[pkgsrc/trunk]: pkgsrc mk/configure: completely rewrite check for unknown con...



details:   https://anonhg.NetBSD.org/pkgsrc/rev/5ef64d4eb73f
branches:  trunk
changeset: 432358:5ef64d4eb73f
user:      rillig <rillig%pkgsrc.org@localhost>
date:      Thu May 21 13:42:10 2020 +0000

description:
mk/configure: completely rewrite check for unknown configure options

The previous implementation could not reliably detect outdated configure
options.  This was apparent in devel/gettext-tools, where the option
--with-included-libcroco had become unknown between May 2019 and May
2020, but the check was not run.

The behavior is the same in the pkgsrc default configuration.  Only if
GNU_CONFIGURE_STRICT=yes, the new check is activated and will make
packages fail that previously succeeded to build.  Since that variable is
not widely known, there won't be much sudden breakage, if any.

diffstat:

 mk/configure/gnu-configure-unknown.awk                   |   83 ---
 mk/configure/gnu-configure.mk                            |   54 +-
 regress/gnu-configure-strict/spec                        |   47 -
 regress/gnu-configure-strict/t-gettext-tools.test        |   35 -
 regress/gnu-configure-strict/t-simple-unrecognized.test  |   12 -
 regress/gnu-configure-strict/t-subdirs-ok.test           |   20 -
 regress/gnu-configure-strict/t-subdirs-only-in-main.test |   20 -
 regress/gnu-configure-strict/t-subdirs-unrecognized.test |   21 -
 regress/gnu-configure-strict/t-verbose.test              |   41 -
 regress/infra-unittests/gnu-configure-strict.sh          |  399 +++++++++++++++
 10 files changed, 441 insertions(+), 291 deletions(-)

diffs (truncated from 785 to 300 lines):

diff -r abdb42be5ae5 -r 5ef64d4eb73f mk/configure/gnu-configure-unknown.awk
--- a/mk/configure/gnu-configure-unknown.awk    Thu May 21 13:40:07 2020 +0000
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,83 +0,0 @@
-#! awk
-# $NetBSD: gnu-configure-unknown.awk,v 1.1 2019/05/04 15:16:50 rillig Exp $
-#
-# Inspects all GNU configure scripts from a package, including nested
-# ones, to see whether command line options that are reported as
-# unrecognized by one of them are also unrecognized by the others.
-#
-# See GNU_CONFIGURE_STRICT.
-
-BEGIN {
-       # The set of all options from all configure scripts,
-       # kept in insertion order to guarantee reproducible output.
-       delete opts; opts_len = 0; delete opts_seen;
-
-       # The list of subdirectories from which a configure script
-       # has been executed.
-       delete subdirs; subdirs_len = 0;
-
-       # There's always at least one configure script.
-       # This script may execute others.
-       subdir = ".";
-       subdirs[subdirs_len++] = subdir;
-}
-
-/^=== configuring in / {
-       subdir = $4;
-       subdirs[subdirs_len++] = subdir;
-}
-
-/^configure: WARNING: unrecognized options: / {
-       for (i = 5; i <= NF; i++) {
-               opt = $i;
-               sub(",", "", opt);
-               if (!opts_seen[opt]++) {
-                       opts[opts_len++] = opt;
-               }
-               unknown[subdir, opt] = 1;
-       }
-}
-
-function count_unknown(opt,   n, i) {
-       n = 0;
-       for (i in subdirs) {
-               if (unknown[subdirs[i], opt]) {
-                       n++;
-               }
-       }
-       return n;
-}
-
-function summary(opt,   n) {
-       n = count_unknown(opt);
-       if (n == subdirs_len) {
-               print("option " opt " is unknown",
-                       "in all " subdirs_len " configure scripts");
-               return 1;
-       }
-
-       if ("PKG_VERBOSE" in ENVIRON) {
-               print("good: option " opt " is known",
-                       "in " (subdirs_len - n),
-                       "of " subdirs_len " configure scripts");
-               return 1;
-       }
-
-       return 0;
-}
-
-function finish(_,   i, msgs) {
-       msgs = 0;
-       for (i = 0; i < opts_len; i++) {
-               msgs += summary(opts[i]);
-       }
-
-       if (msgs == 0) {
-               print("good: all " opts_len " options are used somewhere");
-               print("please set GNU_CONFIGURE_STRICT=no in the package");
-       }
-}
-
-END {
-       finish()
-}
diff -r abdb42be5ae5 -r 5ef64d4eb73f mk/configure/gnu-configure.mk
--- a/mk/configure/gnu-configure.mk     Thu May 21 13:40:07 2020 +0000
+++ b/mk/configure/gnu-configure.mk     Thu May 21 13:42:10 2020 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: gnu-configure.mk,v 1.22 2019/10/06 09:44:41 rillig Exp $
+# $NetBSD: gnu-configure.mk,v 1.23 2020/05/21 13:42:10 rillig Exp $
 #
 # Package-settable variables:
 #
@@ -211,20 +211,50 @@
 CONFIGURE_ARGS+=       --enable-option-checking=yes
 .endif
 
-# Inspects the configure scripts of a package to see whether there are
-# multiple configure scripts, and one of them reports an option as
-# unrecognized while some other still needs it.
-#
-# This target is expected to be called manually, after a package failed
-# to configure because of the GNU_CONFIGURE_STRICT check.
+_SHOW_UNKNOWN_CONFIGURE_OPTIONS_CMD= \
+       cd ${WRKSRC}; \
+       configures=$$( \
+               ${FIND} ${CONFIGURE_DIRS} -name configure \
+               | ${SED} -e 's,^${WRKSRC}/,,' \
+               | LC_ALL=C ${SORT} -u \
+               | ${TR} '\n' ' ' \
+               | ${SED} 's, $$,,'); \
+       exitcode=0; \
+       for opt in "" \
+               ${CONFIGURE_ARGS:M--enable-*} \
+               ${CONFIGURE_ARGS:M--disable-*} \
+               ${CONFIGURE_ARGS:M--with-*} \
+               ${CONFIGURE_ARGS:M--without-*}; do \
+               [ "$$opt" ] || continue; \
+               optvar=$${opt%%=*}; \
+               optvar=$${optvar\#--}; \
+               optvar=$$(${ECHO} "$$optvar" \
+                       | ${SED} -e 's/[-+.]/_/g' \
+                               -e 's,^disable_,enable_,' \
+                               -e 's,^without_,with_,'); \
+               [ "$$optvar" = 'enable_option_checking' ] && continue; \
+               ${GREP} "^$$optvar$$" $$configures 1>/dev/null || { \
+                       ${ERROR_MSG} "[gnu-configure.mk] option $$opt not found in $$configures"; \
+                       exitcode=1; \
+               }; \
+       done
+
+# Inspects the configure scripts of a package to see whether each option
+# of the form --enable-* or --disable-* or --with-* or --without-* is
+# known to at least one of the configure scripts.  If that is not the
+# case, the option is outdated in most cases, or it has a typo.
 #
 # See also: GNU_CONFIGURE_STRICT configure-help
 #
 # Keywords: GNU_CONFIGURE_STRICT configure-help
 show-unknown-configure-options: .PHONY
        ${RUN} ${MAKE} patch
-       ${RUN} ${RM} -f ${_COOKIE.configure}
-       @${STEP_MSG} "Running configure scripts silently"
-       ${RUN} ${MAKE} configure GNU_CONFIGURE_STRICT=warn 2>&1         \
-       | ${AWK} -f ${PKGSRCDIR}/mk/configure/gnu-configure-unknown.awk
-       ${RUN} ${RM} -f ${_COOKIE.configure}
+       ${RUN} ${_SHOW_UNKNOWN_CONFIGURE_OPTIONS_CMD}
+
+.if ${GNU_CONFIGURE_STRICT:tl} == yes
+USE_TOOLS+=    find grep sed sort tr
+
+pre-configure-checks-hook: _check-unknown-configure-options
+_check-unknown-configure-options: .PHONY
+       ${RUN} ${_SHOW_UNKNOWN_CONFIGURE_OPTIONS_CMD}; exit $$exitcode
+.endif
diff -r abdb42be5ae5 -r 5ef64d4eb73f regress/gnu-configure-strict/spec
--- a/regress/gnu-configure-strict/spec Thu May 21 13:40:07 2020 +0000
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-# $NetBSD: spec,v 1.1 2019/05/04 15:16:51 rillig Exp $
-#
-# Checks that analyzing unknown CONFIGURE_ARGS produces the expected results,
-# for both packages containing only a single configure scripts and those
-# containing multiple configure scripts.
-
-set -eu
-
-tmpdir=${TMPDIR:-/tmp}/pkgsrc-gnu-configure
-rm -rf "$tmpdir"
-mkdir -p "$tmpdir"
-
-require_file() {
-       if diff -u "$3" "$1" > /dev/null; then
-               :
-       else
-               regress_fail "Expected files to be equal."
-               diff -u "$3" "$1" || true
-       fi
-}
-
-do_test_case() {
-       testname=${1%.test}
-
-       awk '/^# end/ { relevant = 0 } relevant { print } /^# begin/ { relevant = 1 }' \
-               < "$1" > "$tmpdir/$testname.expected"
-
-       awk -f $PKGSRCDIR/mk/configure/gnu-configure-unknown.awk \
-               "$1" > "$tmpdir/$testname.actual"
-
-       require_file "$tmpdir/$testname.actual" --equals "$tmpdir/$testname.expected"
-}
-
-do_test() {
-       do_test_case "t-simple-unrecognized.test"
-       do_test_case "t-gettext-tools.test"
-       do_test_case "t-subdirs-ok.test"
-       do_test_case "t-subdirs-unrecognized.test"
-       do_test_case "t-subdirs-only-in-main.test"
-       export PKG_VERBOSE=yes
-       do_test_case "t-verbose.test"
-       unset PKG_VERBOSE
-}
-
-check_result() {
-       exit_status 0
-}
diff -r abdb42be5ae5 -r 5ef64d4eb73f regress/gnu-configure-strict/t-gettext-tools.test
--- a/regress/gnu-configure-strict/t-gettext-tools.test Thu May 21 13:40:07 2020 +0000
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-# $NetBSD: t-gettext-tools.test,v 1.1 2019/05/04 15:16:51 rillig Exp $
-
-This is the output of running "bmake configure GNU_CONFIGURE_STRICT=warn"
-in devel/gettext-tools. That package has several subdirectories, and some
-of them even run multiple configure scripts.
-
-===> Configuring for gettext-tools-0.19.8.1nb1
-...
-=== configuring in gettext-runtime
-...
-configure: WARNING: unrecognized options: --with-included-libcroco, --without-git, --with-xz, --without-emacs, --disable-openmp
-...
-=== configuring in libasprintf
-...
-configure: WARNING: unrecognized options: --disable-csharp, --disable-java, --with-included-libcroco, --without-git, --with-xz, --without-included-gettext, --without-emacs, --disable-openmp
-...
-configure: WARNING: unrecognized options: --disable-csharp, --disable-java, --with-included-libcroco, --without-git, --with-xz, --without-included-gettext, --without-emacs, --disable-openmp
-configure: WARNING: unrecognized options: --with-included-libcroco, --without-git, --with-xz, --without-emacs, --disable-openmp
-...
-=== configuring in gettext-tools
-...
-=== configuring in examples
-...
-configure: WARNING: unrecognized options: --disable-csharp, --disable-java, --with-included-libcroco, --without-git, --with-xz, --without-included-gettext, --without-emacs, --disable-openmp
-...
-configure: WARNING: unrecognized options: --disable-csharp, --disable-java, --with-included-libcroco, --without-git, --with-xz, --without-included-gettext, --without-emacs, --disable-openmp
-
-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.
-
-# begin expected output
-good: all 8 options are used somewhere
-please set GNU_CONFIGURE_STRICT=no in the package
-# end expected output
diff -r abdb42be5ae5 -r 5ef64d4eb73f regress/gnu-configure-strict/t-simple-unrecognized.test
--- a/regress/gnu-configure-strict/t-simple-unrecognized.test   Thu May 21 13:40:07 2020 +0000
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-# $NetBSD: t-simple-unrecognized.test,v 1.1 2019/05/04 15:16:51 rillig Exp $
-
-In most configure scripts there are no calls to other configure scripts.
-In that case the only "subdir" is the main configure script itself.
-
-===> Configuring for screen-4.6.2nb1
-...
-configure: WARNING: unrecognized options: --enable-feature
-
-# begin
-option --enable-feature is unknown in all 1 configure scripts
-# end
diff -r abdb42be5ae5 -r 5ef64d4eb73f regress/gnu-configure-strict/t-subdirs-ok.test
--- a/regress/gnu-configure-strict/t-subdirs-ok.test    Thu May 21 13:40:07 2020 +0000
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-# $NetBSD: t-subdirs-ok.test,v 1.1 2019/05/04 15:16:51 rillig Exp $
-
-===> Configuring for package-1.0
-...
-=== configuring in subdir1
-...
-configure: WARNING: unrecognized options: --only-subdir2
-...
-=== configuring in subdir2
-...
-configure: WARNING: unrecognized options: --only-subdir1
-...
-
-No output expected since each of the unrecognized options is used in the
-other subdirectory.
-
-# begin expected output
-good: all 2 options are used somewhere
-please set GNU_CONFIGURE_STRICT=no in the package
-# end expected output
diff -r abdb42be5ae5 -r 5ef64d4eb73f regress/gnu-configure-strict/t-subdirs-only-in-main.test
--- a/regress/gnu-configure-strict/t-subdirs-only-in-main.test  Thu May 21 13:40:07 2020 +0000
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-# $NetBSD: t-subdirs-only-in-main.test,v 1.1 2019/05/04 15:16:51 rillig Exp $
-
-===> Configuring for package-1.0
-...
-=== configuring in subdir1
-...
-configure: WARNING: unrecognized options: --enable-feature
-...



Home | Main Index | Thread Index | Old Index