Отправить env для цели makefile

1410
Medhamsh

Я пытаюсь установить env var, который является git sha1 commit для цели makefile. Я устанавливаю много env-переменных, и только это не удается без такой ошибки файла или каталога. Я в замешательстве. Пожалуйста, помогите мне передать это как env var моей цели makefile. Это то, что я делаю в начале моего Makefile.

SHA1 := $(shell git log | head -1 | awk '') BUILD_STAMP := $(shell date +%s) export SHA1 export BUILD_STAMP 

И одна из целей make-файла имеет это.

target: dep-target env \ VAR1=$(VAR1) \ GIT_SHA1=$(SHA1) \ my-command for the target 

Это не с

env: a6d23d14b0fbb613e567cc647ebfe2808ce47af1: No such file or directory 

Пожалуйста, помогите мне установить это как env var.

3
Если вы найдете ответ на свой вопрос ниже, отметьте его как «принятый», щелкнув по серой галочке рядом с ним. Hannu 7 лет назад 0
В значении SHA1 есть пробел? user20574 7 лет назад 0

2 ответа на вопрос

3
Hannu
 VAR1 = $ (VAR1) GIT_SHA1 = $ (SHA1) 

Круглые скобки, круглые скобки, используемые $таким образом перед ними, приведут к тому, что текст между скобками будет отправлен в Bash в качестве командной строки для выполнения.

Вместо этого используйте вместо этого фигурные скобки, то есть вместо этого GIT_SHA1=$вы получите назначение переменной.

Уверены ли вы? Make должен сначала выполнить замену переменной (и он видит $ () как замену переменной), и THEN bash не увидит никакой переменной $ (), потому что сначала Make заменил их. user20574 7 лет назад 0
Я предполагаю, основываясь на «Нет такого файла каталога», что я прав. Hannu 7 лет назад 0
Вы можете заметить, что A) файл или каталог, который не был найден, называется `a6d23d14b0fbb613e567cc647ebfe2808ce47af1`, а не` SHA1`, и B), что сообщение было напечатано `env`, а не` bash`. user20574 7 лет назад 0
Я предполагаю, что `SHA1: = $ (shell git log | head -1 | awk '')` устанавливает переменную в это значение, и тот факт, что env печатает его, подразумевает, что env был запущен через Bash (или "система ()"). Hannu 7 лет назад 0
если `$ (...)` означает "отправить это в bash как командную строку для попытки выполнения", то `$ (SHA1)` попытается выполнить команду `SHA1`, которая выдаст ошибку, сообщающую команду` SHA1 `не был найден. Что произойдет, если вы введете `SHA1` в своем терминале? user20574 7 лет назад 0
1
Curt

У меня недостаточно представителя, чтобы комментировать неправильный ответ @ Hannu (фигурные и круглые скобки эквивалентны в Make).

Чтобы отладить подобные вещи, создайте отдельный короткий Makefile и попробуйте что-то вроде этого:

SHA1 := $(shell git log | head -1 | awk '') all: echo "$(SHA1)" 

Это показывает, что происходит, если SHA1 назначается вся первая строка вывода журнала git, а не только SHA, и это включает пробелы. Расширенная команда env будет иметь неверный синтаксис.

В этом случае знак доллара в команде awk необходимо удвоить (выведите $$ 2), чтобы он расширился до буквального знака доллара, а не как пустая переменная $ (2).

`(фигурные и круглые скобки эквивалентны в Make) .` Подумай! Что вы пишете * в том же месте * в make-файле? Hannu 7 лет назад 0
@ Ханну Расширение переменной? user20574 7 лет назад 0

Похожие вопросы