Как запустить команду внутри переменной в Makefile?

#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 расширении, а не только один раз.