Экспорт переменных среды в оболочку Makefile - PullRequest
10 голосов
/ 07 марта 2012

Я хочу немедленно развернуть команду оболочки в Makefile, но я хочу, чтобы команда оболочки имела доступ к переменным окружения в Makefile.Если я использую $ (shell ...), он сразу расширяется, но нет доступа к переменным.Если я использую обратные кавычки, расширение не является немедленным, и оно вызывает проблемы для меня позже в Makefile.Мне интересно, есть ли какой-нибудь способ сделать немедленное расширение обратных кавычек или передать текущую среду команде $ (shell).

Например, следующий make-файл:

SOME_VAR := some_val
export SOME_VAR

VAR1 := `echo $$SOME_VAR`
export VAR1
VAR2 := `echo $$VAR1`

all:
      @echo VAR1=$(VAR1)
      @echo VAR2=$(VAR2)

Будет выводить:

~/tmp/t2> make
VAR1=some_val
VAR2=`echo $SOME_VAR`

Где я хочу напечатать "VAR2 = some_val".Реальный пример немного сложнее (переменные среды наследуются от родительских make-файлов, и я пытаюсь использовать сценарий perl для редактирования переменных), но принцип тот же.

Любая помощь приветствуется.

Ответы [ 5 ]

6 голосов
/ 10 марта 2012

Это то, что вы хотите?

VAR2 := $(shell VAR1="$(VAR1)" script_that_uses_var1)

4 голосов
/ 07 марта 2012

Что с этим не так?

VAR1 := $(shell echo $(SOME_VAR))
VAR2 := $(shell echo $(VAR1))
1 голос
/ 11 мая 2018

Вы можете попробовать использовать Специальное имя встроенной цели : .EXPORT_ALL_VARIABLES

.EXPORT_ALL_VARIABLES:

MY_VAR = foo

test:
  @echo $$MY_VAR
1 голос
/ 20 февраля 2013

Вот, пожалуйста:

экспорт FOO = бар

Вот страница с гораздо большей информацией: http://www.cmcrossroads.com/article/basics-getting-environment-variables-gnu-make?page=0%2C1

1 голос
/ 19 марта 2012

Как я упоминал в некоторых комментариях, моя настоящая цель состояла в том, чтобы заставить скрипт генерировать имена файлов на основе настроек, с которыми компилировался объект. Затем мне нужен другой скрипт для генерации специально отформатированного списка всех сгенерированных имен файлов (цель - встроенная система, в которой нет JIT-компилятора). В любой момент времени существует более тридцати настроек, которые потенциально могут влиять на двоичный файл, и это может использоваться в более чем одном модуле в будущем, поэтому я хотел бы что-то масштабируемое.

Мое решение заключается в следующем. Вместо того, чтобы передавать переменные, я изменил свой скрипт, чтобы вывести строку, доступную для makefile-файла, основываясь на настройках:

-include $(SOME_MK_FILE)

$(SOME_MK_FILE) : .phony
    script.pl $(SETTINGS_OF_INTEREST_LIST) > $(SOME_MK_FILE)

someFilename := $(shell script2.pl $(VAR1))

script.pl выводит строку, которая выглядит примерно так:

VAR1 := CONFIG_X1=$(CONFIG_X1) CONFIG_X2=$(CONFIG_X2) CONFIG_X33=$(CONFIG_X33)

и script2 выводит имя файла, которое выглядит примерно так: 'someFilename.X1_y.X2_n.elf'

, а затем, в другом правиле, у меня есть:

someobj: somedep
    script3.pl $(someFilename) >> builtfiles.txt

, который правильно собирает buildfiles.txt (который, в свою очередь, является входом для еще одного скрипта ...). В конце концов, это обходной путь к тому факту, что make не может передать свою среду в $ (shell). Это не слишком красиво, но это работает.

John

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...