1b5b309bf8
This has been clearly lacking while making the previous commit but the implementation isn't that clear so let it be a separate step. The problem requiring the change in subsequent processors is that these relied upon "@arch" as a flag to be inspected, and "pkg@!arch1,arch2" on arch2 needs to take out *all* of that fragment *including* arch1 mention as well. Part of the cause is difference in handling: "positive" multi-match would explode its "client" line into multiple lines to filter down the pipeline, while "negative" multi-match *has* to keep that line on a similarly single line (otherwise we'd end up with N-1 of those slipping past the filter for particular architecture thus defeating the whole purpose of "negative" matching semantics): $ echo 'pkg@!E2K,mipsel,riscv64' | sed -r ':loop; s/^((([^@]+@!)[^,]+)+),([a-zA-Z0-9_]+)/\1@!\4/; t loop' pkg@!E2K@!mipsel@!riscv64 I've tried my best to test this specific change but it still might introduce a regression in some corner case; feel free to report; looks like there's a space for improvement in m-p's automated tests department as well. So now we can do: pkg@!ARCHES1,ARCHES2,arch3,arch4 and have pkg excluded on arches mentioned; the previous approach could only offer explicit whitelists (not that it was entirely wrong but then again, we have both ExclusiveArch and ExcludeArch rpmtags in our spec files).
74 lines
3.0 KiB
Plaintext
74 lines
3.0 KiB
Plaintext
== Архитектурно-зависимые фрагменты ==
|
||
|
||
=== Makefile ===
|
||
|
||
Достаточно воспользоваться ifeq/ifneq, сравнивая $(ARCH) с нужным:
|
||
|
||
ifeq (x86_64,$(ARCH))
|
||
EFI_LISTS := $(call tags,base efi)
|
||
endif
|
||
|
||
При необходимости сравнить со списком ("любой x86") можно сделать так:
|
||
|
||
ifeq (,$(filter-out i586 x86_64,$(ARCH)))
|
||
use/x11/xorg: use/x11 use/x11/intel use/firmware
|
||
else
|
||
use/x11/xorg: use/x11
|
||
endif
|
||
|
||
В рецептах (shell-часть Makefile) используйте $(ARCH) или $$ARCH.
|
||
|
||
=== скрипты ===
|
||
|
||
В скриптовых хуках ({image-,}scripts.d/*) проверяйте $GLOBAL_ARCH.
|
||
|
||
=== списки пакетов, профили групп ===
|
||
|
||
Бывает так, что в списке пакетов есть смысл упоминать какой-либо из них
|
||
только для определённой архитектуры (например, wine или steam); в таких
|
||
случаях можно воспользоваться механизмом подстановки, который пословно
|
||
обрабатывает списки и в случае наличия суффикса @ARCH оставляет только
|
||
слова, в которых этот суффикс соответствует заданной архитектуре сборки.
|
||
|
||
Например, для Simply Linux в mkimage-profiles-desktop есть строчки:
|
||
|
||
@I586_ONLY@haspd
|
||
@X86_64_ONLY@i586-haspd
|
||
|
||
В случае mkimage-profiles они должны выглядеть так:
|
||
|
||
haspd@i586
|
||
i586-haspd@x86_64
|
||
|
||
или упрощённо (с версии 1.2.12):
|
||
|
||
haspd@IA32
|
||
|
||
С версии 1.3.15 поддерживается макрос E2K ("любое поколение e2k*") и
|
||
ARM (armh или aarch64), а также выборка "для любой архитектуры, кроме"
|
||
(например, @!E2K, или "@!ARM).
|
||
|
||
С версии 1.4.21 поддерживается перечисление архитектур через запятую
|
||
после "@" или "@!":
|
||
|
||
LibreOffice-still@X86,aarch64,ppc64le,mipsel
|
||
java-11-openjdk@!E2K,mipsel
|
||
|
||
Для преобразования можно воспользоваться следующей командой:
|
||
|
||
sed -r -e 's/@I586_ONLY@([^\t ]+)/\1@i586/g' \
|
||
-e 's/@X86_64_ONLY@([^\t ]+)/\1@x86_64/g'
|
||
|
||
При необходимости добавить пакет только на x86-архитектурах (неважно,
|
||
i586 или x86_64) можно воспользоваться макросом X86 (с версии 1.2.12):
|
||
|
||
xorg-drv-intel@X86
|
||
|
||
Аналогичная функциональность реализована для профилей установки.
|
||
|
||
=== загрузчики ===
|
||
|
||
Как правило, сперва понадобится доработка mkimage -- см. скрипты
|
||
tools/mki-pack-*boot -- и лишь затем профиля; см. тж. lib/boot.mk
|
||
и фичу pack.
|