Переопределение неявного правила определенных целей без вмешательства в -MMD
Скажи, у меня есть простой Makefile
вот так:
CXXFLAGS+=-O3 -Wall -pednatic -MMD -Isrc
SRCS=$(shell find src -name '*.cpp')
OBJS=${SRCS:.cpp=.o}
TEST_SRCS=$(shell find test -name '*.cpp')
TEST_OBJS=${TEST_SRCS:.cpp=.o}
all: bin/product
bin/product: $(OBJS)
$(CXX) ($CXX_FLAGS) -o $@ $^
test: test/runner
./test/runner
test/runner: $(TEST_OBJS) $(OBJS)
$(CXX) ($CXX_FLAGS) -o $@ $^
-include ${OBJS:.o=.d}
-include ${TEST_OBJS:.o=.d}
.PHONY: all test
Здесь важно отметить, что у меня есть две отдельные двоичные цели (одна постановка с объектами из src/
и один тестовый бегун с объектами из обоих src/
а также test/
). Я хочу изменить CXXFLAGS
только для целей в тесте (test/runner
, но также test/foo_test.o
) но не в src
, Конечно, я мог бы определить свое собственное правило для переопределения неявного (обратите внимание на -Itest
, что является одним из многих различий в том, как я хотел бы скомпилировать тесты):
test/%.o: test/%.cpp
$(CXX) $(CXXFLAGS) -Itest -c -o $@ $^
Но это имеет печальное последствие переопределения зависимостей от включенного *.d
файлы, созданные -MMD
, Например test/foo_test.d
:
test/foo_test.o: test/foo_test.cpp src/foo.o
Есть ли способ переопределить неявное правило для объектов в test/
без потери зависимостей?
1 ответ
Вы можете определить или изменить make-переменные для каждой цели (см. Документацию GNU make):
$(TEST_OBJS): CXX_FLAGS += -Itest
Заметки:
- Вы не должны использовать то же самое
CXX_FLAGS
для компиляции и компоновки. Варианты разные. Например, вы не проходите-I...
варианты компоновщика. использованиеLDFLAGS
вместо ссылки. - Ваш Makefile использует
CXXFLAGS
а такжеCXX_FLAGS
, Проверь в своем вопросе? Стандартная переменная make для передачи параметров компилятору C++:CXXFLAGS
неCXX_FLAGS
,