Изменить значение переменной Makefile в зависимости от цели - PullRequest
13 голосов
/ 16 июля 2010

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

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

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

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

Ответы [ 2 ]

30 голосов
/ 16 июля 2010

Если вы используете 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

Однако это работает не так хорошо, как хотелось бы: if target1 и target2 делятся некоторыми исходными файлами, вам нужно будет организовать их компиляцию по два раза и файлов .o с разными именами, что довольно усложнит ваш make-файл.

Кроме того, если вы наберете make target1, то -IINCLUDEPATH1 будет распространяться на компиляцию misc.c , по желанию.Однако, если вы наберете make misc.o, он не сможет узнать, что это в конечном итоге предназначено для target1 , и компиляция misc.c не получит специального значения $ CFLAGS (хотяя получу глобальный, если он есть).

Так что это действительно полезно только в простых случаях.Но, возможно, ваш случай достаточно прост.

1 голос
/ 16 июля 2010

Я не думаю, что вы можете изменить переменную в зависимости от цели.Предположим, что вы вызываете

make TARGET1 TARGET2

Какое значение тогда будет иметь CFLAGS?

В этом случае вы можете использовать не шаблонные правила для различения целей.

TARGET1: a.c
    @echo [CC] $< ...
    $(CC) -I INCLUDEPATH1 ...

TARGET2: a.c
    @echo [CC] $< ...
    $(CC) -I INCLUDEPATH2 ...

Чтобы уменьшить количество повторений, вы также можете использовать переменные и « functions ».Затем вы могли бы повторно использовать то, что было бы основой вашего шаблонного правила в других правилах.

define compile_cmd
    @echo [CC] $< ...
    $(CC) -I $1 -l$2 $(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 $@ $<

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...