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
    是一个目录,而不是其他文件,如何查找

您可以使用unix
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本身无法分辨符号链接和它所指向的内容之间的区别。