Как я могу запустить две цели make-файла, чтобы вторая использовала переменные первой? - PullRequest
0 голосов
/ 15 ноября 2018

Я пишу make-файл, который имеет несколько целей для архитектур и типов сборок. Когда я вызываю make, я хотел бы иметь возможность передать ему две цели, такие как:

make x86 debug

Где цель архитектуры устанавливает переменные, которые будут использоваться целью сборки. Цель архитектуры может выглядеть так:

.PHONY: x86
x86: NAME_PREFIX = x86_64_Linux
x86: TARGET_TRIPLE = x86_64-pc-linux-elf
x86: CC = gcc
x86: CFLAGS += -fomit-frame-pointer

Первая проблема: если я запускаю две цели, make пропускает первую цель, поскольку она ничего не делает, кроме как устанавливает переменные.

$ make x86 debug
make: Nothing to be done for `x86'.

Вторая проблема: даже если бы она запускала первую цель, я понимаю, что значения не будут сохранены, когда make все равно начнет запускать вторую цель.

На данный момент я использую цели, которые устанавливают переменные и добавляют цель типа сборки в качестве предварительного условия в конце тела цели, но в итоге мне понадобится цель для каждой комбинации архитектуры и типа сборки.

.PHONY: x86_debug
x86_debug: NAME_PREFIX = x86_64_Linux
x86_debug: TARGET_TRIPLE = x86_64-pc-linux-elf
x86_debug: CC = gcc
x86_debug: CFLAGS += -fomit-frame-pointer
x86_debug: debug

1 Ответ

0 голосов
/ 15 ноября 2018

Ваш второй подход лучше. Но вам не нужна цель для каждой комбинации, если вы используете последовательную схему именования и используете целевые символы подстановки:

.PHONY: x86_% arm_% # etc
.PHONY: %_debug %_optimised # etc

x86_%: NAME_PREFIX = x86_64_Linux
x86_%: TARGET_TRIPLE = x86_64-pc-linux-elf
x86_%: CC = gcc
x86_%: CFLAGS += -fomit-frame-pointer

arm_%: NAME_PREFIX = ARM_LINUX
arm_%: TARGET_TRIPLE = arm-linux-eabi
arm_%: CC = arm-linux-gcc


%_debug: CFLAGS += -g

%_optimised: CFLAGS += -O3
...