2016-10-06 4 views
1

Я новичок в использовании Makefiles & я озадачен что-то ...Как вычисляются переменные Makefile?

У меня есть следующие в Makefile ...

USER_ID := $(id -u) 
USER_ID_ESC := $$(id -u) 

MAKEFILE := $(realpath $(lastword $(MAKEFILE_LIST))) 
ROOT_DIR := $(dir $(MAKEFILE)) 


x: 
    echo $${USER_ID} 
    echo ${USER_ID} 
    echo $(USER_ID) 
    echo $${USER_ID_ESC} 
    echo ${USER_ID_ESC} 
    echo $(USER_ID_ESC) 
    echo $${ROOT_DIR} 
    echo ${ROOT_DIR} 
    echo $(ROOT_DIR) 
    exit 0 

которые дают выход ...

echo ${USER_ID} 

echo 

echo 

echo ${USER_ID_ESC} 

echo $(id -u) 
502 
echo $(id -u) 
502 
echo ${ROOT_DIR} 

echo /Users/toby/src/bitbucket.org/limtool/commissioning-tool-api/ 
/Users/toby/src/bitbucket.org/limtool/commissioning-tool-api/ 
echo /Users/toby/src/bitbucket.org/limtool/commissioning-tool-api/ 
/Users/toby/src/bitbucket.org/limtool/commissioning-tool-api/ 
exit 0 

Я понимаю, использование от двойного $, чтобы избежать использования $, но я не понимаю, почему с помощью одного $ для realpath & dir команды работают, но использовать его для команды id нет.

Может кто-нибудь помочь мне в понимании?

Благодаря

+1

'realpath' и' dir' '' функции 'GNU make',' id' нет. Если вы хотите использовать функцию оболочки внутри Makefile, используйте '$ (shell id -u)'. 'realpath' и' sir' не экранированы, они корректно интерпретируются 'GNU make' – Tim

+0

Спасибо @TimF Упоминайте, что в качестве ответа я могу принять? – TobyG

+0

Несомненно, я сделал это и добавил несколько подробностей и ссылок :-) – Tim

ответ

2

realpath и dir являются GNU make функции, id нет. Если вы хотите использовать функцию оболочки внутри Makefile, используйте $(shell id -u). realpath и dir не экранированы, они корректно интерпретируются GNU make.

См. GNU make file name functions, а также справочные страницы GNU make shell function.

Когда вы пишете $(id -u) в Makefile, make будет пытаться выглядеть, если это функция или переменная, и так как это не ни один из них не будет расширяться ни к чему, следовательно, пустые echo с.

Теперь причина, по которой ваш идентификатор был правильно написан, когда вы избежали знака доллара, является загадочным и, вероятно, из-за вашей оболочки. Что случилось, так это то, что make не пытался его расширять, так как сбрасывается $, поэтому echo $(id -u) был отправлен системе. Вы можете попробовать его прямо в своей оболочке, вы должны получить тот же результат.

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