#makefile
#makefile
Вопрос:
Я уже посмотрел онлайн и на другие вопросы о переполнении стека, но я не могу найти ответ, который устраняет мою проблему. Я использую CMake для сборки своего приложения, и я хочу назначить переменную с именем MYPATH
, которая хранит каталог. Мне нужно получить каталог, выполнив пользовательскую команду, которая выводит каталог. Как мне это сделать?
Это то, что я делаю прямо сейчас: export MYPATH=$(shell $(build_function //my//directory))
Когда я пытаюсь использовать $(MYPATH)
в другой команде, она пуста. build_function //my//directory
выводит строку, которую я хочу MYPATH
инициализировать как.
Ответ №1:
Взгляните на свою команду:
$(shell $(build_function //my//directory))
Первое, что делает make, это расширяет содержимое: переменные make вводятся с помощью $
, поэтому $(build_function //my//directory)
расширяется переменная make с именем build_function //my//directory
, которое явно не существует, поэтому расширяется до пустой строки, что приводит к этому:
$(shell )
которая ничего не делает.
Если вы хотите отправить $
в оболочку для интерпретации, вам нужно удвоить ее, чтобы избежать ее из make:
$(shell $$(build_function //my//directory))
Однако это выдает ошибку: почему? Если вы введете команду:
$(build_function //my//directory)
в командной строке вы увидите, что получаете ту же ошибку: $(...)
операция командной строки запускает команду и расширяется до выходных данных этой команды. В этом контексте оболочка попытается выполнить этот вывод. Вы не хотите этого, вы хотите получить результат. Вы могли бы сделать это вместо:
export MYPATH = $(shell echo $$(build_function //my//directory))
но это сложнее, чем вам нужно: вы должны просто написать свою команду следующим образом:
export MYPATH = $(shell build_function //my//directory)
Вероятно, вам следует рассмотреть возможность использования :=
вместо =
, если вы действительно не хотите запускать эту команду каждый раз при MYPATH
расширении, а не только один раз.