Makefile как использовать логические ИЛИ промежуточные предварительные условия?

#c #gcc #makefile #gnu-make

Вопрос:

Мои исходные файлы хорошо организованы в папке, которая содержит вложенные папки, которые также содержат исходные файлы.
Вложенные папки больше не разветвляются.
Все объектные файлы просто предназначены для создания и хранения в одной папке.

Я не хочу вручную указывать имена поддиров в предварительных требованиях при написании целевого объекта, который генерирует мои объектные файлы:

Прямо сейчас это работает:

 $(OBJ)/%.o: $(SRC)/%.c
    $(CC) -c

lt; -o $@ $(CFLAGS)

$(OBJ)/%.o: $(SRC)/$(subdir1)/%.c
$(CC) -c


lt; -o $@ $(CFLAGS)

$(OBJ)/%.o: $(SRC)/$(subdir2)/%.c
$(CC) -c


lt; -o $@ $(CFLAGS)

...

Но я хочу, чтобы это выглядело примерно так:

 $(OBJ)/%.o: $(SRC)/%.c OR $(SRC)/*/%.c
    $(CC) -c

lt; -o $@ $(CFLAGS)

Я понимаю, что название, скорее всего, не является реальным вопросом, который следует задать, но я ищу любое решение. Кроме того, я знаю, что * здесь это не работает в качестве заполнителя.

Ответ №1:

Во-первых, вы можете упростить файл makefile, который у вас есть, используя vpath:

 $(OBJ)/%.o: %.c
    $(CC) -c

lt; -o $@ $(CFLAGS)

vpath %.c $(SRC) $(SRC)/$(subdir1) $(SRC)/$(subdir2)

Затем, если вы действительно не хотите указывать подкаталоги:

 vpath %.c $(shell find $(SRC) -type d)
 

Комментарии:

1. Я не думаю, что это сработает, если окажутся .c файлы с одинаковым именем, но в разных исходных подкаталогах? (Хотя и версия OP тоже не будет)

2. Это работает потрясающе. Тем не менее, я запускаю файл makefile в Powershell, вы случайно не знаете альтернативу Windows для команды оболочки? 🙂

3. @M. M: Да, я думал об этом. Если произойдет такое столкновение, то файл makefile операции не только не будет работать, но даже нет способа решить проблему из командной строки.

4. @pluto9800: Извините, я не знаю.

5. Время для загрузки wsl