diff options
author | rillig <rillig@pkgsrc.org> | 2020-03-13 08:11:36 +0000 |
---|---|---|
committer | rillig <rillig@pkgsrc.org> | 2020-03-13 08:11:36 +0000 |
commit | 0c9b52c9fbabdc18eb360fb03bbd7fd73b78b4d0 (patch) | |
tree | 85cfe8252662ae1d188a18cd11699715010b6257 /mk/check | |
parent | abc339854d734519b6ea7528a062a89f9e163ec1 (diff) | |
download | pkgsrc-0c9b52c9fbabdc18eb360fb03bbd7fd73b78b4d0.tar.gz |
mk/check: revert collateral damage from previous commit
Killing the editor does not stop cvs from committing; to achieve that, it
is necessary to remove the file containing the commit message being
edited.
Diffstat (limited to 'mk/check')
-rw-r--r-- | mk/check/check-portability.awk | 89 | ||||
-rw-r--r-- | mk/check/check-portability.mk | 21 | ||||
-rw-r--r-- | mk/check/check-portability.sh | 14 |
3 files changed, 112 insertions, 12 deletions
diff --git a/mk/check/check-portability.awk b/mk/check/check-portability.awk new file mode 100644 index 00000000000..08dae554f17 --- /dev/null +++ b/mk/check/check-portability.awk @@ -0,0 +1,89 @@ +# $NetBSD: check-portability.awk,v 1.11 2020/03/13 08:11:36 rillig Exp $ +# +# Checks a shell file for possible portability problems. +# +# ENVIRONMENT +# (See check-subr.awk) +# + +BEGIN { + found_random = no; + found_test_eqeq = no; +} + +# Check for $RANDOM, which is specific to ksh and bash. +function check_random(line) { + + # $RANDOM together with the PID is often found in GNU-style + # configure scripts and is considered acceptable. + if (line ~ /\$\$-\$RANDOM/ || line ~ /\$RANDOM-\$\$/) { + # Assume that this is ok. + + } else if (line ~ /\$RANDOM[A-Z_]+/) { + # That's ok, too. + + } else if (line ~ /\$RANDOM/) { + found_random = yes; + cs_warning_heading("Found $RANDOM:"); + cs_warning_msg(cs_fname ": " $0); + } +} + +function check_test_eqeq(line, n, word, i) { + + if (length(line) == 0) + return; + n = split(line, word); + for (i = 3; i < n; i++) { + if (word[i] == "==") { + if (word[i-2] == "test" || word[i-2] == "[") { + found_test_eqeq = yes; + cs_error_heading("Found test ... == ...:"); + cs_error_msg(cs_fname ": " $0); + } + } + } +} + +/./ { + # Note: This code does not find _all_ instances of + # unportable code. If a single line contains an unsafe and + # a safe usage of $RANDOM, it will pass the test. + + # Strip comments + line = $0; + gsub(/^#.*/, "", line); + gsub(/[[:space:]]#.*/, "", line); + + check_random(line); + check_test_eqeq(line); +} + +END { + if (found_random) { + h = "The variable $RANDOM is not required for a POSIX-conforming shell, and\n"; + h = h "many implementations of /bin/sh do not support it. It should therefore\n"; + h = h "not be used in shell programs that are meant to be portable across a\n"; + h = h "large number of POSIX-like systems.\n" + cs_explain(h); + } + + if (found_test_eqeq) { + h = "The \"test\" command, as well as the \"[\" command, are not required to know\n"; + h = h "the \"==\" operator. Only a few implementations like bash and some\n"; + h = h "versions of ksh support it.\n"; + h = h "\n"; + h = h "When you run \"test foo == foo\" on a platform that does not support the\n"; + h = h "\"==\" operator, the result will be \"false\" instead of \"true\". This can\n"; + h = h "lead to unexpected behavior.\n"; + h = h "\n"; + h = h "There are two ways to fix this error message. If the file that contains\n"; + h = h "the \"test ==\" is needed for building the package, you should create a\n"; + h = h "patch for it, replacing the \"==\" operator with \"=\". If the file is not\n"; + h = h "needed, add its name to the CHECK_PORTABILITY_SKIP variable in the\n"; + h = h "package Makefile.\n"; + cs_explain(h); + } + + cs_exit(); +} diff --git a/mk/check/check-portability.mk b/mk/check/check-portability.mk index 79b61b2932a..7d19b7fbbd8 100644 --- a/mk/check/check-portability.mk +++ b/mk/check/check-portability.mk @@ -1,39 +1,40 @@ -# $NetBSD: check-portability.mk,v 1.13 2020/03/13 08:04:08 rillig Exp $ +# $NetBSD: check-portability.mk,v 1.14 2020/03/13 08:11:36 rillig Exp $ # -# This file checks that the extracted shell programs don't contain -# bashisms and other constructs that only work on some platforms. +# This file contains some checks that are applied to the configure +# scripts to check for certain constructs that are known to cause +# problems on some platforms. The detailed checks are in +# check-portability.sh. # # User-settable variables: # # CHECK_PORTABILITY -# Whether to enable the portability checks. +# Whether to enable some portability checks for the configure +# scripts before they are run. # # Default value: yes for PKG_DEVELOPERs, no otherwise. # # Package-settable variables: # # CHECK_PORTABILITY_SKIP -# The shell patterns that should not be checked. -# Note that a * in a pattern also matches a slash in a pathname. +# The list of files that should be skipped in the portability +# check. # # Default value: ${REPLACE_BASH} -# Examples: debian/* test/* *.bash +# Example: debian/* _VARGROUPS+= check-portability _USER_VARS.check-portability= CHECK_PORTABILITY _PKG_VARS.check-portability= CHECK_PORTABILITY_SKIP -.if ${PKG_DEVELOPER:Uno} != no +.if ${PKG_DEVELOPER:Uno} != "no" CHECK_PORTABILITY?= yes .endif CHECK_PORTABILITY?= no CHECK_PORTABILITY_SKIP?= ${REPLACE_BASH} .if ${CHECK_PORTABILITY:tl} == yes && ${CHECK_PORTABILITY_SKIP} != "*" -TOOL_DEPENDS+= check-portability>=19.4.1:../../pkgtools/check-portability pre-configure-checks-hook: _check-portability .endif - .PHONY: _check-portability _check-portability: @${STEP_MSG} "Checking for portability problems in extracted files" diff --git a/mk/check/check-portability.sh b/mk/check/check-portability.sh index 6ed117d5a6a..c4a7e3ca882 100644 --- a/mk/check/check-portability.sh +++ b/mk/check/check-portability.sh @@ -1,4 +1,4 @@ -# $NetBSD: check-portability.sh,v 1.18 2020/03/13 08:04:08 rillig Exp $ +# $NetBSD: check-portability.sh,v 1.19 2020/03/13 08:11:36 rillig Exp $ # # This program checks all files in the current directory and any # subdirectories for portability issues that are likely to result in @@ -20,8 +20,18 @@ cs_setprogname "$0" # usage: check_shell <fname> check_shell() { - ${PREFIX}/bin/check-portability "$1" 1>&2 \ + env \ + CK_FNAME="$1" \ + CK_PROGNAME="check-portability.awk" \ + awk -f "$checkdir/check-subr.awk" \ + -f "$checkdir/check-portability.awk" \ + < "$1" 1>&2 \ || cs_exitcode=1 + + if test -f "${PREFIX}/bin/check-portability"; then + ${PREFIX}/bin/check-portability "$1" 1>&2 \ + || cs_exitcode=1 + fi } find ./* -type f -print 2>/dev/null \ |