在我的makefile中,我试图捕获shell函数对包含命令字符串的make变量的调用的输出,但没有成功。当我直接在字符串上运行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
如GNU Make Manual中所示:
配方中的变量和函数引用具有相同的语法和生成文件中其他地方引用的语义。他们也有相同的报价规则:如果你想在你的配方,您必须加倍("$$")。对于类似于默认壳的壳,使用美元符号引入变量,保持在脑海中清楚您要引用的变量是否是make变量(使用一个美元符号)或shell变量(使用两个美元符号)。
$$
被替换为一美元。在您的示例中:
PG_INCLUDE1 = $(shell $$PG_CONFIG)
变为:
PG_INCLUDE1 = $(shell $PG_CONFIG)
接下来,$PG_CONFIG
在shell中执行,就像在终端中键入一样。并且由于当前子shell中没有定义PG_CONFIG
变量,$PG_CONFIG
被什么都不替换。但是,如果您在运行make
之前定义了PG_CONFIG
环境变量,那么它将在Makefile
:中与$$
一起工作
$ export PG_CONFIG="aoeuidhtn"
$ make
PG_CONFIG=/usr/pgsql-9.4/bin/pg_config/
PG_INCLUDE1=aoeuidhtn
我看到两个问题。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)