У меня небольшой проект, который строит несколько целей из одних и тех же исходных файлов.Цели требуют сборки исходных файлов с разными флагами компиляции.Это на самом деле на Cygwin, поэтому я буду использовать это в качестве конкретного примера, хотя я полагаю, что это общая проблема.
Так что это будет пример Makefile:
a: CFLAGS =
a: a.o c.o
b: CFLAGS = -mno-cygwin
b: b.o c.o
Это работает вВ принципе, сборка компиляции с CFLAGS не установлена, а компиляция b компилируется с CFLAGS, установленным в -mno-cygwin.Но только если co не существует.
Таким образом, выполнение
> make a b
в первичном каталоге сначала скомпилирует ac и cc с использованием пустых CFLAGS.Затем он попытается собрать b, используя CFLAGS = -mno-cygwin.Но поскольку co уже существует, он не будет перекомпилировать cc, что приведет к ошибкам компоновщика, поскольку объектные файлы должны иметь одинаковую настройку этого флага.
Опять же, флаг cygwin является лишь одним конкретным примером, и я ищууниверсальное решение.
Я попытался ввести дополнительную цель, проверяющую текущий CFLAGS, и удалить все объектные файлы, если она не совпадает:
ARCH = `echo $(CFLAGS)`
checkTarget:
-@if test "`cat .arch`" != "$(ARCH)"; then \
rm *.o; \
/bin/echo -n $(ARCH) > .arch; \
fi
Вставка этой цели в качестве зависимостипоскольку две цели гарантируют, что все объектные файлы будут перекомпилированы при необходимости.
a: CFLAGS =
a: checkTarget a.o c.o
b: CFLAGS = -mno-cygwin
b: checkTarget b.o c.o
Это, однако, перекомпилирует каждый объектный файл, который не нужен, и становится проблемой в большом проекте.
Есть ли лучший способ сделать это?
РЕДАКТИРОВАТЬ: В комментариях к одиночному ответу есть подсказка, что вы можете сделать объектные файлы зависимыми от содержимого CFLAGS.Я не могу понять, как это сделать, кроме как поместить их во временный файл и сравнить с предыдущими, а затем скопировать в зависимый файл.Нет лучшего способа?