Переопределение неявного правила определенных целей без вмешательства в -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,
Другие вопросы по тегам