2016-09-28 2 views
0

Я ничего не нашел об этом, и я пытаюсь написать это правило в своем Makefile.Print Makefile variable как текст

setenv: 
    @echo "export DYLD_LIBRARY_PATH=." 
    @echo "export DYLD_INSERT_LIBRARIES=$(NAME).so" 
    @echo "export DYLD_FORCE_FLAT_NAMESPACE=1" 
    @echo "# Run eval $$(make setenv)" 

Так, запустив eval $(make setenv) в моем терминале, переменная окружения будет установлена.

Но он начинает бесконечный цикл.

Я также попробовать с:

\$(make setenv) 

но ничего не работа ... Что такое правильный синтаксис для этого?

EDIT:

\$$(make setenv) ли трюк!

+0

Что вы пытаетесь достичь? Почему команды экспорта повторяются? '$$ (...)' будет расширяться до '$ (...)', что является заменой оболочки. –

+0

В последней строке написано, что команда запускает их с помощью 'eval'. Я обнаружил, что более чистый, чем '$ (shell export ...)' –

+0

Если вы просто используете Makefile для установки окружения vars для чего-то другого, сценарий оболочки подойдет вам лучше. Если вам нужны эти варны для других рецептов, см. Мой ответ. –

ответ

1

Если вы устанавливаете переменные среды для других рецептов, обратите внимание, что:

  • Использование $(shell export ...) не будет работать: $(shell ...) всегда порождает новую оболочку, поэтому все, что экспортируется в него не будут доступны вне этого конкретного вызова;
  • Использование команд export оболочки в рецепте будет работать только в том случае, если используется .ONESHELL (не рекомендуется), так как каждая строка рецепта работает в другой оболочке.

Типичный способ экспортировать переменные окружения в суб-брендов и суб-оболочек использовать export как директива Makefile, например:

export DYLD_LIBRARY_PATH=. 
export DYLD_INSERT_LIBRARIES=$(NAME).so 
export DYLD_FORCE_FLAT_NAMESPACE=1 

Вне любой рецепт.

Смежные вопросы