我目前正在尝试在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
答案 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
。