Страницы

Поиск по вопросам

четверг, 18 октября 2018 г.

Создание makefile

Пытаюсь разобраться в написании грамотного make файла, это ад.
Есть такие файлы: SubClass.h/.cpp, SuperClass.h/.cpp, Main.cpp.
Сконструировал такой makefile:
Programm: Main.o SuperClass.o SubClass.o g++ -o Programm Main.o SuperClass.o SubClass.o Main.o: Main.cpp SuperClass.o SubClass.o g++ -c -o Main.o Main.cpp SuperClass.o: SuperClass.h SuperClass.cpp g++ -c -o SuperClass.o SuperClass.cpp SubClass.o: SubClass.cpp SubClass.h SuperClass.o g++ -c -o SubClass.o SubClass.cpp
Классно бы это автоматизировать и разделить по директориям /h /cpp /o файлы.
Нашел хороший способ получать зависимости (через include bash добавил в makefile)
g++ -MM SubClass.cpp SubClass.o: SubClass.cpp SubClass.h SuperClass.h
А нужно что бы выхлоп был SubClass.o: SubClass.cpp SubClass.h SuperClass.o, не понимаю, как мне этого добиться с помощью make? Я явно делаю что то не так.
Через wildecard научился получать список файлов в папке, а вот в подпапках как (нахождение самих подпапок и тд)?
Это ведь такая простая и популярная модель организации проекта, неужели нет ничего готового? Возможно я пишу велосипед? :D
PS: Я не прошу что то писать за меня, просто наведите в нужное направление.


Ответ

мне кажется, ваш файл несколько многословен. для всех описанных действий, кажется, достаточно таких строк:
Programm: Main.o SuperClass.o SubClass.o g++ -o $@ $^
запуск make с параметром -n (dry-run) показывает такую последовательность команд (при наличии в текущем каталоге только cpp- и h-файлов):
g++ -c -o Main.o Main.cpp g++ -c -o SuperClass.o SuperClass.cpp g++ -c -o SubClass.o SubClass.cpp g++ -o Programm Main.o SuperClass.o SubClass.o

немного объяснений по поводу «применённой магии»
«магия» называется implicit rules
все актуальные implicit rules (и ещё многое другое) можно посмотреть командой make -p | less
к примеру, о том, что из file.cpp можно собарть file.o (и, главное, как это сделать), make «знает» благодаря вот такому правилу:
%.o: %.cpp # recipe to execute (built-in): $(COMPILE.cpp) $(OUTPUT_OPTION) $<

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

Отправить комментарий