Створення 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