Ondřej Filip publikoval reportáž z ceremonie podpisu kořenové zóny DNS. Zhlédnout lze také jeho nedávnou přednášku Jak se podepisuje kořenová zóna Internetu v rámci cyklu Fyzikální čtvrtky FEL ČVUT.
Společnost BenQ uvádí na trh novou řadu monitorů RD určenou pro programátory. První z nich je RD240Q.
Byl aktualizován seznam 500 nejvýkonnějších superpočítačů na světě TOP500. Nejvýkonnějším superpočítačem nadále zůstává Frontier od HPE (Cray) s výkonem 1,206 exaFLOPS. Druhá Aurora má oproti loňsku přibližně dvojnásobný počet jader a dvojnásobný výkon: 1,012 exaFLOPS. Novým počítačem v první desítce je na 6. místě Alps. Novým českým počítačem v TOP500 je na 112. místě C24 ve Škoda Auto v Mladé Boleslavi. Ostravská Karolina, GPU
… více »GHC (Glasgow Haskell Compiler, Wikipedie), tj. překladač funkcionálního programovacího jazyka Haskell (Wikipedie), byl vydán ve verzi 9.10.1. Přehled novinek v poznámkách k vydání.
Po 9 týdnech vývoje od vydání Linuxu 6.8 oznámil Linus Torvalds vydání Linuxu 6.9. Přehled novinek a vylepšení na LWN.net: první a druhá polovina začleňovacího okna. Později také na Linux Kernel Newbies.
Byla vydána verze 0.2.0 v Rustu napsaného frameworku Pingora pro vytváření rychlých, spolehlivých a programovatelných síťových systémů. Společnost Cloudflare jej letos v únoru uvolnila pod licencí Apache 2.0.
Open source RDP (Remote Desktop Protocol) server xrdp (Wikipedie) byl vydán ve verzi 0.10.0. Z novinek je vypíchnuta podpora GFX (Graphic Pipeline Extension). Nová větev řeší také několik bezpečnostních chyb.
Rocky Linux byl vydán v nové stabilní verzi 9.4. Přehled novinek v poznámkách k vydání.
Dellu byla odcizena databáze zákazníků (jméno, adresa, seznam zakoupených produktů) [Customer Care, Bleeping Computer].
V lednu byl otevřen editor kódů Zed od autorů editoru Atom a Tree-sitter. Tenkrát běžel pouze na macOS. Byl napevno svázán s Metalem. Situace se ale postupně mění. V aktuálním příspěvku Kdy Zed na Linuxu? na blogu Zedu vývojáři popisují aktuální stav. Blíží se alfa verze.
%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.