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, который соответствует вашим потребностям.