Canonical představil Ubuntu optimalizované pro jednodeskový počítač s RISC-V procesorem Milk-V Mars.
Armbian, tj. linuxová distribuce založená na Debianu a Ubuntu optimalizovaná pro jednodeskové počítače na platformě ARM a RISC-V, ke stažení ale také pro Intel a AMD, byl vydán ve verzi 24.5.1 Havier. Přehled novinek v Changelogu.
Společnost xAI založena Elonem Muskem a stojící za AI LLM modelem Grok získala investici 6 miliard dolarů.
Finálový zápas mistrovství světa v ledním hokeji přinesl nový rekord NIX.CZ (𝕏): "Dosavadní absolutní maximum našeho propojovacího uzlu bylo překonáno v čase 21:10, kdy jsme při přenosu dat dosáhli 3,14 Tbps. Je třeba také doplnit, že po deváté hodině večerní byly na maximu i ostatní datové přenosy nesouvisející s hokejovým šampionátem".
Přihlaste svou přednášku na další ročník konference LinuxDays, který proběhne 12. a 13. října na FIT ČVUT v pražských Dejvicích. CfP poběží do konce prázdnin, pak proběhne veřejné hlasování a výběr přednášek.
Na crowdsourcingové platformě Crowd Supply byla spuštěna kampaň na podporu open source biometrického monitoru ve tvaru hodinek HealthyPi Move. Cena je 249 dolarů a plánovaný termín dodání listopad letošního roku.
Firma Murena představila /e/OS verze 2.0. Jde o alternativní sestavení Androidu bez aplikací Google. Mezi novinkami je podrobnější nastavení ochrany soukromí před sledováním aplikacemi. Murena prodává několik smartphonů s předinstalovaným /e/OS (Fairphone, repasovaný Google Pixel 5).
Do 30. května lze v rámci akce Warhammer Skulls 2024 získat na Steamu zdarma hru Warhammer 40,000: Gladius - Relics of War.
HelenOS (Wikipedie), tj. svobodný operační systém českého původu založený na architektuře mikrojádra, byl vydán ve verzi 0.14.1. Přehled novinek v poznámkách k vydání. Vypíchnou lze nabídku Start. Videopředstavení na YouTube.
%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 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:…}
%{trace}
, %{!trace}
%{verbose}
, %{!verbose}
rpm --verbose
).%{dump}
rpm --showrc
), jak vypadá právě v místě, kde se funkce provede.%{expand:…}
%{expand:…}
jsou lokální; mají-li být globální, musíme je definovat %global
.%{lua:…}
%{basename:…}
%{dirname:…}
%{suffix:…}
%{url2path:…}
, %{u2p:…}
%{uncompress:…}
gzip
em, bzip2
em, zip
em a nekomprimované.%{S:…}
, %{P:…}
%SOURCEargument
a %PATCHargument
– neexpandované, tj. ne na jejich hodnoty.%{F:…}
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í.
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 %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}
-p
se nevyskytuje, proto expanduje na nic – jako prázdné makro.%{-q}
-q
není ani deklarována, ale chová se stejně jako -p
a expanduje na nic.%{?-p:ppp}
-p
se nevyskytuje, proto expanduje na nic – jako nedefinované makro.%{!?-p:ppp}
-p
se nevyskytuje, proto expanduje na ppp
– jako nedefinované makro.%{-r}
-r
, tedy volbu samu.%{?-r:rrr}
, %{?-r:rrr}
-r
je přítomna, makro se tudíž chová jako definované a žádné překvapení se nekoná – první expanduje na rrr
, druhé na nic.%{-s}
-s plit
, tedy na celou volbu s argumentem.%{-t}
-t all
, argument byl převeden na standardní tvar, tj. oddělen mezerou.%{-t*}
all
, tedy samotný argument volby -t
.%{*}
is short
.%{**}
-r -s plit -tall is short
(bez makra samého).%{#}
2
, tedy počet zbývajících argumentů makra.%{2}
short
, tedy druhý zbývající argument.%{0}
nibbler
.%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}}
Nástroje: Tisk bez diskuse
Tiskni Sdílej:
%{?-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.