FFmpeg nechal kvůli porušení autorských práv odstranit z GitHubu jeden z repozitářů patřících čínské technologické firmě Rockchip. Důvodem bylo porušení LGPL ze strany Rockchipu. Rockchip byl FFmpegem na porušování LGPL upozorněn již téměř před dvěma roky.
K dispozici je nový CLI nástroj witr sloužící k analýze běžících procesů. Název je zkratkou slov why-is-this-running, 'proč tohle běží'. Klade si za cíl v 'jediném, lidsky čitelném, výstupu vysvětlit odkud daný spuštěný proces pochází, jak byl spuštěn a jaký řetězec systémů je zodpovědný za to, že tento proces právě teď běží'. Witr je napsán v jazyce Go.
Yazi je správce souborů běžící v terminálu. Napsán je v programovacím jazyce Rust. Podporuje asynchronní I/O operace. Vydán byl v nové verzi 25.12.29. Instalovat jej lze také ze Snapcraftu.
Od soboty do úterý probíhá v Hamburku konference 39C3 (Chaos Communication Congress) věnovaná také počítačové bezpečnosti nebo hardwaru. Program (jiná verze) slibuje řadu zajímavých přednášek. Streamy a záznamy budou k dispozici na media.ccc.de.
Byl představen nový Xserver Phoenix, kompletně od nuly vyvíjený v programovacím jazyce Zig. Projekt Phoenix si klade za cíl být moderní alternativou k X.Org serveru.
XLibre Xserver byl 21. prosince vydán ve verzi 25.1.0, 'winter solstice release'. Od založení tohoto forku X.Org serveru se jedná o vůbec první novou minor verzi (inkrementovalo se to druhé číslo v číselném kódu verze).
Wayback byl vydán ve verzi 0.3. Wayback je "tak akorát Waylandu, aby fungoval Xwayland". Jedná se o kompatibilní vrstvu umožňující běh plnohodnotných X11 desktopových prostředí s využitím komponent z Waylandu. Cílem je nakonec nahradit klasický server X.Org, a tím snížit zátěž údržby aplikací X11.
Byla vydána verze 4.0.0 programovacího jazyka Ruby (Wikipedie). S Ruby Box a ZJIT. Ruby lze vyzkoušet na webové stránce TryRuby. U příležitosti 30. narozenin, první veřejná verze Ruby 0.95 byla oznámena 21. prosince 1995, proběhl redesign webových stránek.
Všem čtenářkám a čtenářům AbcLinuxu krásné Vánoce.
Byla vydána nová verze 7.0 linuxové distribuce Parrot OS (Wikipedie). S kódovým názvem Echo. Jedná se o linuxovou distribuci založenou na Debianu a zaměřenou na penetrační testování, digitální forenzní analýzu, reverzní inženýrství, hacking, anonymitu nebo kryptografii. Přehled novinek v příspěvku na blogu.
%ifBylo 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:…}gzipem, bzip2em, zipem 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.