Поскольку ваш исходный каталог будет содержать файлы, а несуществующий каталог - нет, вы можете использовать внутреннюю функцию GNU make $(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)
содержит пробел.