保存/导出make环境中的所有变量?

时间:2014-07-13 02:14:34

标签: shell makefile

导出某个变量var,我可以make print-var,如果我在Makefile中有行:

print-%:
    @echo '$*=$($*)'

但是,保存/导出所有变量以进行调试通常更方便。我学会了破解.VARIABLES来做到这一点:

#MAKFILE

TEST1=test var 1
TEST2=\"test var 2\"
#TEST3=`test var'

MAKE_ENV := $(shell echo '$(.VARIABLES)' | awk -v RS=' ' '/^[a-zA-Z0-9]+$$/')
SHELL_EXPORT := $(foreach v,$(MAKE_ENV),$(v)=$($(v))\n)
.PHONY: expvars
expvars:
    @echo "$(SHELL_EXPORT)"

print-%:
    @echo '$*=$($*)'

这在许多情况下都有效,但是最近我遇到了一个问题,即make变量包含不能出现在sh字符串中的特殊字符。例如,TEST3。如果我取消注释这一行。会有错误。我该怎么做才能解决这个问题?

如何自动转义这些字符?

@MadScientist,非常感谢。但是您建议的模式仍然不起作用。但是,我使用@echo '$(*)=$(subst ','"'"',$($(*)))',这使make print-TEST3正常工作。但是make无法正确获取换行符,我猜SHELL_EXPORT中有很多'',它会让整个事情变得混乱:

#MAKFILE

TEST1=test var 1
TEST2=\"test var 2\"
TEST3=`test var'

MAKE_ENV := $(shell echo '$(.VARIABLES)' | awk -v RS=' ' '/^[a-zA-Z0-9]+$$/')
SHELL_EXPORT := $(foreach v,$(MAKE_ENV),'$(v)=$(subst ','"'"',$($(v)))'\n)
.PHONY: expvars
expvars:
#   @echo "$(SHELL_EXPORT)" #this cause problem
    @echo $(SHELL_EXPORT)


print-%:
    @echo '$(*)=$(subst ','"'"',$($(*)))'

最后我像这样解决了这个问题,而不是在最后回复整个事情,我分别回应每一行:

#MAKFILE

TEST1=test var 1
TEST2="test var 2"
TEST3=`test var'

MAKE_ENV := $(shell echo '$(.VARIABLES)' | awk -v RS=' ' '/^[a-zA-Z0-9]+$$/')
SHELL_EXPORT := $(foreach v,$(MAKE_ENV),\
          echo $(v)= '$(subst ','"'"',$($(v)))';\
          )
.PHONY: expvars
expvars:

    @- $(SHELL_EXPORT)

print-%:
    @echo '$(*)= $(subst ','"'"',$($(*)))'

1 个答案:

答案 0 :(得分:2)

您可以使用'(单引号)引用整个值,然后使用'"'"'替换值中的所有单引号,从而编写可靠的“shell引用值”。所以,像这样:

$(v)='$(subst ','"'"',$($(v)))'