Index | Thread | Search

From:
Fabien ROMANO <fabienromano@gmail.com>
Subject:
portcheck, check Makefile variables are set in the same order as Makefile.template
To:
ports@openbsd.org
Date:
Tue, 21 May 2024 21:18:45 +0100

Download raw body.

Thread
I would like to bring more consistencies in ports' Makefile by following Makefile.template.

/usr/ports/infrastructure/bin/portcheck -A
> scanning ports under the /usr/ports
> ...
> archivers/ancient/Makefile : CONFIGURE_STYLE should be before AUTOCONF_VERSION and after BUILD_DEPENDS
> archivers/arc/Makefile : WANTLIB should be before SITES and after PERMIT_PACKAGE
> archivers/bzip2/Makefile : SHARED_LIBS should be before CATEGORIES and after DISTNAME
> archivers/bzip2/Makefile : TEST_FLAGS should be before DEBUG_PACKAGES and after MAKE_FLAGS
> archivers/cabextract/Makefile : SEPARATE_BUILD should be before CONFIGURE_STYLE and after LIB_DEPENDS
> archivers/freeze/Makefile : PERMIT_PACKAGE should be before SITES and after CATEGORIES
> archivers/freeze/Makefile : PERMIT_DISTFILES should be before SITES and after CATEGORIES
> archivers/freeze/Makefile : WANTLIB should be before SITES and after CATEGORIES
> archivers/freeze/Makefile : MAKE_FLAGS should be before CONFIGURE_STYLE and after WANTLIB
> ...

First time on ksh and I have limited knowledge on awk/sed.
It's a poc at this stage, at least I would like to rewrite makefile_template definition.

Any opinion on the feature or other checks which would be of interest ?


Index: portcheck
===================================================================
RCS file: /cvs/ports/infrastructure/bin/portcheck,v
diff -u -p -r1.146 portcheck
--- portcheck	12 Oct 2023 05:41:27 -0000	1.146
+++ portcheck	21 May 2024 18:14:08 -0000
@@ -320,6 +320,29 @@ EOF
 )
 
 ############################################################
+# List of variables from Makefile.template
+#
+
+rootdir=$portsdir
+makefile_template=
+while [[ ! -e $rootdir/infrastructure/templates/Makefile.template ]]; do
+	rootdir="${rootdir%/*}"
+	if [[ -z $rootdir ]]; then
+		break
+	fi
+done
+if [[ ! -z $rootdir ]]; then
+	set -A makefile_template $(
+	    grep '=' $rootdir/infrastructure/templates/Makefile.template |
+	    grep -v -e '# ' -e '==' |
+	    awk '{ print $1; }' |
+	    sed -e 's/#//' -e 's/=//' |
+	    awk '!seen[$0]++')
+else
+	echo "no Makefile.template found, skip Makefile variables order check"
+fi
+
+############################################################
 # Check and fail routines
 #
 
@@ -1808,6 +1831,7 @@ check_subst_vars() {
 #   * No user settings present.
 #   * SHARED_ONLY not defined
 #   * Check for usage of obsolete PERMIT_PACKAGE_* and PERMIT_DISTFILES_FTP
+#   * Check variables are set in the same order as Makefile.template
 check_makefile() {
 	$debugging && echo "CALLED: check_makefile($*)" >&2
 
@@ -1818,7 +1842,8 @@ check_makefile() {
 	grep -q '\$OpenBSD.*\$' "$F" &&
 		err "$F should not contain \$OpenBSD\$ tag"
 
-	local iflevel=0 l lnum=0 revs= t r mkvars= var duprevfound
+	local iflevel=0 l lnum=0 t r var duprevfound p i j
+	local revs= mkvars= tplvars= tplidx=
 	# do not unset mkvars, having empty element(-s) is fine
 	unset revs[0]
 	local tab="$(print '\t')"
@@ -1891,6 +1916,43 @@ check_makefile() {
 			mkvars[${#mkvars[@]}]=$var
 		fi
 	done <"$F"
+
+	if [[ -z ${makefile_template[@]} ]]; then
+		return
+	fi
+
+	for v in "${mkvars[@]}"; do
+		for t in `jot $((${#makefile_template[@]}-1))`; do
+			if [[ $v == ${makefile_template[$t]} ]]; then
+				tplvars[${#tplvars[@]}]=$v
+				tplidx[${#tplidx[@]}]=$t
+			fi
+		done
+	done
+	if [[ -z ${tplvars[@]} ]]; then
+		return
+	fi
+
+	p=0
+	for i in `jot $((${#tplvars[@]}-1))`; do
+		if [[ ${tplidx[$i]} -lt $p ]]; then
+			if [[ ${tplidx[$i]} -lt ${tplidx[1]} ]]; then
+				err "$F : ${tplvars[$i]} should be" \
+				    "before ${tplvars[1]}"
+				continue
+			fi
+			for j in `jot $((${#tplvars[@]}-1))`; do
+				if [[ ${tplidx[$i]} -lt ${tplidx[$j]} ]]; then
+					err "$F : ${tplvars[$i]} should be" \
+					    "before ${tplvars[$j]} and" \
+					    "after ${tplvars[$(($j-1))]}"
+					break
+				fi
+			done
+		else
+			p=${tplidx[$i]}
+		fi
+	done
 }
 
 # Checks made: