Автоматические зависимости заголовка с помощью gmake - PullRequest
2 голосов
/ 08 сентября 2011

EDITED

Я пытаюсь перекомпилировать исходные файлы без указания заголовочных файлов для каждого CPP в make-файле.

Я до:

#CoreObj1.cpp(and .h)
#CoreObj2.cpp(and .h)

#This is the makefile.

CORE_COMPONENT_OBJECTS = \
  obj/CoreObj1.o \
  obj/CoreObj2.o \

# Objects
obj/%.o: %.cpp obj/%.d
        @mkdir -p obj
        $(CXX) $(CXX_CFLAGS) -c $*.cpp -o $@

# Dependencies
obj/%.d: %.cpp
        @mkdir -p obj
        $(CXX) $(CXX_CFLAGS) -MM -MF $@ $<

DEPS = $(CORE_COMPONENT_OBJECTS:.o=.d)

ifneq ($(MAKECMDGOALS),clean)
-include $(DEPS)
endif   

Но изменение заголовочных файлов не приводит к перекомпиляции исходных файлов, включая их,

ПРИМЕЧАНИЕ: На самом деле, это работает, если мои .o, .d и .cpp находятся в одной папке. Но если мои .d и .o находятся в папке obj /, это не вызывает перекомпиляцию.

Ответы [ 3 ]

4 голосов
/ 09 сентября 2011

У людей часто есть такие правила для генерации зависимости, но они действительно не нужны.

При первом создании проекта не требуется никаких зависимостей, поскольку он все равно создает все источники. Только последующие сборки требуют, чтобы зависимости от предыдущей сборки определяли, что нужно перестраивать.

Следовательно, зависимости действительно являются побочным продуктом компиляции. Ваши правила должны выглядеть следующим образом:

#CoreObj1.cpp(and .h)
#CoreObj2.cpp(and .h)

#This is the makefile.

CORE_COMPONENT_OBJECTS = \
  obj/CoreObj1.o \
  obj/CoreObj2.o \

# Objects
obj/%.o: %.cpp
        @mkdir -p obj
        $(CXX) $(CXX_CFLAGS) -c -o $@ -MD -MP -MF ${@:.o=.d} $<

DEPS = $(CORE_COMPONENT_OBJECTS:.o=.d)

ifneq ($(MAKECMDGOALS),clean)
-include $(DEPS)
endif   

Как примечание стороны, mkdir -p не является параллельным, сделайте дружелюбным. Например, когда два или более процессов стремятся создать /a/b/c/ и /a/b/cc/, когда /a/b/ не существует, один процесс mkdir может завершиться с ошибкой EEXIST, пытаясь создать /a/b/.

0 голосов
/ 09 сентября 2011

Файл зависимостей не является обязательным условием для правила компиляции.Должно быть что-то вроде этого:

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

obj/%.o: %.cpp %.d
    $(CXX) $(CXXFLAGS) -o $@ -c $<

-include $(SRC:%.cpp=%.d)

Последняя строка добавляет зависимость от заголовков.

EDIT

Я вижу, у вас есть

-include $(DEPS)

, нопроверьте с помощью $ (предупреждение DEPS = $ (DEPS)) , действительно ли вы включаете существующие файлы, в противном случае просто игнорируйте их.

0 голосов
/ 09 сентября 2011

Лучше использовать SCons/CMake/bjam для решения "проблемы зависимостей заголовка", чем использовать make

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...