Есть ли какой-либо синтаксис или трюк, чтобы иметь возможность создать многострочный макрос спецификации файла rpm - PullRequest
7 голосов
/ 02 декабря 2010

Фон.

$ rpmbuild --version
RPM version 4.3.3

Я работаю над файлом спецификации, который должен обрабатывать список файлов в нескольких скриптлетах. СУХОЙ (не повторяйте себя) заставляет меня определять список один раз как макрос, который расширяется в различные вспомогательные скрипты. Ведение списка затруднительно, поскольку я не видел способа избежать размещения всех файлов в одной строке.

%define LIST \
a \
b 

выдает ошибку

%define LIST a\
b\

также выдает ошибку

%define LIST a
%define LIST %LIST b

Сбой из-за ошибки рекурсии

Ответы [ 6 ]

3 голосов
/ 08 мая 2014

Вы не можете создавать многострочные макросы в файле спецификаций так, как вы можете это сделать в файле ~ / .rpmmacros.Вид глупости.

Я создаю подкаталог SPECS / inc / с файлами спецификаций, которые действуют как многострочные макросы, которые используются всеми пакетами, созданными для моего сайта.Вместо использования макросов в качестве %foo, вы можете просто сделать %include inc/foo.spec.Вы также можете создать ярлыки, чтобы избежать синтаксиса включения %global foo %include inc/foo.spec.Тогда он работает как многострочный макрос.

Вот полный пример.

inc / env.spec

%global foo %include inc/foo.spec
%global bar %include inc/bar.spec
#Lots of other common things to all packages

inc / foo.spec

a
b
c
d

И затем в моем файле спецификации пакета mylib.spec:

%include inc/env.spec

Name: mylib
Version: X.Y
#etc...

%foo
2 голосов
/ 28 апреля 2012

Поскольку вы объяснили свою цель немного подробнее, давайте попробуем другой подход. Попробуйте это в вашем файле спецификации:

Source1:        flist

%{expand:%global LIST %(cat %{SOURCE1})}

И это в файле Source1 (в данном случае flist):

a \
b \
c 

Я проверил это на rpm 4.4.6, так как это самая старая версия, доступная мне на данный момент.

1 голос
/ 15 мая 2012

В определениях макросов обратный слеш в конце строки удаляется и используется, чтобы сообщить RPM, что определение макроса продолжается. Символ новой строки NOT раздет (в отличие от файла make). Поэтому, если вы создаете многострочный скрипт, точки с запятой не нужны. Это также означает, что если вы разделяете одну команду, вы должны использовать 3 обратную косую черту. Два для получения обратной косой черты, которую увидит оболочка, и один для указания rpmbuild продолжать синтаксический анализ макроса. Оболочка удалит обратную косую черту, которую она видит, плюс символ новой строки, и это даст одну команду в две строки. Вот так !!

0 голосов
/ 23 ноября 2017

Этот пример должен работать:

cat file.spec

%define MAKE make \\\
 status=success \\\
 #EOL

%build
${MAKE}


cat Makefile

status?=fail
default: 
    echo "status=${status}"
0 голосов
/ 15 октября 2013

На вашем месте я бы сохранил список в исходном файле.

Содержимое %{_sourcedir}/LIST:

a
b
c
d

В файле спецификации:

%define process_files() \
    for i in %(cat %{_sourcedir}/LIST)
    do \
        echo "process list of files here" \
    done
0 голосов
/ 04 декабря 2010

Вы должны иметь хотя бы некоторую часть значения в первой строке, т. Е .:

%define LIST a\
b\
c

Это определение макроса будет работать. Если вы планируете использовать их как команды, то есть что-то вроде

%define DOSOMETHING rm file1\
rm file2\
rm file3
...
%build
%DOSOMETHING

это не будет работать. Строки в исполняемых разделах сначала разбиваются на отдельные команды, ТО затем макросы раскрываются. То есть определение макроса сработает, а выполнение трех отдельных команд - нет.

Если вы хотите выполнить 3 отдельные команды, это проще сделать как

%define DOSOMETHING rm file1; rm file2; rm file3
...