Product SiteDocumentation Site

15.2. Множественная сборка пакетов

При работе с проектами со свободными лицензиями нередко встречаются случаи, когда из одного и того же набора исходных текстов необходимо собирать несколько пакетов. Частым примером является сборка библиотек, а именно обычной их версии и devel-версии, и если это необходимо — статической версии. Ведение отдельных репозиториев для сборки разных пакетов в таком случае —  нерациональное решение. Важным случаем является как раз проблема лицензирования: в проекте могут присутствовать материалы разных лицензий (например, для исходных текстов и для документации). По правилам ALT Linux Team допустима сборка пакета со множеством лицензий для исходников при условии упоминания всех лицензий в соответствующей директиве spec-файла. Однако лицензии могут быть даже несовместимыми — например, программная часть компьютерной игры может распространяться под GPL, а контент к ней (изображения, музыка) — под лицензией, запрещающей модификацию. Строго говоря, такая лицензия не свободна, но допускает свободное распространение. Кстати, в этом варианте есть и ещё один повод разделить пакеты — программная часть будет архитектурно зависимой (попадёт в раздел репозитория x86_64), а часть с мультимедиа-контентом —  архитектурно независимой (попадёт в раздел noarch).
Рассмотрим небольшую программу, выводящую картинку на экран, в котором на основе одних исходников соберём два пакета: один с исполняемым файлом, второй — с картинкой.
Исходный текст программы задействует библиотеку GTK для представления картинки, задаваемой в специальном формате растрового изображения XPM:
@user: GNU_picture/gtk.c
#include <gtk/gtk.h>

#ifndef FILEPATH
#define FILEPATH "./GNU.xpm"
#endif

int main(int argc, char *argv[]) {
    GtkWidget *window;
    GtkWidget *image;
    GError *error = NULL;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "GTK Logo");
    gtk_window_set_default_size(GTK_WINDOW(window), 72, 72);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    image = gtk_image_new_from_file(FILEPATH);
    GdkPixbuf* pixbuf = gtk_image_get_pixbuf(GTK_IMAGE(image));
    pixbuf = gdk_pixbuf_scale_simple(pixbuf, 80*4, 78*4, GDK_INTERP_TILES);
    gtk_image_set_from_pixbuf(GTK_IMAGE(image), pixbuf);
    gtk_container_add(GTK_CONTAINER(window), image);

    gtk_widget_show_all(window);
    gtk_main();

    return 0;
}
@user: GNU_picture/GNU.xpm
/* XPM */
static char *GNU[] = {
/* columns rows colors chars-per-pixel */
"80 78 8 1 ",
"  c none",
"_ c black",
". c #242424",
"X c #494949",
"o c #6D6D6D",
"O c #929292",
"+ c #B6B6B6",
"@ c #DBDBDB",
/* pixels */
"            +OoXXXXXXXXXO@                                @+OOOOOO+@            ",
"         @Ooo+@@    @@@@OoO@                            @OoO++++++OoO+@         ",
"        OoO@   +ooOOX.XoO++oO                         @Oo+@@+O@ @@  @+oO        ",
"      +oo@ @ooX_____XX_XoXO@OoOOo                  @@+o+@oX._.....o++@ Oo@      ",
"     OX+   o___.+++@ @@   @@ @+Oo                 @XoO@ O+@OO@OooX___o  +X+     ",
"    OX@ +X._.oo+ @OoooooO+@@@+Oo@                  OO@    @@++++@@X.._oO@@X+    ",
"   +X@ @.___O  +ooO+@@@+OooooO+@                    +OOOOooO+++OoO@@+___o @X@   ",
"  @X@ @X__.X@@oo@                                      @@        +o+ X___+ +o@  ",
"  oO @.__.@ +o+                                                    OO@+.__O OO  ",
" @o  @___X @o@                 @@@@@            @@@@                OO X__o  o@ ",
" o+  O___O o@               @OooOOOooO@       +OOOOOO+@              o@O__X  +O ",
"@o  +.__O OO               Oo+@      +oO    @oO@     @OO             @O@o__o  o@",
"OO  O___+@o@             @oO   @+OOO+@ +o@ @X+  +OO+@  +O@            O@O__X  O+",
"o@  @___O+O             @o+  +o._____.O +Xo..XOo____.o@ +O@           ++o__o  +O",
"o@  O___+o@             o+ @o__________o @XXXoX.X_____.+ +O           @OO__X@ @o",
"o  +.__o@o             oO +.____________o@@ +X+O.X______O +O           O@X__O @o",
"o  @.__O@o            OO +.______________X   +O +.X______O O+          O@X_.+  o",
"o   O__.+o           Oo +._______________X   @O  oX_______+ o@         O+__X@  o",
"o  +.__.+o          +o @.________________X   @O  OX.______.@@o         o@.__O  X",
"o  @X__o@o         +o@@X_______________XoX@   +@ oX________X@+O       @O@X_X@  X",
"o   @._.+o+       @X@ o________.XX...X+  O+    @O++Oo_______o O+      +Oo__o   X",
"o@ @X___O+o      @X+ o____..XO@@  @@@    @o+  @O@   @.++oX___O O+     O@o___O @X",
"o@ @o.__O oO    +X+ o__.o+@@      +@      @OoO+O    @o    O.__O O+   OO o__O@ @X",
"o+   X__o@@oo++Oo+@o__o@       @+X.@    O++ @+Oo+  @@OO    +.__O@OoOOO@o.__o  +o",
"+O  O.____+ +OO+@+._.+        oX._.@    +XX   +oO +.X@O+    +___X+@@@ +___.O  o+",
"@o@  +____O@@  +X__.+        OX@._O      @+@  Oo@ X_O @o     o____o OoX___.@ @o@",
" OO  o____...++.___+        @.O .X  @+OO@  +     @..+@ O@    @X____X.____.X+ OO ",
" @o@ +o______.____o         oO @+  ++@@+O  ++    +_o@@ O@     +__________.+ @o@ ",
"  OO  oX.________.@        ++          @o  @o    +.@  @O      @.________X@@ o+  ",
"  @o+  @.._______O         @       @+ooo.@  O@   @XOoXXO       o_______oO  Oo   ",
"   @o@ @OO_.____.@           @    X____.O@  @@   @.X.__.@      +___..Xo+  +o@   ",
"    +o@  @oO.X__o            +   @.OO__.@         OX._XO@       X_Xo++@  +o@    ",
"     Oo@   @+Oo.+            O    OO@X_X@@         o_.O+        @..+    +o@     ",
"      +X+    @OX            @O     +OOO++@@        @XoXo         O.+ @+oO@      ",
"       @oXO@  oo            +O      @@++@@+         +X+O          OXooO@        ",
"         +oXXo.+            X+           @@          O+OO          X+           ",
"            @OX@           +.+                       @o+Xo+        o@           ",
"             @X@          @X.+                        OOO+oO@      OoO@         ",
"             @X           oo+O                        @Xo@ Ooo+@    +X+         ",
"             oo          OX@ O             +oooO@      O.@  @+OoO+++Oo@         ",
"            OX@         OX@  @@          @oo+++Oo+     @XO@@+@ @+OOO+@          ",
"            oO        @oX@    @          ooOO@  @oo@    @oXXoo@                 ",
"           @X@      @OX_+                X.X+@    +o+     @  +o                 ",
"          @oX    @+oXXO.+                X_+ +O+    O+       @o                 ",
"         @XO   +X.Xo+  X+                +o +__.o@   ++      @o@                ",
"         Oo@@@O.o.@    XO         OO@     @ @.X@oO           @X@                ",
"         oXX...+@.@    oo         +@         @@  o@          +X                 ",
"         +o+@+@ +.@    oO            ++  @       @+         @XO                 ",
"                +.@    oX@            O+@@        @        @XO                  ",
"                +.@    @Xo            @oO                 OXO                   ",
"                +.@     OX             Oo              @+X.+                    ",
"                +.@     +X             @o@             @+@oo                    ",
"                @.@     @.O@            Oo                 Oo                   ",
"                @.+      oX.@            oO                @X@                  ",
"                 XO       @.O@           @X+        @@+++@+oo                   ",
"                 oo        OX.+           @Xo++@@+OoX...__.o@                   ",
"                 +X@        +.+            @OoXXXXo+@@@++X+                     ",
"                 @.+        Xo                 @@        o+                     ",
"                  oo        oo                           o+                     ",
"                  @X@       +.XO+                        o@                     ",
"                   oO        @O__o             @+OOoXXXXXo                      ",
"                   @X@         o._+         @OX._____o++@                       ",
"                    +o          @.o  O@      @O.o++.o                           ",
"                     OO         O.+@X.@            X+                           ",
"                      o+       @.X X_.++           Oo                           ",
"                      @o+      @..@X___o            X@                          ",
"                       @O@      +...___O        @@  o+                          ",
"                         +@      @X_.X_X        O+ +X@                          ",
"                          @@       O.oX_o@     +XOXX+                           ",
"                                    oX+._X+  @O._.o@                            ",
"                                   +.X O__X +.___.@                             ",
"                                  O.o@ @._X@._____O                             ",
"                                  oO   o__.+.______O@@                          ",
"                                  @+  @.X__X._______.o++                        ",
"                                   @  +o@.___________.o@                        ",
"                                       O@O_____._____o@                         ",
"                                        @ O_.X_.OX__X+@                         ",
"                                           +XOOoO++OO+                          "
};
@user: GNU_picture/.gear/rules
spec: .gear/GNU_picture.spec
copy: .
Для сборки двух или более пакетов из одного комплекта исходников в spec-файле необходимо указать 3 дополнительных директивы:
  • директива %package <suffix> описывает основные метаданные пакета, название которого соответствует формату %name-suffix. В рамках данной директивы обязательно должны быть описаны директивы Summary, License и Group. Сюда же прописываются Requires и BuildArch при их необходимости;
  • директива %description <suffix> даёт описание создаваемого дополнительного пакета;
  • директива %files <suffix> описывает входящие в дополнительный пакет файлы. Если лицензии или архитектуры целевых пакетов различаются, следует использовать соответствующие директивы вдобавок к этим трём.
В нашем случае для дополнительного пакета с картинкой указываются, как другая лицензия, так и информация об архитектурной независимости компонента (BuildArch: noarch). Также для пакета с программой добавлена зависимость на пакет с данными (поскольку программа без картинки картинку не откроет☹):
@user: GNU_picture/.gear/GNU_picture.spec
Name: GNU_picture
Version: 1.0
Release: alt1

Summary: Print your special GNU picture
License: GPL-3.0-or-later
Group: Development/Other
Requires: GNU_picture-data

# Automatically added by buildreq on Thu Aug 18 2025
# optimized out: at-spi2-atk glib2-devel glibc-kernheaders-generic glibc-kernheaders-x86 libat-spi2-core libatk-devel libcairo-devel
# libcairo-gobject libcairo-gobject-devel libgdk-pixbuf libgdk-pixbuf-devel libgio-devel libgpg-error libharfbuzz-devel libpango-devel
# libwayland-client libwayland-cursor libwayland-egl pkg-config python3 python3-base sh5 zlib-devel
BuildRequires: libgtk+3-devel

%package data
Summary: Your special GNU picture
License: GFDL-1.3-or-later
Group: Other
BuildArch: noarch

Source0: gtk.c
Source1: GNU.xpm

%description
This is GTK App using for show of a GNU picture

%description data
This is just a GNU picture

%build
gcc %optflags %SOURCE0 -o %name `pkg-config --cflags --libs gtk+-3.0` -DFILEPATH=\"%_datadir/GNU_picture/GNU.xpm\"

%install
install -D %name %buildroot%_bindir/%name
install -D %SOURCE1 %buildroot%_datadir/%name/GNU.xpm

%files
%_bindir/%name

%files data
%_datadir/*

%changelog
* Mon Aug 18 2025 UsamG1t <usamg1t@altlinux.org> 1.0-alt1
- Initial Build
При сборке из одного spec-файла собираются один пакет с исходным кодом и несколько установочных пакетов согласно описанному именованию:
@user
[user@VM GNU_picture]$ gear-hsh --lazy
<...>
Wrote: /usr/src/RPM/SRPMS/GNU_picture-1.0-alt1.src.rpm (w2.lzdio)
Wrote: /usr/src/RPM/RPMS/x86_64/GNU_picture-1.0-alt1.x86_64.rpm (w2.lzdio)
Wrote: /usr/src/RPM/RPMS/x86_64/GNU_picture-data-1.0-alt1.x86_64.rpm (w2.lzdio)
Wrote: /usr/src/RPM/RPMS/x86_64/GNU_picture-debuginfo-1.0-alt1.x86_64.rpm (w2.lzdio)
2.46user 2.38system 0:10.46elapsed 46%CPU (0avgtext+0avgdata 63832maxresident)k
16840inputs+976outputs (48major+223513minor)pagefaults 0swaps
[user@VM GNU_picture]$ cp ~/hasher/repo/x86_64/RPMS.hasher/GNU_picture-data-1.0-alt1.x86_64.rpm ~/hasher/chroot/.in/
[user@VM GNU_picture]$ cp ~/hasher/repo/x86_64/RPMS.hasher/GNU_picture-1.0-alt1.x86_64.rpm ~/hasher/chroot/.in/
@rooter
[root@localhost .in]# rpm -i GNU_picture-1.0-alt1.x86_64.rpm
error: Failed dependencies:
       GNU_picture-data = 1.0-alt1 is needed by GNU_picture-1.0-alt1.x86_64

[root@localhost .in]# rpm -i GNU_picture-data-1.0-alt1.x86_64.rpm
<13>Aug 22 07:11:37 rpm: GNU_picture-data-1.0-alt1 1755846621 installed

[root@localhost .in]# rpm -i GNU_picture-1.0-alt1.x86_64.rpm
<13>Aug 22 07:11:43 rpm: GNU_picture-1.0-alt1 1755846621 installed

[root@localhost .in]# which GNU_picture
/usr/bin/GNU_picture
[root@localhost .in]# ls /usr/share/GNU_picture/
GNU.xpm
[root@localhost .in]# GNU_picture
GNU License