Подтвердить что ты не робот

Изменить значение переменной Makefile в зависимости от цели

Я не разбираюсь в make файлах, но привык к простым. Прямо сейчас у меня есть задача под рукой.

Мне нужно скомпилировать и связать тестовое приложение с другой библиотекой, а другой включить путь, основанный на заданной цели. Если целью является TARGET1, тогда ссылка на LIB1 и включить INCLUDEPATH1 во время компиляции. Аналогично, если заданная цель TARGET2, тогда скомпилируйте INCLUDEPATH2 в CFLAGS и свяжите с LIB2.

%.o: %.c
    @echo [CC]  $< ...
    $(CC) $(CFLAGS) -o $*.o $<

Теперь у меня есть правило, как указано выше, которое компилирует мое тестовое приложение. Теперь, как можно изменить CFLAGS на основе цели.

4b9b3361

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