基于目录的存在,Makefile变量赋值

问题描述 投票:0回答:2

寻找基于目录的存在在Makefile中分配变量的方法。

例如:(伪代码)

if dir "src/$(project)" exists
SOURCE_DIR := src/$(project)
else
SOURCE_DIR := src/default

test.o: $SOURCE_DIR/test.c
    gcc -c -o $@ $<

实现上述目标的最佳方法是什么?

makefile gnu-make
2个回答
1
投票

试试这个。

SOURCE_DIR := src/$(shell test -d src/"$(project)" && echo "$(project)" || echo default)

1
投票

由于您的源目录将包含文件而不存在不存在的目录,您可以使用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)包含空格,则上面列出的测试将失败。

© www.soinside.com 2019 - 2024. All rights reserved.