Работа с несколькими расширениями исходного файла в make-файле - PullRequest
7 голосов
/ 23 января 2012

У меня есть проект c ++ с различными расширениями для исходных файлов (.cpp, .c, .cc) и различными расширениями для заголовочных файлов (.hpp, .h, .hh). Исходные файлы находятся в каталоге с именем SRC, а заголовочные файлы, как и ожидалось, находятся в каталоге с именем INC.

Я бы хотел скомпилировать исходники с правилом вроде

vpath %.c $(SRC)

%.o: %.c
    $(COMPILER) $(FLAGS) $< $(INCFLAG)$(INC)

Это, конечно, работает, если я знаю, что исходный файл будет иметь форму% .c, но в случае нескольких возможных расширений файлов мне нужно будет создать аналогичное правило для% .cpp и% .cc. , Конечно, написать три правила не составляет особого труда, но было бы неплохо иметь возможность использовать этот make-файл в качестве перетаскивания для любого проекта, даже на другом языке, без необходимости переписывать правила.

Так, как я могу написать правило (или некоторую другую конструкцию, которая выполняет ту же самую цель), которая работает как:

SRC_EXT = cpp c cc
vpath %.$(SRC_EXT) $(SRC)

%.o: %.$(SRC_EXT)
    $(COMPILER) $(FLAGS) $< $(INCFLAG)$(INC)

Спасибо за вашу помощь.

1 Ответ

4 голосов
/ 24 января 2012

Вы не можете в стандартном POSIX сделать.Однако, поскольку вы упоминаете vpath, я предполагаю, что вы используете GNU make.Если у вас достаточно новая версия (3.81 или новее), вы можете сделать это достаточно легко с помощью call и eval:

SRC_EXT = cpp c cc

define compile_rule
%.o : %.$1
        $$(COMPILER) $$(FLAGS) $$< $$(INCFLAG)$$(INC)
endef    
$(foreach EXT,$(SRC_EXT),$(eval $(call compile_rule,$(EXT))))

Если у вас нет достаточно новой GNU make или вы предпочитаете альтернативное решениеВы можете сделать то же самое с сгенерированными make-файлами.

...