Условные операторы с использованием Make - PullRequest
0 голосов
/ 30 мая 2018

У меня проблема с условными выражениями в make.Существующие вопросы по SO работают только на самом высоком уровне в Makefile.

Вот что у меня есть:

.PHONY: all

all: bar/*.o

bar/%.o: foo/%.cc
ifeq (,$(wildcard $(@D)))
    @echo $(wildcard $(@D))
endif

Есть два пустых файла под foo, a.cc и b.cc.Папка bar существует.

Вот вывод:

PS C:\Users\cbrown2\Src> mingw32-make
bar
bar

Она входит в оператор ifeq, хотя $(wildcard $(@D)) дает bar.

Что дает?

1 Ответ

0 голосов
/ 31 мая 2018

Вы не можете использовать условные выражения таким образом.Когда make оценивает ваши условные автоматические переменные еще не имеют значения.Так что make увидит:

bar/%.o: foo/%.cc
    @echo $(wildcard $(@D))

, потому что $(@D) раскрывается как пустая строка.И когда make передает рецепт оболочке, он сначала расширяется $(@D), который на этот раз имеет значение: bar.

Примечание, которое не имеет ничего общего с вашей проблемой: когда bar пока не содержит все объектные файлы,

all: bar/*.o

не будет делать то, что вы, вероятно, хотите.Что вы, вероятно, хотите, это:

SRC := $(wildcard foo/*.cc)
OBJ := $(patsubst foo/%.cc,bar/%.o,$(SRC))

all: $(OBJ)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...