Makefile-изменение значения переменной в зависимости от цели
Я не разбираюсь в makefiles, но привык к простым. Сейчас у меня есть задание.
Мне нужно скомпилировать и связать тестовое приложение с другой библиотекой и другим путем включения на основе заданной цели. Если target-TARGET1, то ссылка на LIB1 и включение INCLUDEPATH1 во время компиляции. Аналогично, если заданной целью является TARGET2, то компиляция с INCLUDEPATH2 в CFLAGS и ссылка с LIB2.
%.o: %.c
@echo [CC] $< ...
$(CC) $(CFLAGS) -o $*.o $<
теперь у меня есть правило, как указано выше который компилирует мое тестовое приложение. Теперь, как можно изменить CFLAGS на основе цели.
2 ответов
если вы используете 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 файлы - которые довольно усложнят ваш makefile.
кроме того, если вы вводите make target1
затем -IINCLUDEPATH1
будет распространяться на компиляцию разное.c, как хотелось бы. Однако, если вы наберете make misc.o
у него нет способа узнать, что это в конечном итоге предназначено для target1 и сборник разное.c не получит специального значения $CFLAGS (хотя он получит глобальный, если он есть).
так что это действительно полезно только в простых случаях. Но, может быть, ваш случай достаточно прост.
Я не думаю, что вы можете изменить переменную в зависимости от цели. Предположим, вы вызываете
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 -l $(CFLAGS)
endef
TARGET1: a.c
$(call compile_cmd,INCLUDEPATH1,LIB1) -o $@ $<
TARGET2: a.c
$(call compile_cmd,INCLUDEPATH2,LIB2) -o $@ $<
%.o: %.c
$(call compile_cmd,INCLUDEPATH_DEFAULT,LIB_DEFAULT) -o $@ $<
Это было бы неплохо достаточно и гибкий Makefile, который соответствует вашим потребностям.