膨胀变量:=`查找。 -name'Top'-type d`

时间:2013-07-16 23:21:02

标签: makefile gnu-make

我目前正在尝试在makefile中编码变量,以便找到特定目录,然后剥离最后一个目录名。目前,当我回显$ {variable}时,它会正确膨胀,但当我回显$ {myvar}时,它根本不会膨胀!也!当我使用“variable:= etc”时,它会膨胀为“./Top”而不是“./source/Top”

DESIRED FLOW:
variable = `find /username/mcarlis -maxdepth 2 -name 'Top' -type d` 
newvar = $(subst /Top,,${variable})

Example:
Variable should return /username/mcarlis/source/Top
newvar should become /username/mcarlis/source

谢谢!
-Matt

1 个答案:

答案 0 :(得分:1)

Make不支持反引号。 shell支持反引号。当你这样写:

variable = `find /username/mcarlis -maxdepth 2 -name 'Top' -type d`

你已经分配了文字字符串:

`find /username/mcarlis -maxdepth 2 -name 'Top' -type d`

到变量variable。然后在下一行中尝试替换值/Top,但该字符串没有值/Top,因此该子组无效。

看起来正确的原因是当你写这样的规则时:

all:
        echo ${variable}

make运行shell命令:

echo `find /username/mcarlis -maxdepth 2 -name 'Top' -type d`

并且 shell 将为您处理反引号。如果你查看打印的输出,你会看到上面的内容,显而易见的是variable的值不是路径名,而是反引号命令。

假设您正在使用GNU make,那么做您想要的方法是使用$(shell ...)函数:

variable := $(shell find /username/mcarlis -maxdepth 2 -name 'Top' -type d)

编辑添加:

似乎仍然存在混淆。也许这会有所帮助:修改makefile以使用$(info ...)函数来打印变量的值:

variable = `find /username/mcarlis -maxdepth 2 -name 'Top' -type d`
$(info variable is: $(variable))

你会看到 NOT 设置为/username/mcarlis/source/Top

您还可以运行make -p来打印make的内部数据库,它会显示所有变量的值......并且您将看到此值也不是/username/mcarlis/source/Top