gnu make:检查文件是否是目录

时间:2017-06-14 20:00:28

标签: makefile gnu-make

我有一个变量$(target)

我正在构建一个变量$(target_dir)

条件是:

  • 如果target是本地目录,则target_dir curr_dir/target
  • 如果target 是本地目录,则target_dir curr_dir

目前我正在使用$(wildcard ...)检查curr_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$(target) = foo

上方的$(wildcard)语句与foo符号链接相匹配,我不希望这样做。

我需要它才能匹配,只要它是一个目录。任何其他文件系统类型都不应该匹配。

  • 如何查找curr_dir/target是否为目录,而不是其他文件?

1 个答案:

答案 0 :(得分:2)

您可以使用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_as_dir) -a ! -h $(target_as_dir)检查它是否是目录(-d)和(-a)不是(!)符号链接(-h)。结果是0或1. 0表示目录,1表示其他所有目的。

$(and $(findstring....部分只是两个字符串的比较。不幸的是,我不知道在不使用第三方库的情况下比较Makefile中两个字符串的更好方法。

相关问题