генерировать зависимости для make-файла для проекта на C / C ++ - PullRequest
34 голосов
/ 24 ноября 2008

У меня есть проект, в котором есть make-файл со сломанными зависимостями. Есть ли какой-либо самый известный способ создания списка зависимостей для проекта, который я могу использовать в make-файле, кроме проверки каждого исходного файла вручную или с помощью рукописного сценария perl?

Ответы [ 5 ]

48 голосов
/ 24 ноября 2008

Документация GNU make обеспечивает хорошее решение.

Абсолютно. g++ -MM <your file> создаст совместимый с GMake список зависимостей. Я использую что-то вроде этого:

# Add .d to Make's recognized suffixes.
SUFFIXES += .d

#We don't need to clean up when we're making these targets
NODEPS:=clean tags svn
#Find all the C++ files in the src/ directory
SOURCES:=$(shell find src/ -name "*.cpp")
#These are the dependency files, which make will clean up after it creates them
DEPFILES:=$(patsubst %.cpp,%.d,$(SOURCES))

#Don't create dependencies when we're cleaning, for instance
ifeq (0, $(words $(findstring $(MAKECMDGOALS), $(NODEPS))))
    #Chances are, these files don't exist.  GMake will create them and
    #clean up automatically afterwards
    -include $(DEPFILES)
endif

#This is the rule for creating the dependency files
src/%.d: src/%.cpp
    $(CXX) $(CXXFLAGS) -MM -MT '$(patsubst src/%.cpp,obj/%.o,$<)' $< -MF $@

#This rule does the compilation
obj/%.o: src/%.cpp src/%.d src/%.h
    @$(MKDIR) $(dir $@)
    $(CXX) $(CXXFLAGS) -o $@ -c $<

Примечание: $(CXX) / gcc команда должна быть с предшествующей жесткой вкладкой

Что это будет делать, так это автоматически генерировать зависимости для каждого файла, который изменился, и компилировать их в соответствии с тем правилом, которое у вас есть. Это позволяет мне просто записывать новые файлы в каталог src/ и автоматически компилировать их, зависимости и все.

19 голосов
/ 16 апреля 2012

Прочитав сейчас эту часть, в частности Я думаю, что есть гораздо более простое решение, если у вас достаточно свежая версия gcc / g ++. Если вы просто добавляете -MMD к вашему CFLAGS, определите переменную OBJS, представляющую все ваши объектные файлы, а затем выполните:

-include $(OBJS:%.o=%.d)

тогда вы получите эффективную и простую автоматическую систему построения зависимостей.

6 голосов
/ 24 ноября 2008

В препроцессоре GNU C cpp есть опция -MM, которая создает подходящий набор зависимостей на основе шаблонов включения.

4 голосов
/ 25 ноября 2012

Я просто добавляю это в make-файл, и он прекрасно работает:

-include Makefile.deps

Makefile.deps:
    $(CC) $(CFLAGS) -MM *.[ch] > Makefile.deps
0 голосов
/ 25 ноября 2008

Компилятор Digital Mars C / C ++ поставляется с инструментом makedep .

...