На основе ответов, cпасибо вам, сделал такой вот скрипт:
CPP = $(shell find "cpp/" -name "*.cpp")
DFILE = dependence.d
Programm: $(patsubst %.cpp, %.o, $(CPP))
g++ -MM $(CPP) >$(DFILE)
g++ -o Programm $(patsubst %.cpp, %.o, $(CPP))
%.o: %.cpp
g++ -c -o $@ $^
include $(DFILE)
Но он не ведет учет зависимостей, которые находятся в DFILE, а они есть там, генерация проходит верно. Как я неправильно пользуюсь include?
1 Узнаю все файлы в cpp/*.cpp
3 Объявляю переменную для хранения имени файла зависимости DFILE = dependence.d
4 Цель Programm, переименовываю сpp на o в строчке зависимостей
5 Генерация файла зависимостей
6 Сборка на основе прописанных зависимостей на 6той строке, все зависимости, для цели,
выполнятся по правилу на 10той строке
Тк во время первой сборки файл пуст DFILE - никаких дополнительных зависимостей нет.
Во второй сборке, я изменил SubClass.h, все эти действия повторяются и должны быть учтены зависимости созданные при прошлой сборке - файл зависимостей не пуст, но этого у меня никак не получается.
PS: Я в прогрессе сделаю отдельную цель Dependence, для обновления зависимостей, но мне бы с этим разобраться.
Файл зависимостей:
SubClass.o: cpp/SubClass.cpp cpp/../h/SubClass.h \
cpp/../h/../h/SuperClass.h
SuperClass.o: cpp/SuperClass.cpp cpp/../h/SuperClass.h
Main.o: cpp/Main.cpp cpp/../h/SuperClass.h cpp/../h/SubClass.h \
cpp/../h/../h/SuperClass.h
Ответ
я бы порекомендовал отказаться от идеи раскладывать файлы по каталогам в зависимости от их суффикса: мне кажется, это плохая идея.
но если «очень нужно», то вот makefile, который, надеюсь, выполняет именно то, что требуется:
CPP = $(wildcard cpp/*.cpp)
objects = $(patsubst cpp/%.cpp,%.o,$(CPP))
DFILE = dependence.d
Programm: $(objects); g++ -o $@ $^
$(DFILE):; g++ -MM $(CPP) >$(DFILE)
%.o: cpp/%.cpp; $(COMPILE.cpp) $(OUTPUT_OPTION) $<
include $(DFILE)
сначала надо создать файл с зависимостями:
$ make dependence.d
а затем уже всё остальное:
$ make
Комментариев нет:
Отправить комментарий