Получить значение из команды в файле make - PullRequest
0 голосов
/ 27 июня 2018

У меня есть скрипт, который работает нормально, который я использую следующим образом, чтобы получить некоторое значение:

tmpDir=$(xtr execute run)

в самом коде команды я печатаю значение как

fmt.Print("the dir is: ",dir)

и затем, когда я добавляю echo в скрипт, я получаю значение tmpDir

Теперь мне нужно перейти на использование make file , и я делаю это в точности так и я не получаю никакого значения в tmpDir. Что мне здесь не хватает?

Вот make-файл

all: app app_2
    PROJ_DIR=$(PWD)
# Create folder for build artifacts
    DIR=$(xtr execute run)
.PHONY: app
app:
    @echo $(DIR)

       ....

1 Ответ

0 голосов
/ 27 июня 2018

Make рецепты расширяются сначала make, а затем передаются в оболочку. Итак, ваш DIR=$(xtr execute run) сначала расширяется make, но поскольку нет переменной make с именем xtr execute run, он расширяется как DIR=.

Но это не единственная ваша проблема: переменная с именем DIR в вашем рецепте является переменной оболочки, а не переменной make. Он существует только в контексте оболочки, которая создаст make для выполнения этой части (и только этой) вашего рецепта:

DIR=$(xtr execute run)

Поскольку в этом вызове оболочки больше ничего нет, он бесполезен. Вы как будто порождаете новую оболочку, выполняете в ней DIR= и выходите.

Переменная DIR в рецепте app - это другая переменная с тем же именем. Опять же, make расширяет его перед передачей части рецепта в оболочку, но поскольку такой переменной make нет, она расширяется как:

echo

У вас похожая проблема с $(PWD): она расширяется make, и поскольку такой переменной make нет, она расширяется как пустая строка. Вы могли бы вместо этого использовать CURDIR, который является встроенной переменной make. Но помните, что PROJ_DIR - это переменная оболочки, которая будет существовать только для этой однострочной части вашего рецепта ...

Вместо всего этого вы можете попробовать:

DIR := $(shell xtr execute run)
PROJ_DIR := $(CURDIR)

all: app app_2

.PHONY: app
app:
    @echo $(DIR)

Здесь DIR и PROJ_DIR - переменные make, которые назначаются один раз (обратите внимание на :=, это важно), когда make анализирует make-файл. Отныне они могут использоваться в рецептах, где они будут расширены командой make до того, как часть рецепта будет фактически передана в оболочку для выполнения.

...