从makefile变量获取顶层目录


8

获取makefile变量的顶级目录部分的最简单代码是什么?例:

BUILD_DIR = dir/subdir/.../sub-a-dub-dir
distclean:
        rm -rf <some code which evaluates to "dir" from $(BUILD_DIR)>

PS:我不是说$(dir $(dir $(BUILD_DIR))),而是可以获取任何变量值的第一个目录部分的东西。


dirname /tmp/foo/bar将给予/tmpdirname foo/bar/baz将给予foo
Abhishek A

1
@ greenmang0:标记您的答案。首先,这是完全错误的(您是否还执行了这些命令?),其次是makefile而不是Bash。
2011年

@ l0b0这是一条评论,“错了”并不是举报任何内容的好理由,只需发表评论说出问题所在
迈克尔·莫罗泽克

@MichaelMrozek:我将其标记为“非建设性/无关紧要的话题”,两者均适用。
l0b0 2011年

我不明白您的问题:“顶级目录部分”是什么意思?您是指第一个部分之前的部分/吗?您是否保证参数是相对路径?您是否假设GNU make?
吉尔斯(Gilles)'所以

Answers:


5

您是指目录的第一部分吗?如果是这样,请将路径转换为组件列表,然后提取第一个组件。我假设您正在使用GNU make,并且您没有做任何疯狂的事情,例如期望带有空格的文件名毫发无损。不要尝试使用绝对路径。

override BUILD_DIR = dir/subdir/.../sub-a-dub-dir
distclean:
        rm -rf $(firstword $(subst /, ,$(BUILD_DIR)))

我会BUILD_DIR覆盖用户可能在命令行上传递的所有内容,以避免有人意外传递它并删除某些意外内容。


BUILD_DIR本来应该是一个内部变量,但是您是对的,仍然有可能有人将其设置为危险的东西。因此,接受这个答案,并告诫不要使用该解决方案:)
l0b0 2012年

1
@ l0b0因为我们假设GNU在做:override BUILD_DIR = …
不要再邪恶了'

0

如果您确定BUILD_DIR绝不会以'/'开头:

rootdir=$( echo $BUILD_DIR | cut -d/ -f1 )

否则,您可能需要考虑以'/'开头的路径:

if [[ $BUILD_DIR =~ "^/" ]]; then
        rootdir=$( echo $BUILD_DIR | cut -d/ -f1,2 )
else
        rootdir=$( echo $BUILD_DIR | cut -d/ -f1 )
fi

echo $rootdir

或者,也许最好忽略任何以'/'开头的路径。


1
这是用于生成文件,而不是 Bash。这是Bash中的一个小问题,但是我对简单的Makefile解决方案感兴趣。
2011年

您可以在Makefile中执行的一件事是运行命令。因此,您可以在路径中创建一个名为rootdir的Shell脚本,并在您的makefile中运行“ rm -rf $(rootdir $ BUILD_DIR)”或类似的命令。否则,您必须执行类似预定义构建根的操作,以便rm -rf以后可以使用。我肯定会仔细检查rootdir脚本可以传递回的响应,因此您最终不会因语法错误而给脚本rm -rf /
蒂姆·肯尼迪
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.