Има ли някакъв синтаксис или трик, за да можете да създадете многоредов макрос на файла със спецификация на rpm

Заден план.

$ rpmbuild --version
RPM version 4.3.3

Работя върху специфичен файл, който трябва да обработи списък от файлове в множество скриптове. DRY (не се повтаряйте) ме накара да дефинирам списъка веднъж като макрос, който се разширява в различните помощни скриптове. Поддържането на списъка е трудно, тъй като не съм виждал начин да избегна поставянето на всички файлове на един ред.

%define LIST \
a \
b 

дава грешка

%define LIST a\
b\

също дава грешка

%define LIST a
%define LIST %LIST b

Неуспешно поради грешка при рекурсия


person Chaim Geretz    schedule 02.12.2010    source източник


Отговори (6)


Не можете наистина да правите многоредови макроси в спецификационен файл по начина, по който можете във вашия ~/.rpmmacros файл. Малко глупаво.

Създавам поддиректория SPECS/inc/ със спецификационни файлове, които действат като многоредови макроси, които се използват от всички пакети, създадени за моя сайт. Вместо да използвате макроси като %foo, можете просто да направите %include inc/foo.spec. Можете също да създадете преки пътища, за да избегнете включващия синтаксис %global foo %include inc/foo.spec. След това работи точно като многоредов макрос.

Ето пълен пример.

вкл./енв.спец

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

вкл./foo.spec

a
b
c
d

И след това в моя файл със спецификация на пакет, mylib.spec:

%include inc/env.spec

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

%foo
person Matthew Fioravante    schedule 08.05.2014
comment
Това е наистина умно решение! Благодаря!! - person Amol; 28.06.2019

Предполагам, че се чудите как обажданията като recvfrom попълват адреса на източника? Предлагам да прочетете източника на Linux, BSD или всяка друга операционна система с отворен мрежов стек, тъй като това е силно зависимо от ОС.
person Stan    schedule 28.04.2012
comment

Искам да нарисувам текст върху платно. За да направя ротацията, използвах следния код от https://forums.embarcadero.com/thread.jspa?messageID=440010

//bm is a TImage    
a := 45;
c:= bm.Canvas;
CurrentM := c.Matrix;
a:=-radian(a);
m.m11:= cos(a); m.m12:=sin(a); m.m13:=0;
m.m21:=-sin(a); m.m22:=cos(a); m.m23:=0;
m.m31:=0;       m.m32:=0;      m.m33:=1;
c.setmatrix(M);

c.BeginScene;
    c.filltext(rectf(100,100,5000,5000), 'test rotated string', false,1,[],ttextalign.taLeading,ttextalign.taLeading);
c.EndScene;

Това работи добре. Зададох правоъгълника си отдясно и отдолу на 5000, така че да не се притеснявам, че моят правоъгълник е твърде малък.

Проблемът е, че сега искам да променя свойствата на TextAlignment. Така че, за да начертая текст отдясно наляво, трябваше да коригирам моя правоъгълник и след това да го начертая по следния начин:

c.BeginScene;
    c.filltext(rectf((100 - 5000),100,100,5000), 'test rotated string', false,1,[],ttextalign.taTrailing,ttextalign.taLeading);
c.EndScene;

Така че основно преместих стойността x на моя правоъгълник TopLeft и го преместих обратно 5000 (отново използвам 5000, за да се уверя, че текстът ми пасва). След това задавам стойността x в долния десен ъгъл на моя правоъгълник до мястото, където беше стойността x в горния ляв ъгъл на правоъгълника на предишния ми пример. Това работи добре за завъртане на 0 градуса, но веднага щом променя градусите, не рисувам текста си на правилното място. Предполагам, че това е така, защото текстът ще се върти около горната лява позиция на правоъгълника (която е променена, за да накара текста да пише отдясно наляво).

- person chutz; 13.11.2012

В дефинициите на макроси обратната наклонена черта в края на реда се премахва и се използва, за да се каже на RPM, че дефиницията на макроса продължава. Символът за нов ред НЕ е премахнат (за разлика от make файл). Следователно, ако създавате многоредов скрипт, точка и запетая не са необходими. Това също означава, че ако разделяте една команда, трябва да използвате 3 обратни наклонени черти. Две, за да се получи обратна наклонена черта, която ще види обвивката, и една, за да каже на rpmbuild да продължи да анализира макроса. Шелът ще премахне обратната наклонена черта, която вижда, плюс новия ред и това ще доведе до една команда на два реда. Уау !!

person Bruce K    schedule 14.05.2012
comment
%define MAKE make \\\ name=TODO \\\ помощ \\\ - person RzR; 23.11.2017

Трябва да имате поне част от стойността на първия ред, т.е.:

%define LIST a\
b\
c

Тази макродефиниция ще работи. Ако планирате да ги използвате като команди, т.е. нещо подобно

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

това няма да работи. Редовете в изпълними секции първо се разделят на отделни команди, СЛЕД това макросите се разширяват. т.е. дефинирането на макроса ще работи, изпълнението му като три отделни команди няма.

Ако искате да изпълните 3 отделни команди, по-лесно е да го направите като

%define DOSOMETHING rm file1; rm file2; rm file3
person m1tk4    schedule 04.12.2010
comment
Горното решение не работи за мен, възможно е да работи за други версии на rpmbuild. Получавам грешка: грешка: ред 31: Неизвестен етикет: b\ Редактирах въпроса, за да отрази това. - person Chaim Geretz; 06.12.2010

Ако бях на твое място, щях да поддържам списъка в изходен файл.

Съдържание на %{_sourcedir}/LIST:

a
b
c
d

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

%define process_files() \
    for i in %(cat %{_sourcedir}/LIST)
    do \
        echo "process list of files here" \
    done
person djhaskin987    schedule 15.10.2013

Този пример трябва да работи:

cat file.spec

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

%build
${MAKE}


cat Makefile

status?=fail
default: 
    echo "status=${status}"
person RzR    schedule 22.11.2017