automake, build-essential, Cmake... na dobry start

Spis treści

automake, cmake, itd. to naprawdę dobry startArtykuł ten nie będzie kolejnym opisem możliwości języka C/C++ czy zasad programowania. Chciałbym wskazać co zrobić by pod Debianem i pokrewnymi samodzielnie przetworzyć kod źródłowy programu do jego postaci wykonalnej.

Celem będzie samodzielna kompilacja (budowa ze źródeł) programów: Gqrx oraz CubicSDR . Znajdziesz tu coś w rodzaju "zupy w proszku". Prosty przepis: zalać wrzątkiem, zamieszać, poczekać chwilę, być czujnym, zjeść, nie narzekać! ;)

Nie jest to przepis dla koneserów o "wyczulonym podniebieniu" :o Zainteresowani "kompilacją na poważnie" winni jednak sięgnąć w sieci do materiałów adresowanych do nich.

Dbałość autorów kodu oraz skuteczna weryfikacja jego poprawności powoduje, że to co kiedyś było domeną zaawansowanych użytkowników (programistów?) teraz "trafia pod strzechy". Zastanawiasz się pewnie czy warto? Moim zdaniem - tak.

Ale... zanim coś ściągniesz zastanów się: czy naprawdę tego potrzebujesz, a źródło zasługuje na zaufanie. Poświęć na sprawdzenie tego nawet kilka dni, gdyż usuwanie skutków - nierozważnych - decyzji może być uciążliwe. :/

Wymienione programy w repozytoriach dystrybucji dostępne są w starszej wersji niż tych udostępnianych w postaci źródeł. I tak np. Gqrx(-sdr): 2.9-2 jako pakiet, 2.11-5 jako żródła, CubicSDR - 0.2.3/0.2.4. Przykłady można mnożyć.

Różnica w wersjach to (często) nie tylko rozwój funkcjonalności programu (co również jest istotne), ale - wielokrotnie - usuwanie błędów.

Dlatego też może się zdarzyć, że konkretny kod programu wymaga "doposażenia" o coś więcej i warto dokładnie przeanalizować treść komunikatów pojawiających na ekranie w trakcie kompilacji. IMO niezastąpiony tu będzie terminal. Niektórzy nazywają go też konsolą.


 

Terminal - i wszystko jasne

Obecnie większość użytkowników (dowolnych systemów) - w tym ja - najczęściej korzysta z trybu graficznego. Z okien. Łatwo, miło i przyjemnie.

Uruchomienie terminalaNaszą radość nie raz zburzy to, że klikając aktywator/ikonę czekamy na uruchomienie się programu, czekamy, czekamy, ...

I nic... :( Czasami była klepsydra, czasami nie. Dopiero, gdy to samo polecenie wydamy w oknie terminala - często - przez ekran przewija się krótsza/dłuższa lista komunikatów o błędach.

Dlatego tym, którzy chcą samodzielnie kompilować źródła rekomenduję wykonywanie (wywoływanie) tego procesu WYŁĄCZNIE w oknie terminala. Terminal instalowany jest automatycznie.Wyłączenie (w terminalu) ograniczenia wielkości listingu

Uruchomienie terminala (Debian, Ubuntu, Mint, itd.) jest bardzo proste. Na rysunku obok przedstawiłem metody najczęściej wykorzystywane.

Po uruchomieniu terminala na (górnym) pasku okna wyszukaj opcję Edycja, rozwinie się lista dostępnych zakładek. Na samym dole widocna jest ta o nazwie Preferencje. Kliknij ją. Otworzy się nowe okno, prezentujące różne profile i ustawienia terminala. Mój profil (zapisany) to sp4irx. Po wybraniu swego kliknij zakładkę o nazwie Przewijanie.

Zwróć uwagę na najniższy znacznik odnoszący się do "Ograniczenia ilości do... (domyślnie 10000) ...wierszy". Domyślnie jest on zaznaczony. Ma to zapobiegać sytuacji gdy plik zawierający te informację nadmiernie się rozrośnie.

10000 - wydaje się, że to dużo, ale w przypadku kompilacji - zwłaszcza, gdy posypią się błędy - to może być za mało. Warto utworzyć profil, który w odróżnieniu do pozostałych będzie miał wyłączone to ograniczenie.


 

Potrzebne narzędzia (oprogramowanie)

NarzędziaNie wdając się w szczegóły kolej na zainstalowanie wszystkiego co (Debian i pokrewne) jest potrzebne do samodzielnego ściąnięcia źródeł i kompilowania programów. Są to:

  • Git - rozproszony system kontroli wersji, który w przeciwieństwie do innych nie zapamiętuje kolejnych zmian a kompletne obrazy projektów. Użyteczny program do pobierania kompletnych repozytoriów,
  • build-essential - (w Debianie i pokrewnych) zawiera listę z informacjami o pakietach, które są niezbędne do budowania pakietów. Wymagane, powiązane pakiety (które zostaną dociągnięte "z automatu") to m.in.: dpkg-dev (narzędzia deweloperskie), g++ (kompilator GNU C++), gcc (kompilator GNU C), libc6-dev (biblioteka GNU C: zawierająca biblioteki deweloperskie oraz pliki nagłówkowe), make (narzędzie do zarządzania procesem kompilacji),
  • automake - to narzędzie do automatycznego (czyli tych co nie lubią się męczyć ;) ) generowania (Makefile.in's z plików o nazwie` Makefile.am, które są zbiorem makrodefinicji dla make) plików Makefiles zgodnych ze standardami GNU,
  • cmake - wieloplatformowy (typu open-source) system "wsparcia" polecenia make. Służy do kontrolowania (niezależnie od platformy i kompilatora) przy użyciu prostych plików konfiguracyjnych procesu kompilacji oprogramowania. CMake generuje natywne pliki makefiles i obszary robocze, które mogą być używane w wybranym środowisku. Działanie CMake jest dość złożone, ale i skuteczne: można obsługiwać złożone środowiska wymagające: konfiguracji systemu, generowania pre-procesora, generowania kodu i tworzenia instancji szablonu,
  • libpulse-dev, libgtk-3-dev - biblioteki, których nazwy pojawiały się kilkakrotnie podczas moich prób kompilacji oprogramowania SDR. Możliwe, że ich nie będziesz potrzebował, więc można z nich zrezygnować. Doinstalujesz później, gdy zajdzie taka potrzeba (podczas kompilacji przez ekran przewinie się stosowny komunikat).

Tyle teorii. Więcej znajdziesz w sieci.

Czas na praktykę. W oknie terminala wywołujemy proces instalacji wymienionych pakietów:

~ $ sudo apt-get install git build-essential automake cmake libpulse-dev libgtk-3-dev
[sudo] hasło użytkownika user: [tu podaj swoje hasło użytkownika]
[inne komunikaty]
Odczyt informacji o stanie...
Gotowe
automake is already the newest version (1:1.15.1-3ubuntu2).
build-essential is already the newest version (12.4ubuntu1).
cmake is already the newest version (3.10.2-
libgtk-3-dev is already the newest version (3.22.30-1ubuntu1).
git is already the newest version (1:2.17.1-1ubuntu0.
libpulse-dev is already the newest version (1:11.1-1ubuntu7.1). ...
... 0 aktualizowanych, 0 nowo instalowanych, 0 usuwanych i 0 nieaktualizowanych.
~ $

Specjalnie przedstawiłem sytuację, gdy wymienione programy są już zainstalowane. Zauważ: nie stało się nic grożnego. Pojawił się jedynie komunikat, że program jest już w najnowszej wersji ("is already the newest version"). Gdyby go nie było, zostałby zainstalowany, ewentualnie zaktualizowany.

Czasami mimo ich obecności warto pakiety przeistalować. Zależy to wyłącznie od Ciebie. Dla reinstalacji niezbędnym jest wykonanie następującego polecenia - poprzednie uzupełnione o parametr --reinstall, w listingu nie ma pytania o hasło użytkownika, bo w tej sesji zostało już podane. Jeśli pojawi się, podaj hasło :

~ $ sudo apt-get install --reinstall git build-essential automake cmake libpulse-dev libgtk-3-dev
Czytanie list pakietów...
Gotowe
Budowanie drzewa zależności
Odczyt informacji o stanie...
Gotowe 0 aktualizowanych, 0 nowo instalowanych, 6 ponownie instalowanych, 0 usuwanych i 0 nieaktualizowanych.
Konieczne pobranie 8 535 kB archiwów.
Po tej operacji zostanie dodatkowo użyte 0 B miejsca na dysku.
Pobieranie:1 http://archive.ubuntu.com/ubuntu bionic/main amd64 automake all 1:1.15.1-3ubuntu2 [509 kB]
/... - skrót/
Pobieranie:6 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libpulse-dev amd64 1:11.1-1ubuntu7.1 [81,5 kB]
Pobrano 8 535 kB w 1s (6 978 kB/s) ...
~ $

Wymusiliśmy ponowne pobranie i reinstalację wskazanych pakietów. Możemy sprawdzić (pytając o wersję) czy wszystko jest ok:

~ $ g++ --version
g++ (Ubuntu 7.3.0-16ubuntu3) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc. /... - skrót/

~ $ gcc --version
gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc. /... - skrót/

~ $ automake --version
automake (GNU automake) 1.15.1
Copyright (C) 2017 Free Software Foundation, Inc. /... - skrót/

~ $ cmake --version
cmake version 3.10.2
CMake suite maintained and supported by Kitware (kitware.com/cmake).

~ $ make --version
GNU Make 4.1
Ten program został zbudowany dla systemu x86_64-pc-linux-gnu
Copyright (C) 1988-2014 Free Software Foundation, Inc. /... - skrót/

~ $ autoconf --version
autoconf (GNU Autoconf) 2.69
Copyright (C) 2012 Free Software Foundation, Inc. /... - skrót/
~ $

Wspominałem, że zależne pakiety zostaną "automatycznie dociągnięte". Takim pakietem jest tu np. autoconf. No dobrze mamy już narzędzia (programy) do kompilacji programów źródłowych. Ale skąd je brać.


 Źródła "źródeł"

ŹródłaW artykule nie zajmuję się aplikacjami komercyjnymi, a jedynie tymi, których źródła są udostępniane w sieci przez autorów na zasadach otwartego/wolnego oprogramowania.

Pozostaje pytanie: co kompilować? Odpowiedź jest prosta: to co jest nam potrzebne. A także dostępne. Przyponinam: zanim coś ściągniesz - zastanów się: czy naprawdę tego potrzebujesz, czy źródło z którego chcesz ściągać - też zasługuje na Twoje zaufanie?

Zasadniczo są 2 metody udostępniania przez autorów na ich stronach domowych i/lub w chmurze (np. zasobach GitHub'a) kodów źródłowych programów poprzez:

  • repozytoria - tj. zbiory katalogów i plików, które po skopiowaniu do lokalnych zasobów gotowe są do kompilacji lub tzw.
  • tarball-e - są to archiwa katalogów i plików połączonych w całość. Nazwa ma charakter metaforyczny – plik TAR „scala” pliki w jedną całość zachowując przy tym strukturę katalogów.

W dalszych przykładach posługuję się terminami: nazwa serwera, katalog_projektu, nazwa_projektu, nazwa_pliku, itd. Możesz się zastanawiać: skąd masz wiedzieć jaka jest rzeczywista nazwa?

Na stronach źródeł zawsze jest podany adres wraz ze wszystkimi niezbędnymi (do pobrania plików) danymi.

W pierwszym przypadku (repozytorium .git do pobrania):

  • sprawdź gdzie jesteś, tzn. w jakim katalogu? Jeśli jest taka potrzeba - przejdż do wybranego przez Ciebie katalogu. Pamiętaj - jeśli nie wskażesz inaczej - klon repozytorium powstanie w katalogu, w którym obecnie się znajdujesz się znajdujesz). Nie zawsze wrzucenie paczki do dowolnego katalogu jest zabawne ;). Jeśli jesteś tam, gdzie chcesz:
  • po prostu sklonuj całe [repozytorium] wydając w terminalu polecenie:
~$ git clone git: //nazwa_serwera/katalog_projektu/nazwa_projektu.git

W drugim przypadku (tarball) ściągnij (zapisz/skopiuj) plik archiwum w katalogu docelowym wydając w terminalu polecenie:

~$ wget http: //nazwa serwera/katalog_pliku/nazwa_pliku.tar.gz

Oczywiście rozszerzenie pliku (tu: tar.gz) może być inne. Do rozpakowania pliku archiwum należy użyć właściwego programu. Nie będzie przesadą sprawdzenie sumy kontrolnej (jeśli autor ją udostępnił) pobranego archiwum wydając polecenie:

~$ wget http: //nazwa serwera/katalog_pliku/nazwa_pliku.md5
~$ md5sum --check --ignore-missing nazwa_pliku.md5


Więcej informacji i opcji poleceń poleceń git oraz wget znajdziesz w dokumentacji Twego systemu. Jeśli wszystko jest w porządku wejdź do utworzonego katalogu projektu (obie metody utworzą taki katalog) i:

  • bardzo często w katalogu znajdziesz pliki z opisem: zależności (wymagane dodatkowe pakiety), konfiguracji środowiska i prowadzenia samego procesu kompilacji,
  • podczas kompilacji (prowadzonej zgodnie z zaleceniami autora) w oknie terminala mogą pojawić się istotne komunikaty - zwłaszcza gdy wskazują na pojawienie się błędów procesu - koniecznie przeanalizuj ich treść. Warto zrealizować zawarte w nich sugestie.

Okazuje się, że kompilacja zakończona sukcesem też może dawać wiele satysfakcji. I - wbrew pozorom - nie jest taka trudna.

//