При работе с проектами со свободными лицензиями нередко встречаются случаи, когда из одного и того же набора исходных текстов необходимо собирать несколько пакетов. Частым примером является
сборка библиотек, а именно обычной их версии и devel-версии, и если это необходимо — статической версии. Ведение отдельных репозиториев для сборки разных пакетов в таком случае — нерациональное решение. Важным случаем является как раз проблема лицензирования: в проекте могут присутствовать материалы разных лицензий (например, для исходных текстов и для документации). По правилам ALT Linux Team допустима сборка пакета со множеством лицензий для исходников при условии упоминания всех лицензий в соответствующей директиве spec-файла. Однако лицензии могут быть даже
несовместимыми — например, программная часть компьютерной игры может распространяться под GPL, а контент к ней (изображения, музыка) — под лицензией,
запрещающей модификацию. Строго говоря, такая лицензия не свободна, но допускает свободное распространение. Кстати, в этом варианте есть и ещё один повод разделить пакеты — программная часть будет архитектурно зависимой (попадёт в раздел репозитория
x86_64), а часть с мультимедиа-контентом — архитектурно независимой (попадёт в раздел
noarch).
Рассмотрим небольшую программу, выводящую картинку на экран, в котором на основе одних исходников соберём два пакета: один с исполняемым файлом, второй — с картинкой.
@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: .
В нашем случае для дополнительного пакета с картинкой указываются, как другая лицензия, так и информация об архитектурной независимости компонента (BuildArch: noarch). Также для пакета с программой добавлена зависимость на пакет с данными (поскольку программа без картинки картинку не откроет☹):
При сборке из одного spec-файла собираются один пакет с исходным кодом и несколько установочных пакетов согласно описанному именованию: