Назначение переменной Makefile, основанное на существовании каталога - PullRequest
0 голосов
/ 29 марта 2019

Поиск способов присвоения переменной в Makefile на основе существования каталога.

Например: (псевдокод)

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

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

Каков наилучший способ достижения вышеуказанного

Ответы [ 2 ]

1 голос
/ 29 марта 2019

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

1 голос
/ 29 марта 2019

Попробуйте это.

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