我有一个变量$(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
是否为目录,而不是其他文件?答案 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中两个字符串的更好方法。