В настоящее время я пишу make-файл большего размера, который будет обрабатывать рекурсивную структуру исходных файлов и помещать их в ту же рекурсивную структуру в целевом каталоге. В основном вы можете предположить этот makefile:
DESTINATION_DIR = out
SOURCE_DIR = src
OBJECTS = out/abc.o out/subdir/test.o out/subdir/subdir/xyz.o
.PHONY: all
all: $(OBJECTS)
$(DESTINATION_DIR)/%.o: $(SOURCE_DIR)/%.c
@echo "$@ --- $<"
Как видите, я пытаюсь заменить $(DESTINATION_DIR) на $(SOURCE_DIR) в зависимости, но это не работает. Как я могу это решить? Я даже пытался использовать замещающий скрипт таким образом:
%.o: $(shell myreplacementscript.py "%.c" "$(DESTINATION_DIR)" "$(SOURCE_DIR)")
@echo "$@ --- $<"
но знак процента будет передан моему скрипту без замены. Итак, как я могу сказать, что вывод динамически зависит от исходного файла? Мне нужно сохранить подкаталоги в переменной OBJECTS, я не могу сгладить структуру. И подкаталоги являются динамическими, а не предопределенными.
Я искал других, имеющих ту же проблему, но у них либо плоские ОБЪЕКТЫ, либо рекурсивный make, что в моем случае не очень подходит из-за взаимосвязей между каталогами в соответствии с зависимостями.
Сводка/сообщение об ошибке:
Он не заменяет out/ в ОБЪЕКТАХ на src/. Таким образом, сообщение об ошибке: «Keine Regel vorhanden, um das Target »out/abc.o«, benötigt von »all«, zu erstellen. Schluss». что является типичной ошибкой «Нет правила для создания цели ...».
Полный make-файл можно увидеть здесь: Полный Makefile
Всякий раз, когда я оставляю правую часть двоеточия с %.html слева, это работает, но мне нужно иметь исходный файл в качестве зависимости, чтобы получить работающую инкрементную сборку (надеюсь, без создания файлов зависимостей).
С уважением,
Даниэль
make -v
.) - person Beta   schedule 25.09.2014$(DESTINATION_DIR)/%.o: $(SOURCE_DIR)/%.c
идеальна, ничего лишнего, насколько мне известно. Я использую это все время. - person kebs   schedule 25.09.2014