Створення makefile - stack overflow російською

Намагаюся розібратися в написанні грамотного make файлу, це пекло.

Є такі файли: SubClass.h / .cpp, SuperClass.h / .cpp, Main.cpp.

Сконструював такий makefile:

Класно б це автоматизувати і розділити по директоріях / h / cpp / o файли.

Знайшов хороший спосіб отримувати залежності (через include bash додав в makefile)

А треба б вихлоп був SubClass.o: SubClass.cpp SubClass.h SuperClass.o. не розумію, як мені цього добитися за допомогою make? Я явно роблю щось не так.

Через wildecard навчився отримувати список файлів в папці, а ось в підпапках як (знаходження самих підпапок і тд)?

Адже це така проста і популярна модель організації проекту, невже немає нічого готового? Можливо я пишу велосипед. D

PS: Я не прошу що то писати за мене, просто наведіть в потрібний напрямок.

А треба б вихлоп був SubClass.o: SubClass.cpp SubClass.h SuperClass.o

А навіщо? Навіщо при перекомпіляції SuperClass.cpp перекомпіліровать SubClass.cpp?

Чому б не зробити так:

g ++ сам згенерувати файли з залежностями (.d).

Це правило складання кожного .o файлу, яке виконує g ++ з параметром -MMD. яка генерує файл з залежності (без системних файлів). Файли з залежностями перегенеріруются тільки при зміні початкових кодів.

objs =, deps = генеруємо список файлів за допомогою вбудованої можливості заміни в make

$ @ І $<так называемые "автоматические переменные". $<- имя первой зависимости (first prerequisite). $@ - имя цели для правила (выходного файла) (target file name).

$ @ = Hello.o - ім'я вихідного файлу. $<= hello.c hello.h - входные файлы

В останньому рядку мейкфайла включаємо файли з залежностями (- на початку рядка означає ігнорувати помилки.

Зазвичай ми порівняно рідко пишемо makefile, а вся начебто освоєна "магія" так і норовить за півроку зникнути з голови. Тому я намагаюся писати прості Makefile, на кшталт такого (для вашого випадку).

Рядки після depend з залежностями .o від .h додає команда makedepend (символ @ перед нею пригнічує її висновок в stdout), яка виконується, коли ми запускаємо

після зміни складу файлів проекту або додавання наших (не системний) .h файлів в який-небудь .cpp

Коли ми викликаємо

без аргументів, то Makefile починає виконуватися з першої мітки (інші, якщо не залежать від неї, вже не будуть розглядатися). Тут all: начебто зайва (можна було б відразу почати файл з programm:), але іноді хочеться одним викликом make зібрати відразу кілька модулів і тоді вони просто перераховуються в змінної PROGS.

Тут я в main.cpp включаю f.h. в SubClass.cpp включаю f.h і data.h. а в SuperClass.cpp нічого не включаю.

Make за замовчуванням будує залежності .o від .cpp (або .c) і викликає g ++ з підстановкою значення з змінної CXXFLAGS (а для gcc використовує CFLAGS).

Ключі для линкера (виклик $ (CC) -o.) Я вважаю за краще прописувати явно або в команді, або в змінних makefile, які туди підставляю. Це може зберегти купу часу при налагодженні через рік-другий (особливо якщо при виклику make утворюється довжелезна "простирадло").

Якщо для компіляції будь-якого файлу потрібні нестандартні дії, то це прописуємо вручну. Наприклад, ми хочемо (може бути іноді) використовувати при компіляції файлу SubClass.cpp змінну препроцесора TEST. тоді напишемо

де небудь між all: і depend. В такому випадку ми повинні включати в аргументи виконуваної команди змінну CXXFLAGS явно. Я написав тут ще й залежність від самого Makefile. щоб при редагуванні -DTEST проходила перекомпіляція SubClass.o і далі Перезбірка programm.

Тепер відредагуємо Makefile, приберемо -DTEST при компіляції SubClass.cpp