2015-04-16 2 views
1

В моем make-файле я пытаюсь захватить вывод вызова функции оболочки из переменной make, содержащей командную строку, без успеха. Когда я запускаю функцию оболочки в строке напрямую, она работает. Я не понимаю, в чем разница между запуском функции оболочки в командной строке и запуском функции оболочки в переменной make, содержащей командную строку.выполнить функцию оболочки по команде в переменной make

PG_CONFIG = "/usr/pgsql-9.4/bin/pg_config/" 

PG_INCLUDE1 = $(shell $$PG_CONFIG) 
PG_INCLUDE2 = $(shell /usr/pgsql-9.4/bin/pg_config --includedir-server) 

.PHONY: print 

print: 
    @echo "PG_CONFIG="$(PG_CONFIG) 
    @echo "PG_INCLUDE1="$(PG_INCLUDE1) 
    @echo "PG_INCLUDE2="$(PG_INCLUDE2) 

Выход:

$make -f Makefile.test print 
PG_CONFIG=/usr/pgsql-9.4/bin/pg_config/ 
PG_INCLUDE1= 
PG_INCLUDE2=/usr/pgsql-9.4/include/server 
+0

попробовать 'PG_INCLUDE1 = $ (оболочка $ (PG_CONFIG))' –

ответ

1

Я вижу две проблемы. Определение PG_CONFIG заканчивается на «/», поэтому оно рассматривается как каталог. И ваша переменная-ссылка в PG_INCLUDE1 должна быть $ (PG_CONFIG) не $$ PG_CONFIG.

Попробуйте это:

PG_CONFIG = "/usr/pgsql-9.4/bin/pg_config" 

PG_INCLUDE1 = $(shell $(PG_CONFIG)) 
PG_INCLUDE2 = $(shell /usr/pgsql-9.4/bin/pg_config --includedir-server) 

.PHONY: print 

print: 
    @echo "PG_CONFIG="$(PG_CONFIG) 
    @echo "PG_INCLUDE1="$(PG_INCLUDE1) 
    @echo "PG_INCLUDE2="$(PG_INCLUDE2) 
+0

Там также нет оснований держать марку переменные за пределами строки с кавычками в строках оболочки (они могут даже войти в одну строку с кавычками). –

+0

Ваш пример дает 'Makefile: 9: *** отсутствующий разделитель. Stop.' – Christoph90

+0

Nevermind. Необходимо заменить пробелы перед @echo на вкладки. – Christoph90

0

Как она стоит в GNU Make Manual:

переменных и функций ссылки в рецептах имеют одинаковый синтаксис и семантику на ссылки в других местах в Makefile. Они также имеют те же правила цитирования: если вы хотите, чтобы знак доллара появился в вашем рецепте , вы должны удвоить его ('$$'). Для оболочек, таких как оболочка по умолчанию, , которые используют значки доллара для ввода переменных, важно оставить в поле зрения , неважно, нужна ли переменная, которую вы хотите ссылаться, в переменной make (используйте знак одного доллара) или переменную оболочки (используйте два знаков доллара).

Так что же $$ делает это, заменив его на один доллар. В вашем примере:

PG_INCLUDE1 = $(shell $$PG_CONFIG) 

сводится к:

PG_INCLUDE1 = $(shell $PG_CONFIG) 

Далее $PG_CONFIG выполняется в оболочке так же, как если бы вы ввели его в терминале. А так как нет переменной PG_CONFIG, определенной в текущей подоболочке, $PG_CONFIG заменяется ничем. Однако, если вы определили PG_CONFIG переменные окружения перед запуском make она будет работать, как вы хотели с $$ в Makefile:

$ export PG_CONFIG="aoeuidhtn" 
$ make 
PG_CONFIG=/usr/pgsql-9.4/bin/pg_config/ 
PG_INCLUDE1=aoeuidhtn 
Смежные вопросы