abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

    dnes 16:55 | Nová verze

    Multimediální přehrávač mpv byl vydán ve verzi 0.42.0. Jde o větší balík změn po bezmála roce. Mimo jiné se lépe integruje s Waylandem nebo rozšiřuje podporu DVD/Blu-ray, např. umožňuje přehrávat rovnou obrazy médií (soubory iso).

    ʚĭɞ 🍉 | Komentářů: 0
    dnes 12:22 | Nová verze

    Desktopové prostředí LXQt (Lightweight Qt Desktop Environment, Wikipedie) vzniklé sloučením projektů Razor-qt a LXDE bylo vydáno ve verzi 2.5.0. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    dnes 12:11 | Nová verze

    Byla vydána (𝕏) nová verze 8.0 LTS open source monitorovacího systému Zabbix (Wikipedie). Přehled novinek v oznámení na webu, v poznámkách k vydání a v aktualizované dokumentaci.

    Ladislav Hagara | Komentářů: 0
    dnes 04:22 | Nová verze

    Byla vydána verze R14.1.7 desktopového prostředí Trinity Desktop Environment (TDE, fork KDE 3.5, Wikipedie). Přehled novinek v poznámkách k vydání, podrobnosti v seznamu změn.

    JZD | Komentářů: 3
    dnes 00:33 | Nová verze

    Bazzite (Wikipedie), tj. linuxová distribuce vycházející z Fedora Linuxu a optimalizována pro hraní počítačových her, byla vydána ve verzi 45. S Open Gaming Collective (OGC) jádrem a novým Easy Anti-Cheatem pro Linux (EAC Linux v2).

    Ladislav Hagara | Komentářů: 0
    včera 22:11 | Bezpečnostní upozornění

    MikroTik zveřejnil vlastní bezpečnostní upozornění potvrzující, že zranitelnost linuxového jádra postihuje také RouterOS 7. Jde o use-after-free při zpracování IPv4 TCP spojení s IP options. Zranitelnost se týká provozu směřujícího na TCP službu samotného routeru, nikoli paketů, které router pouze přeposílá. Opraveno v long-term od 7.24.6, v stable od 7.25.1 a devel od 7.26beta5.

    vencour | Komentářů: 0
    včera 17:00 | Bezpečnostní upozornění

    Ve správci balíčků APT, používaném v Debianu a odvozených distribucích, byla nalezena a opravena kritická zranitelnost CVE-2026-109518. Vzdálený útočník může obejít ověření stažených balíčků pomocí přesměrování a dočasných chyb HTTP serveru.

    Ladislav Hagara | Komentářů: 1
    včera 13:11 | IT novinky

    Nejvyšší kontrolní úřad (NKÚ) vydal zprávu o finančním řízení prostředků EU v ČR (pdf). Dočíst se lze například, že přes 8 miliard korun na digitální vzdělávání nepřineslo naplnění žádného z prioritních cílů programu. Peněžní prostředky z fondů EU sice byly vynaloženy formálně v souladu s právními předpisy, avšak s minimálním nebo neprokazatelným dopadem na proklamované cíle ve vzdělávání. Na Metodickém portálu RVP.CZ bylo ke konci

    … více »
    Ladislav Hagara | Komentářů: 20
    včera 11:33 | Nová verze

    Emulátor terminálu kitty (Wikipedie, GitHub) byl vydán v nové verzi 0.50.

    Ladislav Hagara | Komentářů: 3
    včera 09:00 | Bezpečnostní upozornění

    Vývojáři C-Kermit oznámili několik dlouhodobě přítomných zranitelností. Patří mezi ně buffer overflow v Telnet/FTP klientovi a command injection v Kermit serveru. Dotčené verze: C-Kermit 11.0.514 a starší. Fix: 11.1.515 [oss-security].

    vencour | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (9%)
     (7%)
     (4%)
     (21%)
     (30%)
     (9%)
     (5%)
     (2%)
     (14%)
     (20%)
    Celkem 2983 hlasů
     Komentářů: 34, poslední 26.10. 08:24
    Rozcestník

    Rukověť baliče RPM - XIII (Makra, dokončení)

    11. 8. 2005 | David Nečas | Návody | 5129×

    Temná zákoutí maker: podmínky, funkce, makra s argumenty a odskoky do shellu.

    Makra II

    Podmínky %if

    Bylo by nadmíru zvláštní, kdyby existovaly %ifarch a %ifos, a přitom žádné %if. A ono také existuje. Syntaxe je stejná jako u %ifarch a velmi připomíná preprocesor C (část s %else je nepovinná):

    %if logický_výraz
    …
    %else
    …
    %endif
    

    Logické výrazy vypadají, jak jsme zvyklí z většiny ostatních jazyků. Nula je nepravda, nenulové číslo pravda. Můžeme testovat existenci maker

    %if %{?WITH_SELINUX:1}%{!?WITH_SELINUX:0}
    

    porovnávat řetězce

    %if "%{with_sasl1}" == "yes" || "%{with_sasl2}" == "yes"
    

    nebo ověřovat platnost elementárních matematických tvrzení

    %configure \
    %if 2 + 2 == 5
        --with-funny-math \
    %endif
    …
    

    Z posledního příkladu také vidíme, že řádky s podmínkami jsou po expansi kompletně vynechány (stejně jako řádky s %define a dalšími direktivami), a tak je můžeme bezpečně vkládat doprostřed čehokoli.

    Funkce

    Funkce připomínají makra, ale zatímco makro při použití na něco expanduje, funkce něco vykoná. Syntaxe volání funkcí je

    %{název_funkce:argument}
    %{název_funkce}
    %{!název_funkce}
    

    přičemž poslední dva příklady se týkají funkcí bez argumentů, které nastavují nějaký příznak.

    K disposici máme následující funkce:

    %{echo:…}, %{warn:…}, %{error:…}
    Po řadě: vypíše argument na standardní výstup; vypíše argument na standardní chybový výstup a vyvolá fatální chybu s argumentem jako chybovou zprávou.
    %{trace}, %{!trace}
    Zapne, resp. vypne trasování expanse maker.
    %{verbose}, %{!verbose}
    Zapne, resp. vypne upovídanost (jako rpm --verbose).
    %{dump}
    Vypíše tabulku maker (jako rpm --showrc), jak vypadá právě v místě, kde se funkce provede.
    %{expand:…}
    Expanduje (vykoná) argument. Makra definovaná uvnitř %{expand:…} jsou lokální; mají-li být globální, musíme je definovat %global.
    %{lua:…}
    Provede Lua skript.
    %{basename:…}
    Expanduje na argument s odstraněnou cestou, tedy na samotný název souboru.
    %{dirname:…}
    Expanduje na argument s odstraněným jménem souboru, tedy na samotný název adresáře. Zatím není implementováno.
    %{suffix:…}
    Expanduje na koncovku argumentu.
    %{url2path:…}, %{u2p:…}
    Převede URL na cestu a název souboru.
    %{uncompress:…}
    Expanduje na příkaz, který dekomprimuje argument. Funguje pro soubory komprimované gzipem, bzip2em, zipem a nekomprimované.
    %{S:…}, %{P:…}
    Expandují na %SOURCEargument a %PATCHargument – neexpandované, tj. ne na jejich hodnoty.
    %{F:…}
    Expanduje na fileargument.file. Pokud někdo tuší, k čemu to může být dobré, docela by mě to zajímalo.

    S většinou funkcí se v existujících spec souborech potkáte zřídka, některé se však hodí při ladění.

    Odskok do shellu

    Odskočit do shellu, tedy vykonat v rámci expanse makra libovolný příkaz shellu, můžeme konstrukcí

    %(příkaz_shellu)
    

    Výstup příkazu se stane expansí makra. Lze to využít k ledasčemu, od nevinných konstrukcí

    BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
    

    přes úlety typu

    %define vendorstring Unsupported Custom Build by %(whoami)
    

    až po věci, které sem raději nebudu psát, kterých však najdete dost ve spec souborech oblíbené rpmoidní distribuce. Kupříkladu standardní makra pro zjištění perlích adresářů (v nichž je pěkný guláš) vypadají:

    %define perl_archlib %(eval "`perl -V:installarchlib`"; echo $installarchlib)
    

    Těla maker se ovšem expandují až při použití. Proto když desetkrát použijeme %perl_archlib, bude se desetkrát spouštět perl a sdělovat nám, kde má jakýsi adresář. Efektivnější by bylo

    %{expand:%global perl_archlib %(…)}
    

    Takto však lze definovat makro jen ve spec souboru, nikoli v macros.

    Makra s argumenty

    Makra %setup a %patch, i když to vlastně nejsou makra, mají různé volby, jež řídí jejich chování. Umí tohle náš kečup? Umí, i když nám po zjištění, z čeho se vaří, možná přestane chutnat.

    Makro s argumenty definujeme

    %define makro(volby) tělo_makra

    Volby jsou seznam písmen volitelně následovaných dvojtečkami, jak jsme zvyklí z getopt(3). Makro %nibbler se dvěma volbami, -s bez argumentu a -t s argumentem, tak definujeme

    %define nibbler(st:) …

    Expanse maker s argumenty se liší od obyčejných maker. Nejenže se makro nahradí svým tělem, ale spolkne přitom celý zbytek řádku, který se stává jeho argumenty:

    $ rpm --define 'nibbler %%nibbler' --eval 'Makro %nibbler a argumenty'
    Makro %nibbler a argumenty
    $ rpm --define 'nibbler() %%nibbler' --eval 'Makro %nibbler a argumenty'
    Makro %nibbler

    Omezit nenažranost makra můžeme jeho uzavřením do funkce %{expand:…} nebo prostě jen složenými závorkami:

    $ rpm --define 'nibbler() %%nibbler' --eval 'Makro %{expand:%nibbler} a argumenty'
    Makro %nibbler a argumenty
    $ rpm --define 'nibbler(s) %%nibbler' --eval 'Makro %{nibbler -s} a argumenty'
    Makro %nibbler a argumenty

    A teď bychom rádi ty spolykané argumenty z makra zase nějak dostali ven. Hodnotu argumentu -s, případně volbu samu získáme různými variacemi na %{-s}. Volbová makra (začínající pomlčkou) mají hodnotu voleb či argumentů jen uvnitř těla příslušného makra; volbová makra odpovídající nepřítomným či neexistujícím volbám se chovají částečně jako makra s prázdným tělem, částečně jako nedefinovaná.

    Uvažujme definici

    %define nibbler(prs:t:) …

    použitou

    %nibbler -r -s plit -tall is short

    Pak se různá volbová a argumentová makra expandují následovně:

    %{-p}
    Volba -p se nevyskytuje, proto expanduje na nic – jako prázdné makro.
    %{-q}
    Volba -q není ani deklarována, ale chová se stejně jako -p a expanduje na nic.
    %{?-p:ppp}
    Volba -p se nevyskytuje, proto expanduje na nic – jako nedefinované makro.
    %{!?-p:ppp}
    Volba -p se nevyskytuje, proto expanduje na ppp – jako nedefinované makro.
    %{-r}
    Expanduje na -r, tedy volbu samu.
    %{?-r:rrr}, %{?-r:rrr}
    Volba -r je přítomna, makro se tudíž chová jako definované a žádné překvapení se nekoná – první expanduje na rrr, druhé na nic.
    %{-s}
    Expanduje na -s plit, tedy na celou volbu s argumentem.
    %{-t}
    Expanduje na -t all, argument byl převeden na standardní tvar, tj. oddělen mezerou.
    %{-t*}
    Expanduje na all, tedy samotný argument volby -t.
    %{*}
    Expanduje na seznam zbývajících argumentů, tedy těch, které nejsou součástí žádných voleb: is short.
    %{**}
    Expanduje na úplný „příkazový řádek“ makra: -r -s plit -tall is short (bez makra samého).
    %{#}
    Expanduje na 2, tedy počet zbývajících argumentů makra.
    %{2}
    Expanduje na short, tedy druhý zbývající argument.
    %{0}
    Expanduje na jméno makra: nibbler.

    Makra %defined() a %undefined()

    V novějších verzích RPM obsahuje standardní soubor macros definice testovacích maker %defined() a %undefined() pro jednoduché testování existence makra:

    %if %{defined makro1} || %{defined makro2}
    …
    %endif

    Jejich definice by už nyní měly být srozumitelné:

    %define defined()   %{expand:%%{?%{1}:1}%%{!?%{1}:0}}
    %define undefined() %{expand:%%{?%{1}:0}%%{!?%{1}:1}}
    

    Nejčtenější články posledního měsíce

    Týden na ITBiz: 88 % vrcholových manažerů se obává, že selhání v oblasti datové suverenity by je mohlo stát místo
    Týden na ITBiz: Do roku 2028 bude na jednoho prodejce připadat 10 agentů AI
    Týden na ScienceMag.cz: Alternativní teorie gravitace nabízí vysvětlení změn temné energie v průběhu času

    Nejkomentovanější články posledního měsíce

    Událo se v týdnu 41/2026
    Událo se v týdnu 42/2026
      všechny statistiky »

    Seriál Rukověť baliče RPM (dílů: 15)

    Rukověť baliče RPM - I (Úvod) (první díl)
    <—« Rukověť baliče RPM - XII (Makra, úvod)
    »—> Rukověť baliče RPM - XIV (Přizpůsobení)
    Rukověť baliče RPM 15 - XV (Závěr) (poslední díl)

    Související články

    Rukověť baliče RPM - I (Úvod)
    Rukověť baliče RPM - II (Prostředí)
    Rukověť baliče RPM - III (Struktura spec souboru)
    Rukověť baliče RPM - IV (Fáze balení)
    Rukověť baliče RPM - V (Zdrojové soubory)
    Rukověť baliče RPM - VI (Makro %setup)
    Rukověť baliče RPM - VII (Podepisování, verze)
    Rukověť baliče RPM - VIII (Závislosti)
    Rukověť baliče RPM - IX (Sekce %files)
    Rukověť baliče RPM - X (Skriptíky)
    Rukověť baliče RPM - XI (Architektury. systémy, platformy)
    Rukověť baliče RPM - XII (Makra, úvod)
    Rukověť baliče RPM - XIV (Přizpůsobení)
    Rukověť baliče RPM 15 - XV (Závěr)
    Na co se často ptáme: Balíčkovací systémy kromě posledního odstavce o checkinstallu.
    Nebojíme se kompilace - I (Teorie)
    Nebojíme se kompilace - II (GCC, configure, make, checkinstall) kompilace a instalace software, opět kromě části o checkinstallu.
    Balíčkovací systém Mandrake Linuxu RPM na uživatelské úrovni (a pro Mandrake).

    Odkazy a zdroje

    Doporučené čtení

    Další články z této rubriky

    VDR a DVB-T2, část 2.
    VDR a DVB-T2, část 1.
    Šifrovaný Proxmox VE 6: ZFS, LUKS, systemd_boot a Dropbear
    MapTiler – proměňte obrázek v zoomovatelnou mapu
    Syncthing
           

    Hodnocení: 86 %

            špatné • dobré        

    Nástroje: Tisk bez diskuse

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    13.8.2005 15:28 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
    Rozbalit Rozbalit vše Oprava
    chybí vykříčník:
    %{?-r:rrr}, %{!?-r:rrr}
    Volba -r je přítomna, makro se tudíž chová jako definované a žádné překvapení se nekoná – první expanduje na rrr, druhé na nic.
    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.