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 до того, как часть рецепта будет фактически передана в оболочку для выполнения.