Целевой делают переменные

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

С другой стороны, можно рассматривать это как проблему обработки текста и вызов awk сделать целую обработку.

Если Ваша фактическая задача требует передачи каждого числа к отдельной команде, можно использовать xargs. xargs имеет странный формат ввода, но если Ваш вход не имеет ни одного из \'" Вы не должны волноваться об этом.

3
11.03.2015, 15:42
2 ответа

Ваша проблема связана с тем, как GNUMake разбирает файл make.

GNU make делает свою работу в два отдельных этапа. На первом этапе она читает все makefiles, включенные 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, но компилируется по-разному в зависимости от установленных вами флагов.

1
27.01.2020, 21:31
Переменные

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)

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

1
14.04.2020, 17:40

Теги

Похожие вопросы