Пишу Makefile для небольшого проекта. Хочу что бы все по феншую, или хотя бы не в одной куче. Имеется следующая структура каталогок
./include - общие для server и client заголовочный файлы
./src - общие для server и client сурсные файлы
./server - специфичные исходники
./client - специфичные исходники
./bin - хотелосьбы чтобы сюда клались все .o файлы и файл конечной программы
Как я вижу себе расположение Makefil'ов
./src/Mikefile - отчетает за получение *.o для всех *.c расположенных в нем (по возможности распологать их в ../bin)
./server/Makefile - отвечает за получение *.о для всех *.с расположенных в нем
./Makifile - содержит два правила для сборки либо client либо server
Читаю gnu make manual, но вопросов и непоняток куча. Начал с ./src/Makefile
CXX = g++
LD = g++
CXXFLAGS += -std=c++0x -I../include
objects := $(patsubst %.c,%.o,$(wildcard *.c))
object = *.o
vpath %.hpp ../include
persone.o : persone.hpp
address.o : address.hpp
.PFONY : clean
clean:
-rm -f $(object)
1. в правие clean при использовании $(objects) оно пустое вместо того чтобы содержать все .o файлы для .c файлов. Так и не понял почему.
2. Как правильно использовать механизм $(CXX) -MМ *.c для того чтобы не ручками писать для каждого правила набор пререквизитов а получать его автоматически ? И возможно ли такое вообще ?
2.1 Если пунк 2 невозможен, то тогда получается что нужно все подключаемые хедеры руками перечислять ?
3. Если возможно (2) то тогда как правильно сделать вместо перечисления правил (persone.o, address.o,...) шаблонное статическое правило для сборки всех объектных файлов для всех .c файлов с указанием для них в качестве пререквизитов значения полученные в (2)
4. Как можно сделать так чтобы полученные *.o файлы лежали не в этой же директории а в нужной мне (../bin)
-------------------------------------------------------------------
Опуская все это написал второй makefile
./server/Makefile
CXX = g++
LD = g++
LDFLAGS += -lboost_system -lboost_date_time -lboost_serialization -lmysqlcppconn
CXXFLAGS += -std=c++0x -I/usr/local/include -I/usr/local/include/cppconn
object = persone.o main.o database_helper.o persone_db.o address.o address_db.o
#objects := $(patsubst %.c,%.o,$(wildcard *.c))
vpath %.o ../src # в надежде что будет производиться поиск в том месте где предполагается что они там лежат, а не в текущей директории
vpath %.hpp ../include
server: $(object)
$(LD) $(LDFLAGS) $(object) -o server
include ../src/Makefile # для того чтобы загрузи, или выполнить правила указанные в этом файле, чтобы получить нужные .о
main.o: main.cpp persone.hpp persone_db.hpp address.hpp address_db.hpp database_helper.hpp
$(CXX) $(CXXFLAGS) -c main.cpp
database_helper.o: database_helper.hpp database_helper.cpp
$(CXX) $(CXXFLAGS) -c database_helper.cpp
persone_db.o: persone_db.cpp persone_db.hpp persone.hpp address_db.hpp address.hpp database_helper.hpp
$(CXX) $(CXXFLAGS) -c persone_db.cpp
address_db.o: address_db.cpp address_db.hpp address.hpp persone.hpp persone_db.hpp database_helper.hpp
$(CXX) $(CXXFLAGS) -c address_db.cpp
.PHONY : clean
clean :
-rm -f server $(object)
1. Самый главный. Строчку include ../src/Makefile не приводит к выполнению правил. В следствии чего при линковке в главном правиле gcc сурово ругается на undefine reference.
2. Остальные вопросы такие же, правильно юзание clean, поместить *.o в определенную директория, и взять из от туда же.
------------------------------------------------------------
Дальше делать пока смысла нет. Если поможите разобраться с этими вопросами то далее все по аналогии будет.
____________________________________________________________
Граждони форумчани, помогите разобраться :)