Создание зависимостей для gcc

Я пишу Makefile для компиляции очень длинного проекта. В основном, я определил все объекты, в которых я нуждаюсь. Проблема возникает, когда мне нужно генерировать зависимости. Я делаю что-то вроде этого:

a.o: $( $(CXX) -MM $(INCLUDE) A/a.cpp | sed 's/a.o: //')
 $(CXX) $(CXXFLAGS) $(INCLUDES) A/a.cpp

b.o: $( $(CXX) -MM $(INCLUDE) A/b.cpp | sed 's/b.o: //')
 $(CXX) $(CXXFLAGS) $(INCLUDES) A/b.cpp

libab.a: a.o b.o
 $(LXX) $(LXXFLAGS) libab.a a.o b.o

Вывод "$ (CXX) -MM $ (INCLUDE) A/a.cpp | sed 's/ao://'" перечисляет все зависимости, которые необходимо компилировать a.cpp, поэтому я пытаюсь установить вывод этой команды, как зависимости, когда я объявляю объект, но он не работает.

У вас есть идея о том, как это сделать?

Благодарю.

1 ответ

Почему вы пытаетесь удалить целевой префикс, который именно вы уже набрали вручную?

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

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

Мои обычные флаги для автоматического создания .d (dependency):

CPPFLAGS+=-MMD # automatic .d dependency file generation

Это похоже на -MD, за исключением того, что упоминаются только файлы заголовков пользователя, а не файлы заголовков системы.

Образец:

# BUILD=RELEASE

PRJNAME=demo
#
TARGETS+=bin/test

build: \
 $(TARGETS) \
 tags

all: build

clean:
 rm -rf bin/* $(ALL_OBJ_FILES)
 rm -rf $(ALL_CPP_FILES:%.cpp=%.d)

##############################
# definition
CC=gcc
CXX=g++

CPPFLAGS+=-MMD # automatic .d dependency file generation
CPPFLAGS+=-std=c++11

ifeq ($(BUILD),RELEASE)
 CPPFLAGS+=-g -O3
 CPPFLAGS+=-march=native
else
 CPPFLAGS+=-g -O0
 CPPFLAGS+=-DDEBUG -D_DEBUG
 CPPFLAGS+=-DUNIT_TESTS
endif

CPPFLAGS+=-Wall -Wextra -pedantic
#CPPFLAGS+=-Werror

LDFLAGS+=-lpthread

ALL_CPP_FILES=A/a.cpp A/b.cpp
ALL_OBJ_FILES=$(patsubst %.cpp,%.o,$(ALL_CPP_FILES))

##############################
tags: $(ALL_CPP_FILES)
 ctags -R A/

%.o: %.cpp
 $(CXX) -c $(CPPFLAGS) $< -o $@

##############################
# tool targets
bin/test: $(ALL_OBJ_FILES)
 mkdir -pv $(@D)
 $(CXX) $^ $(LDFLAGS) -o $@

.PRECIOUS: S(ALL_OBJ_FILES)
.PHONY: clean all build

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

licensed under cc by-sa 3.0 with attribution.