0

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

谢谢!
-马特

4

1 回答 1

1

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

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

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

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

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

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

all:
        echo ${variable}

make 运行 shell 命令:

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

外壳将为您处理反引号。如果您查看进行打印的输出,您会看到上面的内容,很明显 的值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))

你会看到它没有设置为/username/mcarlis/source/Top.

您还可以运行make -p打印 make 的内部数据库,它将向您显示所有变量的值......您会看到这个值也不/username/mcarlis/source/Top是那样的。

于 2013-07-16T23:49:29.587 回答