2012-03-07 3 views
9

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

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

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-скрипт для редактирования переменных), но принцип тот же.

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

ответ

1

Как я уже говорил в некоторых комментариях, моя фактическая цель состояла в том, чтобы сделать сценарий генерировать имена файлов, основанные на параметрах объекта был быть скомпилированы с. Затем мне нужен другой скрипт для создания специально отформатированного списка всех созданных файлов (цель - встроенная система, на которой нет 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) 

и Скрипт2 выводит имя файла, который выглядит как «someFilename.X1_y.X2_n.elf»

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

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

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

Джон

4

Что случилось с этим?

VAR1 := $(shell echo $(SOME_VAR)) 
VAR2 := $(shell echo $(VAR1)) 
+0

Ммм ... да, мой пример был испорчен. ..В приведенном выше примере VAR1 расширяется в Makefile, но мне нужно, чтобы VAR1 расширялся в сценарии оболочки. То есть, я вызываю скрипт perl, которому необходимо получить доступ к ENV {'VAR1'}. Если вызывается из $ (shell ...), скрипт не будет знать, что такое VAR1. Я отредактирую свой вопрос с лучшим примером. Благодарю. – John

+0

@ Джон, я действительно не понимаю, что вы пытаетесь сделать здесь. Я мог бы сделать несколько догадок, но я думаю, что это будет быстрее, если вы отредактируете свой вопрос. – Beta

+0

То, что я действительно пытаюсь сделать: У меня есть файл makefile, который должен создать объектный файл и называть его в соответствии с настройками конфигурации, с которыми он был построен. У меня есть скрипт perl, который переводит настройки конфигурации в имя. Чтобы это работало, скрипт perl должен иметь доступ к настройкам конфигурации (для этого нужно использовать обратные кавычки). Это было бы прекрасно само по себе, но тогда имя должно использоваться в другом скрипте perl. Поскольку имя не расширяется к моменту запуска второго скрипта, это вызывает ошибку. Я ищу обходной путь. – John

5

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

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

+0

Не совсем, нет. Я хочу создать определенные двоичные файлы и называть их в соответствии с текущей конфигурацией. Хотя я могу явно экспортировать каждый из настроек, которые я хочу, это решение не очень масштабируемо. Итак, что мне нужно сделать, это запустить скрипт, который имеет доступ ко всем настройкам make-файла. Затем он сможет вывести имя файла. Имя файла, которое впоследствии должно быть передано в другой скрипт позже, поэтому имя файла должно будет разрешиться раньше, чем позже. – John

+1

Возможно, это не помогло ОП, но это был именно то, что мне нужно для поиска этого вопроса. Ура! –

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