Для этой простой арифметической задачи можно придерживаться для окружения встроенных конструкций и вызова read
чтобы читать и разделить первую строку или использование управляют, чтобы замена считала вход и разделила его.
С другой стороны, можно рассматривать это как проблему обработки текста и вызов awk
сделать целую обработку.
Если Ваша фактическая задача требует передачи каждого числа к отдельной команде, можно использовать xargs
. xargs
имеет странный формат ввода, но если Ваш вход не имеет ни одного из \'"
Вы не должны волноваться об этом.
Ваша проблема связана с тем, как GNUMake разбирает файл make.
GNU make делает свою работу в два отдельных этапа. На первом этапе она читает все makefiles, включенные makefiles и т.д. и интернализирует все переменные и их значения, неявные и явные правила, а также строит график зависимостей всех целей и их предпосылок. На втором этапе, используя эти внутренние структуры, определяет, какие цели нужно будет перестроить, и вызывает правила, необходимые для этого.
Похоже, что при запуске make debug
зависимость заключается в запуске all:
, который выводит значение, как если бы вы запустили make all
. Вам нужно изменить makefile так, чтобы all
и debug
вызывали одну и ту же зависимость. Обычно вы увидите что-то вроде
all: $(executable)
debug: $(executable)
$(executable): $(objs)
<compile objects to executable>
debug
никогда не срабатывает all
, но в любом случае исполняемый файл скомпилирован.
Что касается вашего кода:
X = release
debug: X = debug
Y = $(X)
BUILD = $(Y)
.PHONY: print
print:
@echo $(BUILD)
all: print
debug: print
мне пришлось сделать так, чтобы распечатка была фальшивой зависимостью, так как она не является реально создаваемым объектом. Иначе это была бы ваша зависимость, которая требуется и для debug
, и для all
, но компилируется по-разному в зависимости от установленных вами флагов.
Y
и BUILD
являются просто расширенными переменными , поскольку они присваиваются с использованием :=
(, а не =
), дополнительную информацию см. в руководстве . В основном переменная назначается , когда переменная определена , что мешает вам делать то, что вы хотите.
Но целевые переменные -должны иметь приоритет над глобальными, поэтому переопределение переменной BUILD
будет работать, так как она затеняет глобальную переменную BUILD
в областиdebug:
(и, следовательно,all:
)цель:
X = release
debug: BUILD = debug
debug: all
Y := $(X)
BUILD := $(Y)
all:
@echo $(BUILD)
Обратите внимание, что использование debug: Y = debug
вместо этого не работает, так как BUILD
сама по себе является просто развернутой переменной.
Я не могу точно понять, почему что-то вроде debug: X := debug
не работает. Но я предполагаю, что целевые -конкретные переменные разрешаются после глобальных просто расширенных переменных. Это также, вероятно, причина, по которой целевая -конкретная переменная BUILD
может затенять глобальную переменную в моем решении.
Обратите внимание, что ответ @jecxjo частично неверен. Что мешает вам переопределить назначениеY
(или BUILD
), так это то, что им назначено :=
, а не =
. т.е. ваш исходный код, использующий =
вместо :=
, делает именно то, что вы хотите:
X = release
debug: X = debug
debug: all
# Note the '=' assignment instead of the ':='
Y = $(X)
BUILD = $(Y)
all:
@echo $(BUILD)
На самом деле это то изменение, которое решает вашу проблему в его ответе, а не переписывает цели. Но поскольку вы упомянули, что эти задания включены в другой файл, который вы не можете редактировать, это не решение.