[PATCH v4] env: Avoid using GNU features in awk

Mark Kettenis mark.kettenis at xs4all.nl
Sun Nov 28 23:57:38 CET 2021


> From: Simon Glass <sjg at chromium.org>
> Date: Wed, 24 Nov 2021 07:40:14 -0700
> 
> GNU has a very useful third argument to match() but this is not supported
> in the POSIX awk.
> 
> Update the code to cope, so that the script is POSIX-compliant.
> 
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
> 
> Changes in v4:
> - Avoid using length() to access the length of the array
> 
> Changes in v3:
> - Reword commit message and comment to avoid casting aspersions
> 
> Changes in v2:
> - Fix the has_var match() that had left-over test code
> 
>  scripts/env2string.awk | 29 ++++++++++++++++++++---------
>  1 file changed, 20 insertions(+), 9 deletions(-)

This makes the next branch build again for me on OpenBSD.  So it would
be great if this one could be applied somewhat promptly or at least
before next is merged into master.

Thanks,

Mark

> diff --git a/scripts/env2string.awk b/scripts/env2string.awk
> index 57d0fc8f3ba..1bfe9ed07a4 100644
> --- a/scripts/env2string.awk
> +++ b/scripts/env2string.awk
> @@ -21,29 +21,39 @@ BEGIN {
>  
>  # Skip empty lines, as these are generated by the clang preprocessor
>  NF {
> +	do_output = 0
> +
>  	# Quote quotes
>  	gsub("\"", "\\\"")
>  
> +	# Avoid using the non-POSIX third parameter to match(), by splitting
> +	# the work into several steps.
> +	has_var = match($0, "^([^ \t=][^ =]*)=(.*)$")
> +
>  	# Is this the start of a new environment variable?
> -	if (match($0, "^([^ \t=][^ =]*)=(.*)$", arr)) {
> +	if (has_var) {
>  		if (length(env) != 0) {
>  			# Record the value of the variable now completed
>  			vars[var] = env
> +			do_output = 1
>  		}
> -		var = arr[1]
> -		env = arr[2]
> +
> +		# Collect the variable name. The value follows the '='
> +		match($0, "^([^ \t=][^ =]*)=")
> +		var = substr($0, 1, RLENGTH - 1)
> +		env = substr($0, RLENGTH + 1)
>  
>  		# Deal with += which concatenates the new string to the existing
> -		# variable
> -		if (length(env) != 0 && match(var, "^(.*)[+]$", var_arr))
> -		{
> +		# variable. Again we are careful to use POSIX match()
> +		if (length(env) != 0 && match(var, "^(.*)[+]$")) {
> +			plusname = substr(var, RSTART, RLENGTH - 1)
>  			# Allow var\+=val to indicate that the variable name is
>  			# var+ and this is not actually a concatenation
> -			if (substr(var_arr[1], length(var_arr[1])) == "\\") {
> +			if (substr(plusname, length(plusname)) == "\\") {
>  				# Drop the backslash
>  				sub(/\\[+]$/, "+", var)
>  			} else {
> -				var = var_arr[1]
> +				var = plusname
>  				env = vars[var] env
>  			}
>  		}
> @@ -65,9 +75,10 @@ END {
>  	# empty it is not set.
>  	if (length(env) != 0) {
>  		vars[var] = env
> +		do_output = 1
>  	}
>  
> -	if (length(vars) != 0) {
> +	if (do_output) {
>  		printf("%s", "#define CONFIG_EXTRA_ENV_TEXT \"")
>  
>  		# Print out all the variables
> -- 
> 2.34.0.rc2.393.gf8c9666880-goog
> 
> 


More information about the U-Boot mailing list