2011-11-04 6 views
7

Większość pól w pliku kontrolnym dpkg (Debian) jest prosta. Trudne jest ustalenie listy zależności (zależy :). Miałem nadzieję, że dpkg-gencontrol może zrobić to dla mnie, patrząc na wyjście ldd dla plików wykonywalnych w katalogu pakietów. Być może tak, ale nie mogę go uruchomić.Czy istnieje sposób automatycznego określania zależności podczas konfigurowania pliku kontrolnego dpkg?

Jeśli to jest to, co jest dla dpkg-gencontrol, błąd otrzymuję to:

dpkg-gencontrol: error: syntax error in control_template at line 7: first block lacks a source field. 

Dla porównania, komenda jest dpkg-gencontrol -v1.1 -ccontrol_template -lchangelog -Pdebian. Plik ten zawiera control_template:

Package: my-package 
Maintainer: Joe Coder <[email protected]> 
Description: The my-package system 
A longer description that runs to the end of one line and then 
extends to another line. 
Priority: optional 

Jeśli nie jest to co dpkg-gencontrol jest, czy ktoś ma jakieś sugestie co do tego, co można zrobić, lub porady na temat jak skonfigurować listę zależności, idealnie automatycznie?

Prawdą jest, że wnioskowanie zależności w sposób ogólny jest prawdopodobnie bardzo trudnym problemem, szczególnie jeśli rozszerzysz wyszukiwanie na skrypty i inne programy. Mam nadzieję, że istnieją narzędzia, które działają przez większość czasu.

Należy pamiętać, że dotyczy to tylko dystrybucji wewnętrznej. Nie buduję pakietu do dystrybucji Linuksa, ani nawet do pobrania przez ogół społeczeństwa, więc z przyjemnością zginam/łamam standardowe zasady w razie potrzeby.

Odpowiedz

10

Po kilku wykopaliskach inspirowanych odpowiedzią thitona i mnóstwem prób i błędów, w końcu znalazłem rozwiązanie mojego problemu. Okazuje się, że dpkg-gencontrol nie jest narzędziem do wyprowadzania zależności pakietów od plików wykonywalnych, dpkg-shlibdeps jest. Należy jednak starannie przygotować oba programy, aby pomóc w wygenerowaniu pakietu. Czytaj dalej ....

Uruchomienie dpkg-shlibdeps -O <executable> powoduje wyświetlenie listy pakietów i wersji, które należy zainstalować, aby uruchomić ten plik wykonywalny. Idealny. Prawie. Najlepiej byłoby, gdyby dpkg-gencontrol mógł użyć tego w swoim przetwarzaniu, który, jak twierdzi, jest w stanie wykonać poprzez swoją funkcję podstawiania zmiennych.

Aby to działało bezproblemowo, musiałem utworzyć strukturę katalogów, która odpowiada oczekiwaniom narzędzi do pakowania Debiana. To wygląda w zasadzie tak:

my_project_directory/ 
    main.c (or other source code, etc.) 
    debian/ 
    changelog (created by hand; see below) 
    control  (this is basically a template, created by hand; see below) 
    files  (created by dpkg-gencontrol) 
    substvars (created by dpkg-shlibdeps and used by dpkg-gencontrol) 
    tmp/   (tmp is the root of the target system's filesystem) 
     path/ 
     to/ 
      my/ 
      project/ 
       executable_1 (this will be installed at /path/to/my/project) 
       executable_2 (this, too) 
     var/ 
     www/ 
      index.php (this will be installed at /var/www on target systems) 
     DEBIAN/  (create this by hand) 
     control  (created by dpkg-gencontrol and used in the final package) 

Uwaga, że ​​narzędzia do pakowania Debiana zachowanie właściciela i grupę wszystkich plików pod debian/tmp /. Tak więc, jeśli chcesz mieć pliki będące własnością użytkownika root lub innego użytkownika po zainstalowaniu, sprawy stają się trudne. Jedną z opcji jest przygotowanie drzewa katalogów Debiana jako root i ustawienie właścicieli, jak chcesz. Jeśli wolisz nie uruchamiać się jako root lub nie wolno ci tego robić, istnieje inny sposób.

Utwórz skrypt, który wywołuje chown itp., Aby dostosować właściciela, jak chcesz, z ostatnim wierszem jest dpkg-deb -b debian/tmp . (który buduje pakiet .deb, patrz poniżej na przykład). Uruchom go przez fakeroot, inne narzędzie Debiana, takie jak to: fakeroot ./fix_ownerships_and_build.sh. Fakeroot pozwala programom zachowywać się tak, jakby były rootami, bez faktycznego zmieniania rzeczy tak, jak robiłby to root. Został stworzony dla tego właśnie scenariusza.

Sprawdziłem, dlaczego program dpkg-gencontrol generował błąd "pierwszego bloku nie ma pola źródłowego", nawet posuwając się do czytania jego źródła Perla. Jak to często bywa, kod błędu jest precyzyjny bez podania wystarczającego kontekstu, aby wiedzieć, co należy zrobić: plik kontrolny naprawdę potrzebuje pola zwanego "źródłem" w jego pierwszych (dwóch) blokach.

Istnieją dwa rodzaje pakietów Debiana: źródłowy i binarny. Myślałem, że potrzebuję wersji binarnej, ponieważ chcę umieścić w niej skompilowane pliki wykonywalne, ale nie mogłem tego zrobić. Wypróbowałem pakiet źródłowy i dodałem pole źródłowe do mojego pliku kontrolnego. To pozbyło się błędu "pierwszego bloku nie zawierało pola źródłowego", ale doprowadziło do następnego. Dokładniej czytając dokumentację, zdałem sobie sprawę, że pakiety źródłowe need two "paragraphs" w swoich plikach kontrolnych. Raz zmieniłem plik kontrolny, aby wyglądać tak, że zaczął działać (prawie):

Source: my-package 
Maintainer: Joe Coder <[email protected]> 

Package: my-package 
Priority: optional 
Architecture: amd64 
Depends: ${shlibs:Depends}, apache2, php5 
Description: The My-Package System 
A longer description that runs to the end of one line and then 
extends to another line. 

Co jeszcze brakowało był changelog plików. Jest to plik przechowujący historię wydań pakietu, ze znaczącymi zmianami, numerami wersji, datami i osobami odpowiedzialnymi. Zwykle utrzymuję taką rzecz w moim własnym formacie, który starannie zamieniłem na wymagający format dzienników zmian w Debianie. Z jakiegoś powodu, changelog zostało pominięte w końcowym opakowaniu, więc zostawiłem mój plik historii samotnie i używane zastępczy zamiast, który wygląda tak:

my-package (1.0) unstable; urgency=low 
    * placeholder changelog to satisfy dpkg-gencontrol 
-- Joe Coder <[email protected]> Thu, 3 Nov 2011 16:49:00 -0700 

Dwaj czołowi przestrzenie na linii z gwiazdką są niezbędne , tak jak pojedyncza prowadząca przestrzeń na linii z -, podobnie jak dwie spacje między adresem e-mail a datą. I tak, data musi być dokładna, strefa czasowa i wszystkie, nawet jeśli nie musi być dokładna.

Umieszczenie wszystko razem, z drzewa katalogów debian utworzonej w sposób opisany powyżej, sekwencja poleceń potrzebnych do zbudowania pakietu są następujące:

dpkg-shlibdeps debian/tmp/path/to/my/project/executable_1 \ 
       debian/tmp/path/to/my/project/executable_2 
dpkg-gencontrol -v1.1 (or whatever version you are building) 
fakeroot ./fix_ownerships_and_build.sh 

gdzie fix_ownerships_and_build.sh wygląda następująco:

chown -R root:root debian/tmp/path (or whatever user is appropriate) 
chown -R www-data:www-data debian/tmp/var/www/* (same goes here) 
dpkg-deb -b debian/tmp . (this leads to a nice my-package_1.1_amd64.deb file) 

To wszystko. Mam nadzieję, że ta odpowiedź pomoże innym osiągnąć postęp szybciej niż ja.

+0

Dobra robota, ale przeprogramowałeś znaczną część dpkg-buildpackage. Jesteś świadomy tego narzędzia, prawda? – thiton

+0

Nieco. Istnieją dziesiątki narzędzi związanych z dpkg i byłem zainteresowany utrzymaniem prostoty. Narzędzia Debiana również wydawały się być tak skoncentrowane na tworzeniu pakietów z zewnętrznych źródeł do dystrybucji z samym Debianem, co nie jest dokładnie tym, co próbowałem zrobić. Zacząłem od zbudowania prostego drzewa katalogów, minimalnego pliku kontrolnego i pojedynczego wywołania do 'dpkg-deb -b'. Próbowałem znaleźć minimalne dodatki do tej bazy, aby uzyskać to, czego chciałem. W pewnym sensie rósł. :) Zajrzę do dpkg-buildpackage. Odkrycie koła często stanowi dużą część nauki. –

1

Właściwie, patrząc na listę dołączonych bibliotek jest dość powszechny w programach C i tylko w roli pomocnika shlibs (dpkg-shlibdeps). Spójrz na jego stronę podręcznika pomocy, ale w zasadzie sprowadza się do korzystania z ${shlibs:Depends} w linii zależnej.

+0

To była wskazówka, która doprowadziła mnie do rozwiązania. Dzięki, thilton. I dla odniesienia nie pomogło dh_shlibdeps, ale dpkg-shlibdeps. –

+0

@randallecook: Dzięki za podpowiedź, odpowiednio edytowane. – thiton

Powiązane problemy