使用Makefiles中的命令替换



在Linux sh/bash shell中,我可以使用UID_CODE=$(id -u):$(id -g)获取Linux用户ID。它通常给出UID_CODE=1000:1000

然而,我正在写一个Makefile,类似于这个:

run:
UID_CODE=$(id -u):$(id -g) ./a.out

Makefile给出的UID_CODE=:只是:

我做了一些挖掘,发现我需要使用$$,但$$(id -u):$$(id -g)给了我UID_CODE=$(id -u):$(id -g)

如何获得与shell中相同的结果?

这肯定会奏效,而且可能是最好的方法,除非你需要在很多规则中完成:

run:
UID_CODE=$$(id -u):$$(id -g) ./a.out

没有一个好的理由使用GNU来制作像shell函数这样的特定功能。

我不知道你说的是什么意思:给我UID_CODE=$(id -u):$(id -g)你的意思是,这就是打印出来的原因吗?是的,那很好。make打印出它将运行的shell命令,就像在shell提示符中键入它一样。

当shell运行该命令时,它将展开$(id -u)并用正确的UID替换它。例如,您可以测试以下内容:

run:
UID_CODE=$$(id -u):$$(id -g) env | grep UID_CODE

在此处运行make将打印以下内容:

UID_CODE=$(id -u):$(id -g) env | grep UID_CODE
UID_CODE=1000:1000

(或您的UID/GID值(。第一行是make,显示它将运行的命令,第二行是命令的输出,显示UID_CODE已按预期设置。

下面是一个示例makefile,它设置了一个变量,并通过环境将其传递给规则中的外部程序(您可以使用${...}$(...)(:

$ cat Makefile.mk
FOO := "foo: $(shell id -g):$(shell id -u)"
tst:
echo "testing: $(FOO)"
FOO=${FOO} ./a.out

这使用的是$(shell ...)的GNU makefile功能,但您可能使用的是GNU make,所以这应该不是问题。

相关内容

  • 没有找到相关文章

最新更新