在我的makefile中,我试图捕获包含命令字符串的make变量上的shell函数调用的输出而没有成功。当我直接在字符串上运行shell函数时,它可以工作。我不明白在命令字符串上运行shell函数与在包含命令字符串的make变量上运行shell函数之间的区别。
PG_CONFIG = "/usr/pgsql-9.4/bin/pg_config/"
PG_INCLUDE1 = $(shell $$PG_CONFIG)
PG_INCLUDE2 = $(shell /usr/pgsql-9.4/bin/pg_config --includedir-server)
.PHONY: print
print:
@echo "PG_CONFIG="$(PG_CONFIG)
@echo "PG_INCLUDE1="$(PG_INCLUDE1)
@echo "PG_INCLUDE2="$(PG_INCLUDE2)
输出结果为:
$make -f Makefile.test print
PG_CONFIG=/usr/pgsql-9.4/bin/pg_config/
PG_INCLUDE1=
PG_INCLUDE2=/usr/pgsql-9.4/include/server
答案 0 :(得分:2)
我看到两个问题。 PG_CONFIG的定义以“/”结尾,因此它被视为目录。 PG_INCLUDE1中的变量引用应为$(PG_CONFIG)而不是$$ PG_CONFIG。
试试这个:
PG_CONFIG = "/usr/pgsql-9.4/bin/pg_config"
PG_INCLUDE1 = $(shell $(PG_CONFIG))
PG_INCLUDE2 = $(shell /usr/pgsql-9.4/bin/pg_config --includedir-server)
.PHONY: print
print:
@echo "PG_CONFIG="$(PG_CONFIG)
@echo "PG_INCLUDE1="$(PG_INCLUDE1)
@echo "PG_INCLUDE2="$(PG_INCLUDE2)
答案 1 :(得分:2)
它位于GNU Make Manual:
配方中的变量和函数引用具有相同的语法和 语义到makefile中其他地方的引用。他们也有 相同的报价规则:如果你想要一个美元符号出现在你的 食谱,你必须加倍('$$')。对于像默认shell这样的shell, 使用美元符号来引入变量,保持这一点非常重要 在你的脑海中清楚你要引用的变量是否为a make变量(使用单个美元符号)或shell变量(使用两个 美元符号)。
所以$$
所做的就是用一美元代替它。在您的示例中:
PG_INCLUDE1 = $(shell $$PG_CONFIG)
归结为:
PG_INCLUDE1 = $(shell $PG_CONFIG)
接下来,$PG_CONFIG
在shell中执行,就像在终端中键入它一样。并且由于当前子shell PG_CONFIG
中定义的$PG_CONFIG
变量没有被替换为空。但是,如果您在运行PG_CONFIG
之前定义了make
环境变量,那么它将按照您在$$
Makefile
$ export PG_CONFIG="aoeuidhtn"
$ make
PG_CONFIG=/usr/pgsql-9.4/bin/pg_config/
PG_INCLUDE1=aoeuidhtn
中所希望的那样工作:
{{1}}