2012-06-21 4 views
1

Я видел некоторые сценарии оболочки, в которых они передают файл, записывая содержимое файла в том же сценарии оболочки. Например:Как написать встроенные файлы в Makefile

if [[ $uponly -eq 1 ]]; then 
    mysql $tabular -h database1 -u usertrack -pabulafia usertrack << END                       

    select host from host_status where host like 'ld%' and status = 'up';                       

END 
    exit 0 
fi 

Я был в состоянии сделать что-то подобное, в котором я делаю:

python << END 
print 'hello world' 
END 

Если имя скрипта сказать myscript.sh то я могу запустить его, выполнив sh myscript.sh. и я получаю желаемый результат.

Вопрос в том, можем ли мы сделать что-то подобное в Makefile? Я оглядывался, и все говорят, что у меня есть что-то вроде:

target: 
     python @<< 
print 'hello world' 
<< 

Но это не работает.

Вот ссылки, где я искал:

http://www.opussoftware.com/tutorial/TutMakefile.htm#Response%20Files

http://www.scribd.com/doc/2369245/Makefile-Memo

ответ

2

Вы можете сделать что-то вроде этого:

define TMP_PYTHON_PROG 
print 'hello' 
print 'world' 
endef 

export TMP_PYTHON_PROG 
target: 
    @python -c "$$TMP_PYTHON_PROG" 

Первое, вы определяете многострочная переменная с define и endef. Затем вам понадобится export его оболочке, иначе он будет обрабатывать каждую новую строку как новую команду. Затем вы вставляете переменную оболочки с помощью $$.

+0

Спасибо, сэр. Работает хорошо. – jmlopez

3

Причина, по которой ваша @<< не работает, заключается в том, что она является признаком нестандартного варианта исполнения. Аналогично, команда define, о которой упоминает mVChr, специфична (насколько мне известно) GNU Make. Хотя GNU Make очень широко распространен, этот трюк не будет работать в BSD make, а также в POSIX-only make.

Я считаю, что это хорошо, как общий принцип, чтобы сделать make-файлы максимально переносимыми; и если вы пишете Makefile в контексте системы autoconf-ed, это еще важнее.

Полностью портативная техника для делать то, что вы ищете это:

target: 
    { echo "print 'First line'"; echo "print 'second'"; } | python 

или что то же самое, если вы хотите, чтобы заложить вещи немного более опрятно:

target: 
    { echo "print 'First line'"; \ 
     echo "print 'second'"; \ 
    } | python 
Смежные вопросы