Постоянные переменные Makefile - PullRequest
1 голос
/ 01 марта 2011

Я хочу, чтобы мой Makefile вызывался так:

make x11 oss bin

что должно привести к компиляции файлов: main.c x11.c oss.c и связать их в один исполняемый файл bin.

Другой способ вызвать его:

make x11 alsa bin

, который должен делать то же самое, но с main.c x11.c alsa.c

Это мой Makefile:

bin: $(OBJ) main.o
    $(CC) $(LDFLAGS) $(OBJ) main.o $(LDLIBS)
x11:
    set OBJ += bsd.o
oss:
    set OBJ += oss.o
alsa:
    set OBJ += alsa.o
.c.o:
    $(CC) $(CFLAGS) -c $<

но кажется, что содержимое переменной OBJ не является постоянным в рецептах. Есть предложения?

Ответы [ 2 ]

1 голос
/ 01 марта 2011

OBJ является постоянным, но у вас есть другая проблема:

  • Сначала Makefile полностью разбирается make. И, таким образом, $ OBJ все еще не установлен / пуст на этом этапе. Следовательно, цель bin получает main.o в качестве зависимости, так как все переменные на этом этапе заменяются их значениями.
  • Затем OBJ обновляется своим содержимым, используя указанные цели в командной строке. Но OBJ больше не используется для цели bin, так как make завершает сборку зависимостей. (Makefile обычно не анализируется второй раз)

Хитрость в том, чтобы заполнить переменную OBJ до анализа. Простое решение - вызвать Makefile, используя:

make "OBJ=x11 oss" bin

и немного измените Makefile, чтобы добавить .o -часть (или просто добавьте их в команду make):

bin: $(patsubst %,%.o,$(OBJ)) main.o
    $(CC) $(LDFLAGS) $(OBJ) main.o $(LDLIBS)
.c.o:
    $(CC) $(CFLAGS) -c $<

Примечание : Я сказал: «Обычно Makefile не анализируется второй раз». можно рекурсивно использовать Makefile несколько раз. Это очень сложно и, вероятно, не требуется в 99% случаев. Примером такого «оскорбления» является OpenWRT buildsystem . trunk / Makefile является примером Makefile, который вызывается несколько раз сам по себе.

0 голосов
/ 01 марта 2011

Это что-то вроде хака.

Добавьте это в начало вашего Makefile:

OBJ := $(filter-out bin,${MAKECMDGOALS})

Теперь, когда вы набираете make x11 oss bin, выполняйте синтаксический анализ.это:

OBJ := x11 oss

и для make x11 alsa bin будет отображаться

OBJ := x11 alsa

Возможно, вам придется удалить команды оболочки для x11 et.и др.поскольку set OBJ += bsd.o не является допустимой оболочкой.

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