diff options
-rwxr-xr-x | bin/ptxdist | 34 | ||||
-rw-r--r-- | doc/ref_parameter.inc | 9 | ||||
-rw-r--r-- | rules/other/Toplevel.make | 48 |
3 files changed, 78 insertions, 13 deletions
diff --git a/bin/ptxdist b/bin/ptxdist index 1c473809f..a04715b4b 100755 --- a/bin/ptxdist +++ b/bin/ptxdist @@ -1011,6 +1011,8 @@ Misc: package-info <package> print some basic information about the package print <var> print the contents of a variable, in the way it is known by "make" + printnext <var> assumes that the contents of <var> is another + variable and print the contents of this variable list-packages print a list of all selected packages local-src <pkg> [<directory>] overwrite a package source with a locally provided directory containing the sourcecode. @@ -2089,10 +2091,16 @@ EOF ptxd_make_log "${pkgs[@]/%/.${cmd}}" exit ;; + printnext) + make_vars=( "${@}" ) + set -- + ;& print) - if [ ${#} -eq 0 ]; then + local tmpfd + if [ ${#} -eq 0 -a ${#make_vars[*]} -eq 0 ]; then exit 1 fi + exec {tmpfd}>&1 while [ ${#} -gt 0 ]; do if [[ ! ( "${1}" =~ "/" ) ]] && ([ -n "${!1}" ]) 2>/dev/null; then if [ "${PTXDIST_VERBOSE}" = "1" ]; then @@ -2100,19 +2108,23 @@ EOF fi echo "${!1}" else - local check - if [ -z "${check}" ]; then - check_config && - check_deps || exit 1 - check=1 - fi - ptxd_make_log "/print-${1}" 2>/dev/null || { - echo "${1} undefined" >&2 - exit 1 - } + make_vars[${#make_vars[*]}]="${1}" fi shift done + if [ ${#make_vars[*]} -gt 0 ]; then + local prefix + check_config && + check_deps || exit 1 + if [ "${cmd}" = "print" ]; then + prefix="/print-" + else + prefix="/printnext-" + fi + ptxd_make_log "${make_vars[@]/#/${prefix}}" 2>&1 1>&${tmpfd} | \ + sed 's/^.*##\(.*\)##.*$/\1 undefined/' >&2 + check_pipe_status || exit 1 + fi exit ;; test) diff --git a/doc/ref_parameter.inc b/doc/ref_parameter.inc index 18ea01ae2..74689b9d3 100644 --- a/doc/ref_parameter.inc +++ b/doc/ref_parameter.inc @@ -224,6 +224,15 @@ Misc Actions with the given name. If none exists, it will run make on all selected package rules, determine if a variable with the given name is known to make, and if so, print it. + For make variables, <var> can contain '%'. In this case, all variables + that match the pattern are printed. + If the <var> is undefined, then an error will be generated unless '-k' is + used. In that case an empty value is returned. + +``printnext <var>`` + assume that the contents of <var> is another variable and print the + contents of this variable. Shell variables are currently not checked here. + All other rules for ``print`` apply. ``list-packages`` print a list of all selected packages. This list does not include the diff --git a/rules/other/Toplevel.make b/rules/other/Toplevel.make index ef410043d..857500d11 100644 --- a/rules/other/Toplevel.make +++ b/rules/other/Toplevel.make @@ -136,9 +136,53 @@ include $(PTX_DGEN_DEPS_POST) # just the "print" target # ---------------------------------------------------------------------------- +# +# expand variable names +# - if $(1) contains '%' then return all matching variables +# otherwise if $(1) is a defined variable, then return it +# - if no match is found generate an error or return $(1) if make is +# called with '-k' +# +define ptx/check-expand +$(or $(filter $(1),$(.VARIABLES)),$(if $(filter k,$(MAKEFLAGS)),$(1),$(error ##$(1)##))) +endef + +# +# print the given variable +# if PTXDIST_VERBOSE=1 then prefix it with '<name>=' +# +define ptx/print-var +$(info $(if $(filter 1,$(PTXDIST_VERBOSE)),$(1)=)$(call add_quote,$($(1)))) +endef + +# +# expand $(1) to one or more variables and print each one +# +define ptx/print-vars +$(foreach v,$(call ptx/check-expand,$(1)),$(call ptx/print-var,$(v))) +endef + +# +# Pattern target to allow printing variable +# $(filter ..) is used to match against all existing variables so patterns +# containing '%' can be uses to print multiple variables. +# In verbose mode, '<name>=<value>' is printed. +# Trying to print undefined variables results in an error unless '-k' is +# used. In this case an empty value is printed. +# /print-%: FORCE - @:$(foreach v,$(or $(filter $(*),$(.VARIABLES)),$(if $(filter k,$(MAKEFLAGS)),$(*),$(error $(*) undefined))),\ - $(info $(if $(filter 1,$(PTXDIST_VERBOSE)),$(v)=)$(call add_quote,$($(v))))) + @:$(call ptx/print-vars,$(*)) + +# +# As above but tread the variable value as another variable and prints +# the value of this variable. +# Patterns are expanded as above on both levels. +# Printing stops at the first error. +# +/printnext-%: FORCE + @:$(foreach v,$(call ptx/check-expand,$(*)),\ + $(foreach vv,$($(v)),\ + $(call ptx/print-vars,$(vv)))) # for backwards compatibility print-%: /print-% |