Как заставить GNU make перекомпилировать один и тот же объектный файл, используемый в двух целях с разными флагами

Предположим, у вас есть makefile содержащий две цели, как показано ниже:

# targetA
X86CPPTARGET += targetA
targetA,SRCS = FILEA.cpp  FILEB.cpp commonFile.cpp
targetA.so,DEPSOL = libUsedByCommon1.cpp
targetA,CPPFLAGS += -Ifakeinclude -std=c++11

# tartargetBgetA
X86CPPTARGET += targetB
targetB,SRCS = FILEC.cpp  FILED.cpp commonFile.cpp
targetA.so,DEPSOL = libUsedByCommon2.cpp
targetB,CPPFLAGS += -std=c++11

targetA а также targetB поделиться файлом, а именно, commonFile.cpp который содержит ряд #included заголовки.
commonFile.o создается только один раз GNU make и используется повторно во время компиляции targetB,

CPPFLAGS присутствует в targetA заставляет компилятор использовать include, который содержит больше символов, чем тот, который находится в каталоге include по умолчанию. libUsedByCommon2 не экспортирует все дополнительные символы, содержащиеся в заголовке fakeinclude каталог и во время ссылки, это приводит к undefined reference,

В настоящее время я использую обходной путь, чтобы создать символическую ссылку на commonFile.cpp и использовать это в моем makefile только в одной цели.

# targetA
X86CPPTARGET += targetA
targetA,SRCS = FILEA.cpp  FILEB.cpp commonFile.cpp
targetA.so,DEPSOL = libUsedByCommon1.cpp
targetA,CPPFLAGS += -Ifakeinclude -std=c++11

# tartargetBgetA
X86CPPTARGET += targetB
targetB,SRCS = FILEC.cpp  FILED.cpp **commonFile_symbolic_link.cpp**
targetA.so,DEPSOL = libUsedByCommon2.cpp
targetB,CPPFLAGS += -std=c++11

Есть ли более чистое решение этой проблемы?
Есть ли способ заставить GNU make перекомпилировать commonFile.cpp когда используется другой путь включения?

3

Решение

Вы можете создать две новые цели, которые зависят от одного и того же файла C, с разными командами сборки, как в следующем примере …

commonFileA.o: commonFile.cpp
$(CC) -o $@ $^ -FlagsA

commonFileB.o: commonFile.cpp
$(CC) -o $@ $^ -FlagsB

Затем вы можете использовать «commonFileA.o» в качестве зависимости для связи в версии с этими конкретными флагами и т.д …

3

Другие решения

Возможно, вам следует попытаться скомпилировать один и тот же исходный файл, но с двумя разными выходными объектными файлами:

a0.o: MYFLAGS := foo bar
a0.o: a.c
a1.o: MYFLAGS := baz cux
a1.o: a.c

А затем, для зависимых целей, используйте либо a0.o или же a1.o как обязательное условие.

2

Один из способов сделать это — установить переменную и затем рекурсивно вызвать make с конкретной целью. Одним из преимуществ этого метода является то, что вы можете указать свои цели только один раз.

Это неполный извлечь, чтобы показать технику:

all: debug release

debug:
@echo -e "\n====== BUILDING DEBUG PROGRAM ======\n"@FLAGS="$(CXXFLAGS_DBG)" SUFFIX="-debug" $(MAKE) general

release:
@echo -e "\n====== BUILDING RELEASE PROGRAM ======\n"@FLAGS="$(CXXFLAGS_REL)" $(MAKE) general

general: $(PROGRAM)$(SUFFIX)

$(PROGRAM)$(SUFFIX): $(SRC)/program.cpp
$(CXX) $(FLAGS) -o $@ $^
2