From ea53719f97eb25b819da475fd05e0c6671dbfd76 Mon Sep 17 00:00:00 2001 From: Simon Rose <simon.rose@ess.eu> Date: Thu, 21 Oct 2021 12:56:08 +0200 Subject: [PATCH] Synchronised all of the config files in configure/E3 and configure/modules in order to merge the two configuration directories. --- configure/E3/CONFIG_EPICS | 16 ++++++++++++++++ configure/E3/CONFIG_EXPORT | 2 ++ configure/E3/CONFIG_REQUIRE | 6 +----- configure/E3/CONFIG_SHELL | 2 +- configure/E3/CONFIG_TEST | 8 ++++++++ configure/E3/DECOUPLE_FLAGS | 7 +++++++ configure/E3/DEFINES_FT | 26 ++++++++++++++++++-------- configure/E3/RULES_DEV | 29 ++++++++++++++++++++++++++--- configure/E3/RULES_EPICS | 14 +++++--------- configure/E3/RULES_PATCH | 8 ++++++-- configure/E3/RULES_REQUIRE | 9 +++++++++ configure/E3/RULES_TEST | 27 ++++++++++++++++++++++++++- configure/E3/RULES_VARS | 13 +++++++++---- configure/RULES | 2 +- configure/module/RULES_TEST | 4 ++++ configure/modules/CONFIG_REQUIRE | 2 ++ configure/modules/CONFIG_TEST | 8 +++++--- configure/modules/DECOUPLE_FLAGS | 22 ++++++---------------- configure/modules/DEFINES_FT | 1 - configure/modules/RULES_DEV | 4 +++- configure/modules/RULES_VARS | 6 ------ 21 files changed, 155 insertions(+), 61 deletions(-) create mode 100644 configure/E3/DECOUPLE_FLAGS create mode 100644 configure/module/RULES_TEST diff --git a/configure/E3/CONFIG_EPICS b/configure/E3/CONFIG_EPICS index 320b00b9..432e0d3f 100644 --- a/configure/E3/CONFIG_EPICS +++ b/configure/E3/CONFIG_EPICS @@ -42,6 +42,20 @@ export M_ADSUPPORT export M_ADCORE export M_OPCUA +## This is needed since the target "epics" (in configure/RULES_MODULE in most modules) +## uses SUDOBASH to run the make process: +# +#.PHONY: epics +#epics: +# $(QUIET)echo "EPICS_BASE:=$(EPICS_BASE)" > $(TOP)/$(E3_MODULE_SRC_PATH)/configure/RELEASE +# $(QUIET)echo "ASYN:=$(M_ASYN)" > $(TOP)/$(E3_MODULE_SRC_PATH)/configure/RELEASE +# $(QUIET)echo "CHECK_RELEASE:=YES" > $(TOP)/$(E3_MODULE_SRC_PATH)/configure/CONFIG_SITE +# $(QUIET)echo "INSTALL_LOCATION:=$(M_DEVLIB2)" >> $(TOP)/$(E3_MODULE_SRC_PATH)/configure/CONFIG_SITE +# $(SUDOBASH) "$(MAKE) -C $(E3_MODULE_SRC_PATH)" +# +## And so that last line will only run if SUDOBASH is defined to be "bash -c" +SUDOBASH := bash -c + ### Exclude the following variables to display VARS_EXCLUDES+=COMMUNITY_EPICS_MODULES VARS_EXCLUDES+=M_AUTOSAVE @@ -63,3 +77,5 @@ VARS_EXCLUDES+=M_IPAC VARS_EXCLUDES+=M_ADSUPPORT VARS_EXCLUDES+=M_ADCORE VARS_EXCLUDES+=M_OPCUA + +VARS_EXCLUDES+=SUDOBASH diff --git a/configure/E3/CONFIG_EXPORT b/configure/E3/CONFIG_EXPORT index 6aeb4e9b..6d5b6609 100644 --- a/configure/E3/CONFIG_EXPORT +++ b/configure/E3/CONFIG_EXPORT @@ -7,6 +7,7 @@ MSI:=$(EPICS_BASE)/bin/$(EPICS_HOST_ARCH)/msi EXPORT_VARS+=EPICS_HOST_ARCH EXPORT_VARS+=EPICS_BASE EXPORT_VARS+=MSI +EXPORT_VARS+=E3_MODULE_NAME EXPORT_VARS+=E3_MODULE_VERSION EXPORT_VARS+=E3_SITEMODS_PATH EXPORT_VARS+=E3_SITEAPPS_PATH @@ -16,6 +17,7 @@ EXPORT_VARS+=$(filter E3_REQUIRE_%,$(.VARIABLES)) EXPORT_VARS+=QUIET EXPORT_VARS+=$(filter %_DEP_VERSION,$(.VARIABLES)) EXPORT_VARS+=$(filter WITH_%,$(.VARIABLES)) +EXPORT_VARS+=$(filter %_EXTERNAL,$(.VARIABLES)) export_version=$(eval export $1) $(eval $(foreach v,$(EXPORT_VARS),$(call export_version,$v))) diff --git a/configure/E3/CONFIG_REQUIRE b/configure/E3/CONFIG_REQUIRE index 6cdf4a40..1a689389 100644 --- a/configure/E3/CONFIG_REQUIRE +++ b/configure/E3/CONFIG_REQUIRE @@ -2,8 +2,7 @@ # The following VARIABLES are the same as other modules ones. # -E3_REQUIRE_LOCATION:=$(EPICS_BASE)/$(E3_REQUIRE_NAME)/$(E3_REQUIRE_VERSION) - +E3_REQUIRE_LOCATION?=$(EPICS_BASE)/$(E3_REQUIRE_NAME)/$(E3_REQUIRE_VERSION) E3_REQUIRE_TOOLS:=$(E3_REQUIRE_LOCATION)/tools E3_REQUIRE_BIN:=$(E3_REQUIRE_LOCATION)/bin @@ -12,6 +11,3 @@ E3_REQUIRE_DB:=$(E3_REQUIRE_LOCATION)/db E3_REQUIRE_DBD:=$(E3_REQUIRE_LOCATION)/dbd E3_REQUIRE_INC:=$(E3_REQUIRE_LOCATION)/include E3_REQUIRE_CONFIG:=$(E3_REQUIRE_LOCATION)/configure - - -EXPORT_VARS+=$(filter E3_REQUIRE_%,$(.VARIABLES)) diff --git a/configure/E3/CONFIG_SHELL b/configure/E3/CONFIG_SHELL index 931904ed..b35126f3 100644 --- a/configure/E3/CONFIG_SHELL +++ b/configure/E3/CONFIG_SHELL @@ -5,4 +5,4 @@ else SHELL = /usr/bin/bash endif -VARS_EXCLUDES += SHELL +VARS_EXCLUDES+=SHELL diff --git a/configure/E3/CONFIG_TEST b/configure/E3/CONFIG_TEST index 90d16727..d9792f20 100644 --- a/configure/E3/CONFIG_TEST +++ b/configure/E3/CONFIG_TEST @@ -1,3 +1,11 @@ TEST_DIR:=$(TOP)/tests +RUN_IOCSH_TEST_COMMAND = run-iocsh --name "${EPICS_BASE}/require/${E3_REQUIRE_VERSION}/bin/iocsh.bash" -r "$(E3_MODULE_NAME),$(E3_MODULE_VERSION)" -l $(TEMP_CELL_PATH) +TEMP_CELL_PATH := $(TOP)/testMods-$(shell date +"%y%m%d%H%M%S") +RMDIR = $(RM) -rf + +EXPORT_VARS+=TEMP_CELL_PATH + VARS_EXCLUDES+=TEST_DIR +VARS_EXCLUDES+=RMDIR +VARS_EXCLUDES+=TEMP_CELL_PATH diff --git a/configure/E3/DECOUPLE_FLAGS b/configure/E3/DECOUPLE_FLAGS new file mode 100644 index 00000000..476159b4 --- /dev/null +++ b/configure/E3/DECOUPLE_FLAGS @@ -0,0 +1,7 @@ +# Legacy file. Needed since <module>.Makefiles include the boilerplate code +# +# where_am_I := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) +# include ${E3_REQUIRE_TOOLS}/driver.makefile +# include $(E3_REQUIRE_CONFIG)/DECOUPLE_FLAGS +# +# which fails if this file does not exist. TODO: Remove this line from all modules diff --git a/configure/E3/DEFINES_FT b/configure/E3/DEFINES_FT index 840ac0cf..b88cb9c4 100644 --- a/configure/E3/DEFINES_FT +++ b/configure/E3/DEFINES_FT @@ -13,17 +13,27 @@ git submodule update --remote --merge $@/ endef define patch_site -for i in $(wildcard $(TOP)/patch/Site/$(E3_MODULE_VERSION)-*.p0.patch); do\ - printf "\nPatching %s with the file : %s\n" "$(E3_MODULE_SRC_PATH)" "$$i"; \ - git apply --directory=$(E3_MODULE_SRC_PATH) --ignore-whitespace -p0 $$i;\ -done +patches=$$(ls $(TOP)/patch/Site/$(E3_MODULE_VERSION)/*.p0.patch 2> /dev/null); \ +if [ -n "$$patches" ]; then \ + for i in $$patches; do \ + printf "\nPatching %s with the file : %s\n" "$(E3_MODULE_SRC_PATH)" "$$i"; \ + git apply --directory=$(E3_MODULE_SRC_PATH) --ignore-whitespace -p0 $$i; \ + done; \ +else \ + echo ">>> No patches to apply" >&2; \ +fi endef define patch_revert_site -for i in $(wildcard $(TOP)/patch/Site/$(E3_MODULE_VERSION)-*.p0.patch); do\ - printf "\nReverting applied patch %s with the file : %s\n" "$(E3_MODULE_SRC_PATH)" "$$i"; \ - git apply -R --directory=$(E3_MODULE_SRC_PATH) --ignore-whitespace -p0 $$i;\ -done +patches=$$(ls $(TOP)/patch/Site/$(E3_MODULE_VERSION)/*.p0.patch 2> /dev/null); \ +if [ -n "$$patches" ]; then \ + for i in $$patches; do\ + printf "\nReverting applied patch %s with the file : %s\n" "$(E3_MODULE_SRC_PATH)" "$$i"; \ + git apply -R --directory=$(E3_MODULE_SRC_PATH) --ignore-whitespace -p0 $$i;\ + done \ +else \ + echo ">>> No patches to revert" >&2; \ +fi endef ifndef VERBOSE diff --git a/configure/E3/RULES_DEV b/configure/E3/RULES_DEV index a3887729..2c7e9a9f 100644 --- a/configure/E3/RULES_DEV +++ b/configure/E3/RULES_DEV @@ -1,11 +1,12 @@ # -*- mode: Makefile;-*- -.PHONY: devvars devenv devinit devbuild devclean devinstall devrebuild devuninstall devdistclean devconf devrequireconf +.PHONY: devvars devenv devinit devbuild devclean devinstall devrebuild devuninstall devdistclean devconf devepics devepics-clean devepics-distclean devpatch devpatchrevert devexistent devdep devvers devvars: vars devenv: devvars +## Initializes a dev setup, defined with configure/CONFIG_MODULE_DEV and configure/RELEASE_DEV devinit: git-submodule-sync git clone $(E3_MODULE_DEV_GITURL) $(E3_MODULE_SRC_PATH) cd $(E3_MODULE_SRC_PATH) && git checkout $(EPICS_MODULE_TAG) @@ -24,8 +25,14 @@ devrebuild: nonexists devuninstall: nonexists devdistclean: nonexists devconf: nonexists -devrequireconf: nonexists +devepics: nonexists +devepics-clean: nonexists +devepics-distclean: nonexists +devpatch: nonexists +devpatchrevert: nonexists devexistent: nonexists +devdep: nonexists +devvers: nonexists nonexists: $(QUIET)echo "" $(QUIET)echo "------------------------------------------------------------" @@ -35,15 +42,31 @@ nonexists: $(QUIET)echo "" else +## Displays information about the build process (development mode) +devdebug: debug + +## Build current module (development mode) devbuild: build + +## Deletes temporary build files (development mode) devclean: clean + +## Install the current module (development mode) devinstall: install devrebuild: rebuild + +## Uninstall the current module (development mode) devuninstall: uninstall devconf: conf -devrequireconf: requireconf devdistclean: clean $(QUIET)echo "Removing $(E3_MODULE_SRC_PATH) ......... " rm -rf $(E3_MODULE_SRC_PATH) +devepics: epics +devepics-clean: epics-clean +devepics-distclean: epics-distclean +devpatch: patch +devpatchrevert: patchrevert devexistent: existent +devdep: dep +devvers: vers endif diff --git a/configure/E3/RULES_EPICS b/configure/E3/RULES_EPICS index c6219140..f7dac66e 100644 --- a/configure/E3/RULES_EPICS +++ b/configure/E3/RULES_EPICS @@ -1,14 +1,10 @@ -# -*- mode: Makefile;-*- - # One should define the any dependency modules and EPICS base path # in the following directory -# .PHONY: epics epics-clean +.PHONY: epics-clean epics-distclean -# epics: -# $(QUIET)echo "EPICS_BASE=$(EPICS_BASE)" > $(TOP)/$(E3_MODULE_SRC_PATH)/configure/RELEASE -# $(QUIET)echo "INSTALL_LOCATION=$(M_IOCSTATS)" > $(TOP)/$(E3_MODULE_SRC_PATH)/configure/CONFIG_SITE -# $(MAKE) -C $(E3_MODULE_SRC_PATH) +epics-clean: + $(MAKE) -C $(E3_MODULE_SRC_PATH) clean -#epics-clean: -# $(MAKE) -C $(E3_MODULE_SRC_PATH) clean +epics-distclean: + $(MAKE) -C $(E3_MODULE_SRC_PATH) distclean diff --git a/configure/E3/RULES_PATCH b/configure/E3/RULES_PATCH index fb3d8ada..d2a6d0f6 100644 --- a/configure/E3/RULES_PATCH +++ b/configure/E3/RULES_PATCH @@ -1,11 +1,15 @@ .PHONY: patch patchrevert +.PHONY: check_for_old_patches +check_for_old_patches: + $(if $(wildcard $(TOP)/patch/Site/$(patsubst %+0,%,$(E3_MODULE_VERSION))*.p0.patch),$(warning Warning: old-style patches detected. Please move them to patch/Site/$$E3_MODULE_VERSION/.)) + ## Apply Patch Files -patch: +patch: check_for_old_patches $(QUIET) $(call patch_site) ## Revert Patch Files -patchrevert: +patchrevert: check_for_old_patches $(QUIET) $(call patch_revert_site) diff --git a/configure/E3/RULES_REQUIRE b/configure/E3/RULES_REQUIRE index f1c66a4d..ca535cf9 100644 --- a/configure/E3/RULES_REQUIRE +++ b/configure/E3/RULES_REQUIRE @@ -35,6 +35,15 @@ e3-site-path: $(QUIET) install -d -m 755 $(E3_SITEMODS_PATH) $(QUIET) install -d -m 755 $(E3_SITEAPPS_PATH) +.PHONY: epics +epics: + $(QUIET)echo "EPICS_BASE=$(EPICS_BASE)" > $(TOP)/$(E3_MODULE_SRC_PATH)/configure/RELEASE + $(QUIET)echo "CHECK_RELEASE = YES" > $(TOP)/$(E3_MODULE_SRC_PATH)/configure/CONFIG_SITE + $(SUDOBASH) "$(MAKE) -C $(E3_MODULE_SRC_PATH)" + +.PHONY: epics-clean +epics-clean: + $(SUDOBASH) "$(MAKE) -C $(E3_MODULE_SRC_PATH) clean" VARS_EXCLUDES+=FILE_FILTER VARS_EXCLUDES+=E3_SHELL_FILES diff --git a/configure/E3/RULES_TEST b/configure/E3/RULES_TEST index 5a6e2b84..f542ecb6 100644 --- a/configure/E3/RULES_TEST +++ b/configure/E3/RULES_TEST @@ -1,4 +1,29 @@ .PHONY: test +## Tests the current build +test: + +ifeq ($(shell command -v run-iocsh > /dev/null 2>&1 ; echo $$?),0) + +test: temp_install run_test module_tests cleanup_test + +.PHONY: temp_install +temp_install: + $(MAKE) cellinstall E3_CELL_PATH=$(TEMP_CELL_PATH) + +.PHONY: run_test +run_test: + $(RUN_IOCSH_TEST_COMMAND) + +.PHONY: module_tests +module_tests: + +.PHONY: cleanup_test +cleanup_test: + $(RMDIR) $(TEMP_CELL_PATH) + +else # if the if-run-iocsh-exists test fails test: - pytest $(TEST_DIR) -v + $(error run-iocsh must be installed to use the test capability. Please install run-iocsh from PyPI.) + +endif diff --git a/configure/E3/RULES_VARS b/configure/E3/RULES_VARS index e1e0221a..fa5c1a92 100644 --- a/configure/E3/RULES_VARS +++ b/configure/E3/RULES_VARS @@ -6,13 +6,13 @@ DEP_MODULES:=$(filter %_DEP_VERSION, $(E3_MODULES_VARIABLES)) LEVEL?=2 -## Print relevant environment variables -.PHONY: env -env: vars +GENERATED_DEP_FILE:=$(E3_MODULES_INSTALL_LOCATION_LIB)/$(EPICS_HOST_ARCH)/$(E3_MODULE_NAME).dep +## Print relevant environment variables .PHONY: vars vars: header - $(foreach v, $(E3_MODULES_VARIABLES), $(info $(v) = $($(v)))) @#noop + $(foreach v, $(filter-out %_DEP_VERSION,$(E3_MODULES_VARIABLES)), $(info $(v) = $($(v)))) @#noop + $(foreach v, $(filter %_DEP_VERSION,$(E3_MODULES_VARIABLES)), $(info $(v) = $($(v)))) @#noop .PHONY: header header: @@ -31,11 +31,16 @@ else $(QUIET)tree -L $(LEVEL) $(E3_MODULES_PATH)/$(E3_MODULE_NAME) endif +## Displays dependency information, both configured and generated .PHONY: dep dep: $(QUIET)echo "require $(E3_MODULE_NAME),$(E3_MODULE_VERSION)" $(QUIET)echo "< configured ..." $(foreach v, $(DEP_MODULES), $(info $(v) = $($(v)))) @#noop +ifneq ("$(wildcard $(GENERATED_DEP_FILE))","") + $(QUIET)echo "> generated ..." + $(QUIET)tail -n+2 $(GENERATED_DEP_FILE) +endif .PHONY: vers vers: diff --git a/configure/RULES b/configure/RULES index e35fe641..a22a8c59 100644 --- a/configure/RULES +++ b/configure/RULES @@ -14,7 +14,7 @@ include $(TOP)/configure/E3/RULES_REQUIRE include $(TOP)/configure/E3/RULES_PATCH include $(TOP)/configure/E3/RULES_DB include $(TOP)/configure/E3/RULES_VARS -include $(TOP)/configure/E3/RULES_TEST +include $(TOP)/configure/module/RULES_TEST ifneq (,$(findstring dev,$(MAKECMDGOALS))) diff --git a/configure/module/RULES_TEST b/configure/module/RULES_TEST new file mode 100644 index 00000000..5a6e2b84 --- /dev/null +++ b/configure/module/RULES_TEST @@ -0,0 +1,4 @@ +.PHONY: test + +test: + pytest $(TEST_DIR) -v diff --git a/configure/modules/CONFIG_REQUIRE b/configure/modules/CONFIG_REQUIRE index 871948ef..1a689389 100644 --- a/configure/modules/CONFIG_REQUIRE +++ b/configure/modules/CONFIG_REQUIRE @@ -2,6 +2,8 @@ # The following VARIABLES are the same as other modules ones. # +E3_REQUIRE_LOCATION?=$(EPICS_BASE)/$(E3_REQUIRE_NAME)/$(E3_REQUIRE_VERSION) + E3_REQUIRE_TOOLS:=$(E3_REQUIRE_LOCATION)/tools E3_REQUIRE_BIN:=$(E3_REQUIRE_LOCATION)/bin E3_REQUIRE_LIB:=$(E3_REQUIRE_LOCATION)/lib diff --git a/configure/modules/CONFIG_TEST b/configure/modules/CONFIG_TEST index 9ef0ba0d..d9792f20 100644 --- a/configure/modules/CONFIG_TEST +++ b/configure/modules/CONFIG_TEST @@ -1,9 +1,11 @@ +TEST_DIR:=$(TOP)/tests RUN_IOCSH_TEST_COMMAND = run-iocsh --name "${EPICS_BASE}/require/${E3_REQUIRE_VERSION}/bin/iocsh.bash" -r "$(E3_MODULE_NAME),$(E3_MODULE_VERSION)" -l $(TEMP_CELL_PATH) TEMP_CELL_PATH := $(TOP)/testMods-$(shell date +"%y%m%d%H%M%S") RMDIR = $(RM) -rf -EXPORT_VARS += TEMP_CELL_PATH +EXPORT_VARS+=TEMP_CELL_PATH -VARS_EXCLUDES += RMDIR -VARS_EXCLUDES += TEMP_CELL_PATH +VARS_EXCLUDES+=TEST_DIR +VARS_EXCLUDES+=RMDIR +VARS_EXCLUDES+=TEMP_CELL_PATH diff --git a/configure/modules/DECOUPLE_FLAGS b/configure/modules/DECOUPLE_FLAGS index 6904d96a..476159b4 100644 --- a/configure/modules/DECOUPLE_FLAGS +++ b/configure/modules/DECOUPLE_FLAGS @@ -1,17 +1,7 @@ -# *** ISSUES -# driver.makefile recursively read all include directories which were installed. -# The only way to exclude header files is to set $(module)_VERSION to a blank. - -# We first collect all installed modules from $(E3_SITEMODS_PATH) ... -#$(foreach dir,$(patsubst $(E3_SITEMODS_PATH)/%,%,$(wildcard $(E3_SITEMODS_PATH)/*)),$(eval DECOUPLE_MODULES += $(dir))) - -# ... except that we don't want to overwrite the versions from required modules, so keep those. -#$(foreach mod,$(filter-out $(REQ),$(DECOUPLE_MODULES)),$(eval $(mod)_VERSION =)) - -# In addition to decouple the existent e3 module, -# We use this opportunatiy in order to apply global configuration -# space. For example, common compiler options +# Legacy file. Needed since <module>.Makefiles include the boilerplate code # -#ifeq ($(T_A),linux-x86_64) -#USR_LDFLAGS += -Wl,--compress-debug-sections=zlib -#endif +# where_am_I := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) +# include ${E3_REQUIRE_TOOLS}/driver.makefile +# include $(E3_REQUIRE_CONFIG)/DECOUPLE_FLAGS +# +# which fails if this file does not exist. TODO: Remove this line from all modules diff --git a/configure/modules/DEFINES_FT b/configure/modules/DEFINES_FT index a91260bb..fc7d5628 100644 --- a/configure/modules/DEFINES_FT +++ b/configure/modules/DEFINES_FT @@ -1,4 +1,3 @@ - # Keep always the module up-to-date define git_update = git submodule deinit -f $@/ diff --git a/configure/modules/RULES_DEV b/configure/modules/RULES_DEV index 02e2df96..2c7e9a9f 100644 --- a/configure/modules/RULES_DEV +++ b/configure/modules/RULES_DEV @@ -1,6 +1,6 @@ # -*- mode: Makefile;-*- -.PHONY: devvars devenv devinit devbuild devclean devinstall devrebuild devuninstall devdistclean devepics devepics-clean devepics-distclean devpatch devpatchrevert devexistent devdep devvers +.PHONY: devvars devenv devinit devbuild devclean devinstall devrebuild devuninstall devdistclean devconf devepics devepics-clean devepics-distclean devpatch devpatchrevert devexistent devdep devvers devvars: vars @@ -24,6 +24,7 @@ devinstall: nonexists devrebuild: nonexists devuninstall: nonexists devdistclean: nonexists +devconf: nonexists devepics: nonexists devepics-clean: nonexists devepics-distclean: nonexists @@ -56,6 +57,7 @@ devrebuild: rebuild ## Uninstall the current module (development mode) devuninstall: uninstall +devconf: conf devdistclean: clean $(QUIET)echo "Removing $(E3_MODULE_SRC_PATH) ......... " rm -rf $(E3_MODULE_SRC_PATH) diff --git a/configure/modules/RULES_VARS b/configure/modules/RULES_VARS index 518a3256..fa5c1a92 100644 --- a/configure/modules/RULES_VARS +++ b/configure/modules/RULES_VARS @@ -48,12 +48,6 @@ vers: $(QUIET)echo "E3_MODULE_VERSION:=$(E3_MODULE_VERSION), origin : $(origin E3_MODULE_VERSION)" # https://www.cmcrossroads.com/article/printing-value-makefile-variable -PRINT.%: - $(QUIET)echo $* = $($*) - $(QUIET)echo $*\'s origin is $(origin $*) - print-%: $(QUIET)echo $* = $($*) $(QUIET)echo $*\'s origin is $(origin $*) - -FORCE: -- GitLab