寻找基于目录的存在在Makefile中分配变量的方法。
例如:(伪代码)
if dir "src/$(project)" exists
SOURCE_DIR := src/$(project)
else
SOURCE_DIR := src/default
test.o: $SOURCE_DIR/test.c
gcc -c -o $@ $<
实现上述目标的最佳方法是什么?
试试这个。
SOURCE_DIR := src/$(shell test -d src/"$(project)" && echo "$(project)" || echo default)
由于您的源目录将包含文件而不存在不存在的目录,您可以使用GNU make internal函数$(wildcard)
:
project := test
# returns all entries under src/$(project) directory or empty string
ifneq ($(wildcard src/$(project)/*),)
SOURCE_DIR := src/$(project)
else
SOURCE_DIR := src/default
endif
.PHONY: all
all:
@echo $(SOURCE_DIR)
测试运行
$ ls src/test/
a.c
$ make
src/test
$ rm -rf src/test
$ make
src/default
奖励:重写条件可能更具可读性:
SOURCE_DIR := src/$(project)
ifeq ($(wildcard $(SOURCE_DIR)/*),)
# fall back to default directory
SOURCE_DIR := src/default
endif
更新2:如果您不想依赖目录中任何文件的存在,您还可以直接测试目录名称。目录总是有一个条目.
,因为它指向自己:
SOURCE_DIR := src/$(project)
ifeq ($(wildcard $(SOURCE_DIR)/.),)
# fall back to default directory
SOURCE_DIR := src/default
endif
更新3:添加$(project)
设置的检查:
SOURCE_DIR := src/$(project)
ifeq ($(strip $(project)),)
# fall back to default directory
SOURCE_DIR := src/default
else ifeq ($(wildcard $(SOURCE_DIR)/.),)
# fall back to default directory
SOURCE_DIR := src/default
endif
或者如果您更喜欢makefile Golfing(感谢@MadScientist的建议)
SOURCE_DIR := $(or $(and $(project),$(wildcard src/$(project)/.)),src/default)
$(and)
结果
如果$(project)
是一个空字符串:空字符串
如果src/$(project)
不是目录:空字符串
否则:src/$(project)/.
,相当于src/$(project)
$(or)
结果
如果$(and)
返回空字符串:src/default
否则:$(and)
返回的字符串CAVEAT:如果$(project)
包含空格,则上面列出的测试将失败。