как запустить системный вызов из make-файла и сохранить ответ в переменной - PullRequest
3 голосов
/ 17 октября 2011

Я пытаюсь установить значение переменной для использования во время компиляции. Я пытаюсь сделать это в отдельной цели makefile

svnversion:
    SVN_REV=$(shell svnversion -cn | sed -e 's/.*://' -e 's/\([0-9]*\).*/\1/' | grep '[0-9]')
    $(info svn_rev = $(SVN_REV))

Я прочитал, что это способ установить значение переменной. Тем не менее, когда я запускаю «make», я вижу:

SVN_REV=613
svn_rev = 

так что переменная кажется пустой. После этого я ожидаю, что эта переменная будет присутствовать во время компиляции (в других целях). Это тот случай? или я должен добавить команду 'export' в цель svnversion? а как мне обратиться к переменной SVN_REV? $ (SVN_REV) или $$ (SVN_REV).

спасибо

Ответы [ 2 ]

4 голосов
/ 17 октября 2011

Вы фактически присваиваете значение SVN_REV в подоболочке, заключенной в конце строки,

что вы, вероятно, хотите:

svnversion:: SVN_REV=$(shell svnversion -cn | sed -e 's/.*://' -e 's/\([0-9]*\).*/\1/' | grep '[0-9]')

svnversion:
        $(info svn_rev = $(SVN_REV))

Устанавливает переменную при установке цели.

Если это не то, что было задумано, скажем, вы хотите выполнить некоторую обработку с переменной, тогда вам нужно сделать каждую строку продолжением предыдущей, используя ужасную ; \ в конце семантики строки. Если вы затем ссылаетесь на переменные оболочки (например, вычисленные в первой строке), вам нужно использовать синтаксис $$ перед именем переменной

1012 *, например *

svnversion:
        SVN_REV=$(shell svnversion -cn | sed -e 's/.*://' -e 's/\([0-9]*\).*/\1/' | grep '[0-9]'); \
        echo svn_rev = $$SVN_REV

но поскольку она находится в оболочке, вы не можете использовать переменную в команде $(info, поскольку это происходит вне оценки цели.

1 голос
/ 17 октября 2011

Нельзя использовать переменные между разными строками в правилах или даже между разными правилами.Каждая строка выполняется в своей собственной оболочке, поэтому нет способа передачи информации таким способом.(Петеш заявил, что прямо сейчас, как я только что вижу)

, если вам нужно сохранить промежуточную информацию, используйте такие файлы:

 foo:
         uname -m > current_arch
         ...

 bar:
         gcc -m $$(cat current_arch) ...
         ...

Вы также можете установить макрос, если команда выполняетсяне слишком трудоемкий и не зависит от того, когда он вызывается во время процесса сборки: ant

 ARCH = $$(uname -m)

 bar:
         gcc -m $(ARCH) ...

Но это не устанавливаемая переменная, а подстановка макроса.Фактическая команда, передаваемая оболочке при вызове make bar, будет иметь вид:

         gcc -m $(uname -n)

и , затем будет выполнена команда uname.

...