pkgsrc-Changes-HG archive

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

[pkgsrc/trunk]: pkgsrc mk/configure: assist in finding unrecognized configure...



details:   https://anonhg.NetBSD.org/pkgsrc/rev/84dcf156367d
branches:  trunk
changeset: 323098:84dcf156367d
user:      rillig <rillig%pkgsrc.org@localhost>
date:      Sat May 04 15:16:50 2019 +0000

description:
mk/configure: assist in finding unrecognized configure options

Instead of giving instructions, just to the work automatically as far as
it can be automated.

diffstat:

 mk/configure/gnu-configure-unknown.awk                   |  83 ++++++++++++++++
 mk/configure/gnu-configure.mk                            |  46 ++++++-
 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 +++++++
 9 files changed, 315 insertions(+), 10 deletions(-)

diffs (truncated from 377 to 300 lines):

diff -r 0125f782df0c -r 84dcf156367d mk/configure/gnu-configure-unknown.awk
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/mk/configure/gnu-configure-unknown.awk    Sat May 04 15:16:50 2019 +0000
@@ -0,0 +1,83 @@
+#! 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 0125f782df0c -r 84dcf156367d mk/configure/gnu-configure.mk
--- a/mk/configure/gnu-configure.mk     Sat May 04 11:45:14 2019 +0000
+++ b/mk/configure/gnu-configure.mk     Sat May 04 15:16:50 2019 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: gnu-configure.mk,v 1.20 2019/05/04 08:43:06 rillig Exp $
+# $NetBSD: gnu-configure.mk,v 1.21 2019/05/04 15:16:50 rillig Exp $
 #
 # Package-settable variables:
 #
@@ -13,15 +13,19 @@
 #      Whether unknown --enable/--disable/--with/--without options make
 #      the package fail immediately.
 #
-#      When this check fails, inspect the configure script using "bmake
-#      configure-help" and adjust the CONFIGURE_ARGS accordingly.
-#      Inspect whether the configure script runs embedded configure
-#      scripts from subdirectories. In that case, some of the
-#      sub-configure scripts may need the options and some may not know
-#      them at all.
+#      Command line options that are unknown for all configure scripts
+#      of a package are effectively ignored and should be replaced with
+#      their current equivalent (in case they have been renamed), or
+#      otherwise be removed.
 #
-#      Possible: yes no
+#      This check may incorrectly report unknown options for packages
+#      that have multiple configure scripts, when one of these scripts
+#      recognizes the option and some other doesn't. To check this, run
+#      "bmake show-unknown-configure-options" after the package failed.
+#
+#      Possible: yes no warn
 #      Default: no
+#      See also: configure-help show-unknown-configure-options
 #
 # Keywords: configure configure_args gnu
 
@@ -200,5 +204,27 @@
        done
 .endif
 
-GNU_CONFIGURE_STRICT?= no
-CONFIGURE_ARGS+=       ${"${GNU_CONFIGURE_STRICT:M[yY][eE][sS]}":?--enable-option-checking=fatal:}
+GNU_CONFIGURE_STRICT?= warn
+.if ${GNU_CONFIGURE_STRICT:M[yY][eE][sS]}
+CONFIGURE_ARGS+=       --enable-option-checking=fatal
+.elif ${GNU_CONFIGURE_STRICT} == warn
+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.
+#
+# 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}
diff -r 0125f782df0c -r 84dcf156367d regress/gnu-configure-strict/spec
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/regress/gnu-configure-strict/spec Sat May 04 15:16:50 2019 +0000
@@ -0,0 +1,47 @@
+# $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 0125f782df0c -r 84dcf156367d regress/gnu-configure-strict/t-gettext-tools.test
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/regress/gnu-configure-strict/t-gettext-tools.test Sat May 04 15:16:50 2019 +0000
@@ -0,0 +1,35 @@
+# $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 0125f782df0c -r 84dcf156367d regress/gnu-configure-strict/t-simple-unrecognized.test
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/regress/gnu-configure-strict/t-simple-unrecognized.test   Sat May 04 15:16:50 2019 +0000
@@ -0,0 +1,12 @@
+# $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 0125f782df0c -r 84dcf156367d regress/gnu-configure-strict/t-subdirs-ok.test
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/regress/gnu-configure-strict/t-subdirs-ok.test    Sat May 04 15:16:50 2019 +0000
@@ -0,0 +1,20 @@
+# $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 0125f782df0c -r 84dcf156367d regress/gnu-configure-strict/t-subdirs-only-in-main.test
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/regress/gnu-configure-strict/t-subdirs-only-in-main.test  Sat May 04 15:16:50 2019 +0000
@@ -0,0 +1,20 @@
+# $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
+...
+=== configuring in subdir2
+...
+configure: WARNING: unrecognized options: --enable-feature
+...
+



Home | Main Index | Thread Index | Old Index