Makefile gnu make:检查文件是否为目录
我有一个变量Makefile gnu make:检查文件是否为目录,makefile,gnu-make,Makefile,Gnu Make,我有一个变量$(目标) 我正在构造一个变量$(target\u dir) 这方面的条件是: 如果target是本地目录,则target\u dir是curr\u dir/target 如果target不是本地目录,则target\u dir是curr\u dir 目前我正在使用$(通配符…检查当前目录/target是否存在: target_as_dir := $(shell pwd)/$(target) target_is_dir := $(if $(wildcard $(target_as
$(目标)
我正在构造一个变量$(target\u dir)
这方面的条件是:
- 如果
是本地目录,则target
是target\u dir
curr\u dir/target
- 如果
不是本地目录,则target
是target\u dir
curr\u dir
$(通配符…
检查当前目录/target
是否存在:
target_as_dir := $(shell pwd)/$(target)
target_is_dir := $(if $(wildcard $(target_as_dir)),1,)
target_dir := $(if $(target_is_dir),$(target_as_dir),$(shell pwd))
但是,在下面的场景中,情况就不一样了
src/
+--- foo/
+-- makefile
+-- foo.cc
+-- foo -> ../build/foo/foo (this is a symlink)
我在src/foo
,并且$(目标)=foo
我上面的$(通配符)
语句与foo
symlink匹配,我不希望它这样做
只有当它是目录时,我才需要它匹配。任何其他文件系统类型都不应匹配
- 如果
是一个目录,而不是其他文件,如何查找curr\u dir/target
test
命令
target = foo
target_as_dir := $(shell pwd)/$(target)
target_is_dir := $(shell test -d $(target_as_dir) -a ! -h $(target_as_dir); echo $$?)
target_dir := $(if $(and $(findstring 0,$(target_is_dir)),$(findstring $(target_is_dir),0)),$(target_as_dir),$(shell pwd))
all:
echo $(target_dir)
test-d$(target\u as\u dir)-a-h$(target_as_dir)
检查它是否是目录(-d)和(-a)而不是(!)符号链接(-h)。结果为0或1。0代表一个目录,1代表其他所有内容
$(和$(findstring…
部分只是两个字符串的比较。不幸的是,我不知道在不使用第三方库的情况下比较Makefile中两个字符串的更好方法。你的意思是,foo
是指向目录的符号链接,但你甚至不希望它匹配吗?或者如果foo
是指向目录的符号链接,但不是如果foo
是指向文件的符号链接?否,foo
symlink将永远只是指向文件的符号链接。我意识到,这可以很容易地解决,只要在通配符检查中的target\u as\u dir
的末尾添加即可:即:$(if$(wildcard$(target\u as\u dir)/),1,)
正确。这就是为什么我想知道的原因,因为如果你需要知道它是否是符号链接本身,而不是符号链接指向什么,那就困难多了。实际上很少有UNIX工具让你看到符号链接本身的类型,它们几乎都默认遵循符号链接并向你显示它指向的东西。如果你的系统有stat
(大多数人都这样做)这是你最好的选择。但是你必须使用$(shell…
)才能使用它;make本身无法分辨符号链接和它所指向的内容之间的区别。