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 04:55 | IT novinky

    Společnost Pebble představila (YouTube) prsten s tlačítkem a mikrofonem Pebble Index 01 pro rychlé nahrávání hlasových poznámek. Prsten lze předobjednat za 75 dolarů.

    Ladislav Hagara | Komentářů: 3
    dnes 04:22 | IT novinky

    Společnost JetBrains v listopadu 2021 představila nové IDE s názvem Fleet. Tento týden oznámila jeho konec. Od 22. prosince 2025 již nebude možné Fleet stáhnout.

    Ladislav Hagara | Komentářů: 1
    včera 21:22 | Nová verze

    Byl vydán Mozilla Firefox 146.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 146 bude brzy k dispozici také na Flathubu a Snapcraftu.

    Ladislav Hagara | Komentářů: 0
    včera 17:00 | IT novinky

    Před rokem převzala Digitální a informační agentura (DIA) vlastnictví a provoz jednotné státní domény gov.cz. Nyní spustila samoobslužný portál, který umožňuje orgánům veřejné moci snadno registrovat nové domény státní správy pod doménu gov.cz nebo spravovat ty stávající. Proces nové registrace, který dříve trval 30 dní, se nyní zkrátil na několik minut.

    Ladislav Hagara | Komentářů: 7
    včera 11:33 | IT novinky

    IBM kupuje za 11 miliard USD (229,1 miliardy Kč) firmu Confluent zabývající se datovou infrastrukturou. Posílí tak svoji nabídku cloudových služeb a využije růstu poptávky po těchto službách, který je poháněný umělou inteligencí.

    Ladislav Hagara | Komentářů: 0
    včera 01:55 | IT novinky

    Nejvyšší správní soud (NSS) podruhé zrušil pokutu za únik zákaznických údajů z e-shopu Mall.cz. Incidentem se musí znovu zabývat Úřad pro ochranu osobních údajů (ÚOOÚ). Samotný únik ještě neznamená, že správce dat porušil svou povinnost zajistit jejich bezpečnost, plyne z rozsudku dočasně zpřístupněného na úřední desce. Úřad musí vždy posoudit, zda byla přijatá opatření přiměřená povaze rizik, stavu techniky a nákladům.

    Ladislav Hagara | Komentářů: 11
    8.12. 18:44 | Komunita

    Organizace Free Software Foundation Europe (FSFE) zrušila svůj účet na 𝕏 (Twitter) s odůvodněním: "To, co mělo být původně místem pro dialog a výměnu informací, se proměnilo v centralizovanou arénu nepřátelství, dezinformací a ziskem motivovaného řízení, což je daleko od ideálů svobody, za nimiž stojíme". FSFE je aktivní na Mastodonu.

    Ladislav Hagara | Komentářů: 33
    8.12. 17:55 | IT novinky

    Paramount nabízí za celý Warner Bros. Discovery 30 USD na akcii, tj. celkově o 18 miliard USD více než nabízí Netflix. V hotovosti.

    Ladislav Hagara | Komentářů: 3
    8.12. 13:22 | IT novinky

    Nájemný botnet Aisuru prolomil další "rekord". DDoS útok na Cloudflare dosáhl 29,7 Tbps. Aisuru je tvořený až čtyřmi miliony kompromitovaných zařízení.

    Ladislav Hagara | Komentářů: 6
    8.12. 12:11 | Nová verze

    Iced, tj. multiplatformní GUI knihovna pro Rust, byla vydána ve verzi 0.14.0.

    Ladislav Hagara | Komentářů: 4
    Jaké řešení používáte k vývoji / práci?
     (34%)
     (48%)
     (19%)
     (17%)
     (22%)
     (15%)
     (24%)
     (16%)
     (18%)
    Celkem 450 hlasů
     Komentářů: 18, poslední 2.12. 18:34
    Rozcestník

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

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

    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%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%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%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()%undefined()

    V novějších verzích RPM obsahuje standardní soubor macros definice testovacích maker %defined()%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: Vědci vyvinuli magnetický tranzistor pro energeticky účinnější elektroniku
    Týden na ITBiz: Investice do infrastruktury AI měly zpomalit, ale IDC nyní svou prognózu mění
    Týden na ScienceMag.cz: Vysvětlili zdánlivě nemožnou fúzi černých děr

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

      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.