Вывести многострочную переменную в файл с помощью GNU Make - PullRequest
21 голосов
/ 02 сентября 2011

Мне трудно написать правило make-файла, которое выводит многострочную переменную в файл.

Вот код, который у меня есть:

define VAR1
    /dev d 755 - - - - -
endef

define VAR2
    /test d 777 - - - - -
    /test2 d 777 - - - - -
endef

VARS += $(VAR1)
VARS += $(VAR2)

all:
    echo "$(VARS)" > test

Тем не менее, эхо не может сказать "неопределенная строка в кавычках" по неизвестной мне причине. Как я могу поместить в файл все строки, объявленные в отдельной строке?

Ответы [ 3 ]

23 голосов
/ 02 сентября 2011

Если вы экспортируете переменную в оболочку и ссылаетесь на нее как на переменную оболочки, а не на переменную make, вам повезет:

define VAR1
    /dev d 755 - - - - -
endef

define VAR2
    /test d 777 - - - - -
    /test2 d 777 - - - - -
endef

define VARS
$(VAR1)
$(VAR2)
endef
export VARS

all:
    echo "$$VARS" > test

Обратите внимание на следующие изменения в вашем make-файле:

  • Я использовал define для создания VARS, а не серии += назначений, что облегчает получение новой строки между значениями VAR1 и VAR2.
  • Я добавил export VARS в ваш make-файл, чтобы переместить переменную в среду для вызова оболочки.
  • Я использовал $$VARS, а не $(VARS), чтобы разыменовать его - что оставляетРасширение в оболочку, а не в создание, что позволит избежать ошибки «Строка без кавычек».
11 голосов
/ 18 октября 2014

GNU make 4.0 добавляет возможность записывать файлы напрямую :

define VAR1
    /dev d 755 - - - - -
endef

define VAR2
    /test d 777 - - - - -
    /test2 d 777 - - - - -
endef

define VARS :=
$(VAR1)
$(VAR2)
endef

all:
        $(file > test,$(VARS))

Обратите внимание, что вам все равно нужно использовать define для определения VARS или последней строкиVAR1 и первая строка VAR2 будет отображена на одной строке.Кроме того, не ставьте пробел после запятой в конструкции $(file ...), иначе в выводе будет пробел!

4 голосов
/ 02 сентября 2011

Выглядит так, как будто вы получаете "Неопределенную строку в кавычках", потому что Make выполняет каждую строку рецепта в отдельной оболочке, а первая строка:

echo "    /dev d 755 - - - - -

Вот лучшее решение, которое я мог бы придумать (и я признаю, что это не очень хорошо, но вы идете против структуры Make) - это передать VARS субкомоду, который вызывает $(info ...):

Makefile:

define VAR1
    /dev d 755 - - - - -
endef

define VAR2
    /test d 777 - - - - -
    /test2 d 777 - - - - -
endef

define VARS
$(VAR1)
$(VAR2)
endef

export VARS

all:
       $(MAKE) -f Makefile.print > test                                        

Makefile.print:

$(info $(VARS))

.PHONY:all
all:
        @# do nothing
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...