对make变量中的命令执行shell函数

时间:2015-04-16 17:37:09

标签: shell makefile

在我的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

2 个答案:

答案 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}}