#c #gcc #makefile #gnu-make
Вопрос:
Мои исходные файлы хорошо организованы в папке, которая содержит вложенные папки, которые также содержат исходные файлы.
Вложенные папки больше не разветвляются.
Все объектные файлы просто предназначены для создания и хранения в одной папке.
Я не хочу вручную указывать имена поддиров в предварительных требованиях при написании целевого объекта, который генерирует мои объектные файлы:
Прямо сейчас это работает:
$(OBJ)/%.o: $(SRC)/%.c $(CC) -c
lt; -o $@ $(CFLAGS)
$(OBJ)/%.o: $(SRC)/$(subdir1)/%.c
$(CC) -clt; -o $@ $(CFLAGS)
$(OBJ)/%.o: $(SRC)/$(subdir2)/%.c
$(CC) -clt; -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