Изменить значение переменной Makefile в зависимости от цели
Я не разбираюсь в make файлах, но привык к простым. Прямо сейчас у меня есть задача под рукой.
Мне нужно скомпилировать и связать тестовое приложение с другой библиотекой, а другой включить путь, основанный на заданной цели. Если целью является TARGET1, тогда ссылка на LIB1 и включить INCLUDEPATH1 во время компиляции. Аналогично, если заданная цель TARGET2, тогда скомпилируйте INCLUDEPATH2 в CFLAGS и свяжите с LIB2.
%.o: %.c
@echo [CC] $< ...
$(CC) $(CFLAGS) -o $*.o $<
Теперь у меня есть правило, как указано выше, которое компилирует мое тестовое приложение. Теперь, как можно изменить CFLAGS на основе цели.
Ответы
Ответ 1
Если вы используете GNU Make, вы можете использовать целевые переменные:
target1: CFLAGS = -IINCLUDEPATH1
target1: LDLIBS = -lLIB1
target2: CFLAGS = -IINCLUDEPATH2
target2: LDLIBS = -lLIB2
all: target1 target2
target1: target1.o misc.o
target2: target2.o
Однако это не работает так же хорошо, как вам бы хотелось: если target1 и target2 совместно используют некоторые исходные файлы, вам нужно будет организовать их для каждого скомпилировать дважды и по-разному .O файлы - который скорее усложнит ваш make файл.
Кроме того, если вы наберете make target1
, тогда -IINCLUDEPATH1
будет распространяться на компиляцию файла misc.c, если требуется. Однако, если вы наберете make misc.o
, у него нет способа узнать, что это в конечном итоге предназначено для target1, а компиляция misc.c не получит специального значения $CFLAGS (хотя он получит глобальный, если он есть).
Так что это действительно полезно только в простых случаях. Но, возможно, ваш случай достаточно прост.
Ответ 2
Я не думаю, что вы можете изменить переменную в зависимости от цели. Предположим, вы вызываете
make TARGET1 TARGET2
Какое значение будет иметь CFLAGS
?
В этом случае вы можете использовать правила без шаблонов для различения целей.
TARGET1: a.c
@echo [CC] $< ...
$(CC) -I INCLUDEPATH1 ...
TARGET2: a.c
@echo [CC] $< ...
$(CC) -I INCLUDEPATH2 ...
Чтобы уменьшить повторение, вы также можете использовать переменные и функции". Затем вы можете повторно использовать то, что будет телом вашего шаблона в разных правилах.
define compile_cmd
@echo [CC] $< ...
$(CC) -I $1 -l$2 $(CFLAGS)
endef
TARGET1: a.c
$(call compile_cmd,INCLUDEPATH1,LIB1) -o [email protected] $<
TARGET2: a.c
$(call compile_cmd,INCLUDEPATH2,LIB2) -o [email protected] $<
%.o: %.c
$(call compile_cmd,INCLUDEPATH_DEFAULT,LIB_DEFAULT) -o [email protected] $<
Это сделало бы достаточно хороший и гибкий make файл, который бы соответствовал вашим потребностям.