2014-11-22 1 views
0

У меня есть этот конфигурационный файл (обычный текстовый файл, заканчивающийся в .cfg)Как читать и печатать содержимое файла (некоторые настройки) внутри целевого файла makefile?

# The application name 
learningErlangTesting 

# The node name 
mysql_testing 

Кроме того, у меня есть Makefile:

ok: 
    APP=$(shell cat nodes.cfg | sed -n '2p') 
    NODE=$(shell cat nodes.cfg | sed -n '5p') 
    echo $(APP) 
    echo $(NODE) 

Когда я бегу сделать нормально я

APP=learningErlangTesting 
NODE=mysql_testing 
echo 

echo 

Мои переменные пустые, кажется, я не могу их распечатать и не использовать для создания пути к папке (который я намереваюсь делать после того, как я получу свои руки).

Что я делаю неправильно?

Большое спасибо, Desmond

ответ

2

Ваша проблема заключается в том, что каждая строка рецепта Makefile вызывается в новой оболочке. Итак, первая строка вызывается в оболочке, где задана переменная оболочки APP. Затем оболочка выходит, теряя настройку переменной оболочки. Затем следующая строка запускается в другой оболочке и т. Д.

Вы должны поместить все это в одну линию рецептов, чтобы все они работали в одной оболочке.

Кроме того, в вашей команде echo вы печатаете переменные make, но на самом деле вы устанавливаете переменные оболочки.

Кроме того, почти всегда плохая идея использовать функцию make shell внутри рецепта. В этом случае это не повредит, но это приводит к большой путанице.

ok: 
     APP=$$(cat nodes.cfg | sed -n '2p'); \ 
     NODE=$$(cat nodes.cfg | sed -n '5p'); \ 
     echo $$APP; \ 
     echo $$NODE 

В качестве альтернативы, если конфигурационный файл является исходным файлом (всегда существует), вы можете установить реальное сделать переменные, но вы должны сделать это за пределами рецепта:

APP := $(shell cat nodes.cfg | sed -n '2p') 
NODE := $(shell cat nodes.cfg | sed -n '5p') 

ok: 
     echo $(APP) 
     echo $(NODE) 
+0

Отказано +1, потому что 'cat ... | sed ... 'это пародия. Исправьте стилистическую ошибку OP и опустите UUOC! –

+0

Я попробовал вторую версию, и она работает ... Не могли бы вы немного объяснить: что такое $$ (...). Я знаю, что $ (...) выполняет что-то в подоболочке, но не знает о $$ (...). Также требуется объявлять переменные в make, вне цели? Большое спасибо, Desmond – adragomir

+0

Вам нужно прочитать о синтаксисе makefile. Make-файлы не являются сценариями оболочки, а синтаксис makefile не является синтаксисом оболочки. '$ (...)' в make-файлах не ссылается на выполнение вещей в подоболочке, это относится к ссылке на переменные. Путаница в make-файлах заключается в том, что они _contain_ shell-скрипты: рецепты правил - это сценарии оболочки и используют синтаксис оболочки. Чтобы избежать знака доллара, поэтому он передается оболочке вместо интерпретируемого make, вы удваиваете его, поэтому '$$' расширяется до одного '$', который может быть передан в оболочку. http://www.gnu.org/software/make/manual/html_node/Introduction.html – MadScientist

0

В дополнение к @MadScientist's answer у вас есть возможность создать сценарий оболочки и запустить его с цели Makefile. Таким образом, вы можете также упростить код совсем немного:

$ cat Makefile 
ok: 
     $(shell ./ok.sh) 
$ cat ./ok.sh 
sed -n '2p' nodes.cfg 
sed -n '5p' nodes.cfg 

Примечание: Вы также можете просто поставить ./ok.sh в ok цели, но тогда вам нужен shebang line, и я не осведомлен о элегантный способ убедиться, что полученный сценарий использует ту же оболочку, что и Makefile.

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