From c71980bf40131d778b445ad2dbe9deaadde7c356 Mon Sep 17 00:00:00 2001 From: xf0r3m Date: Tue, 30 Apr 2024 19:01:57 +0200 Subject: [PATCH] =?utf8?q?Rozpocz=C4=99cie=20tworzenia=20rozdzia=C5=82u=20?= =?utf8?q?15.=20Podrozdzia=C5=82=2015.3.2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- articles/terminallog/Linux.Podstawy.html | 290 +++++++++++++++++++++++ 1 file changed, 290 insertions(+) diff --git a/articles/terminallog/Linux.Podstawy.html b/articles/terminallog/Linux.Podstawy.html index c5a02f4..464a32d 100644 --- a/articles/terminallog/Linux.Podstawy.html +++ b/articles/terminallog/Linux.Podstawy.html @@ -12307,6 +12307,296 @@ $ java -jar file.jar
 $ javac file.java
 
+

15. Wprowadzenie do kompilacji oprogramowania kodu źródłowego C

+

+ Jedną z wielu zalet dystrybucji Linuksa jako systemu operacyjnego + jest fakt, że większość dostępnego na niego oprogramowania jest nie + tyle darmowa co rozprowadzana poprzez archiwa zawierające kod + źródłowy danego programu. Każdy może sobie go pobrać, użyć, dostosować, + a nawet redystrybuować z uznaniem pierwotnego autora, jednak ten + aspekt jest już kwestią licencji na jakiej dostarczany jest on do + użytkowników. W ten sposób prezentuje się idea + open source - otwartych źródeł. +

+

+ W zamierzchłych czasach gdy komputery znajdowały się w zasięgu + uczelni wyższych, nawet oprogramowanie własnościowe było + rozprowadzane w ten sposób. Dawniej chcać skorzystać z programu + trzeba było wyposażyć się w zestaw narzędzi programistycznych aby + móc w ogółe go uruchomić. Czy te czasy minęły? I tak i nie. Obecnie + w wielu dystrybucjach częściej stosuje się paczki przygotowywane + osoby związane z dystrybucją aniżeli archiwa kodu niezależnie + rozprowadzane przez autora programu. Ma to oczywiście swoje wady oraz + zalety. Tym rozdziale spróbujemy sobie przybliżyć w jaki sposób + możemy zainstalować aplikację dostępną w postaci kodu źródłowego + w naszym systemie. +

+

15.1. Systemy do budowania oprogramowania

+

+ Jak pamietam z poprzedniego rozdziału do automatycznego stworzenia + pliku wykonywalnego dla naszej przykładowej aplikacji + wykorzystaliśmy narzędzie make, narzędzie to wymaga pliku + Makefile, w którym to zapisywane były cele, zależności czy + różnego rodzaju makra. Jednym system budowania oprogramowania + dostępnym na Uniksy jest GNU autoconf. Zadaniem + skryptów tego narzędzia jest przygotowanie plików Makefile + na podstawie analizy docelowego systemu. System ten korzysta z + istniejących już narzędzi takich jak make. Natomiast jeśli + mieli byśmy opisać proces instalacji programów w C w Uniksach to + wyglądałby on następująco: +

+
    +
  1. Rozpakowanie archiwum z kodem źródłowym.
  2. +
  3. Konfigurowanie pakietu.
  4. +
  5. Uruchomienie polecenie make lub innego polecenia + służącego do kompilacji programów.
  6. +
  7. Uruchomienie polecenie make install i instalacja + programów.
  8. +
+

15.2. Rozpakowywanie kodu źródłowego.

+

+ Oczywiście zdaje sobie sprawę, że chyba nie trzeba opisywać procesu + rozpakowywania archiwów w Uniksach. Ten temat był już wałkowany na + samym początku. Nie mniej jednak w przypadku kodu źródłowego, warto + zachować pewną dozę niepewności. Otóż zadajmy sobie proste pytanie. + Co odróżnia program przydatny od szkodliwego oprogramowania? + Odpowiedź jest prosta. Czynności jakie on wykonuje. Na pewnej + płaszczyźnie jedno i drugie to programy, które nom men omen mogą + być rozporowadzane w postaci kodu źrodłowego, który zostanie być może + zostanie przez nas pobrany, skompilowany i zainstalowany w systemie. + Najczęstszym tego typu oprogramowaniem są konie trojańskie. Dlatego + też przed rozpakowaniem takiej paczki z kodem należy upewnić się + co jest w środku. Opcja -t polecenia tar, + pozwoli nam wyświetlić zawartość archiwum bez jego wcześniejszego + rozpakowywania. Na co powinno się zwrócić uwagę? Otóż na taki + drobiazg jak scieżka bezwzględna, przez co + wypakowanie może nadpisać ważne systemowe pliki. +

+

+ W samych archiwach możemy natknąć się takie pliki jak README czy + INSTALL. Te pliki mogą zawierać ważne informacje dotyczące + ustawień narzędzi programistycznych, a nawet cała instrukcję krok po + kroku jak skompilować i zainstalować ten program w naszym systemie. +

+

15.3. GNU autoconf

+

+ Jeśli kiedy uczyliśmy się jezyka C, to wiemy że jest on przenośny + między systemami, jednak między systemami operacyjnymi czy + platformami sprzętowymi instnieje tak wiele różnic, że najczęściej + użycie pojedynczego pliku Makefile nie wykonana poprawnie + budowania programu. Rozważano opcję utworzenia dla każdej platformy + osobny plik Makefile jednak. To wspomniany wcześniej + GNU autoconf stał się rozwiązaniem tego problemu. +

+

+ Projekty programistyczne przygotowane do współpracy z GNU autoconf + zazwyczaj są dostarczane z plikami configure, Makefile.in + oraz config.h.in. Pliki z rozszeniami .in są + szablonami. +

+

+ Natomiast sama koncepcja jest dość prosta. Polega ona na uruchomienie + pliku configure, który sprawdzi system i dokona odpowiednich + podstawień w pliku Makefile.in, tworząc odpowiedni plik + Makefile dla uruchomionego systemu oraz platformy + sprzętowej. Uruchomienie skryptu następuje w bardzo prosty sposób. +

+
+$ ./configure
+
+

+ W czasie działania skryptu zostanie nam wyświetlona duża ilość + komunikatów diagonstycznych. Jeśli działanie skryptu zakończy się + powodzeniem, to wówczas zostanie wygenerowany co najmniej jedem + pliki Makefile, config.h oraz config.cache. + Dzięki czemu nie ma potrzeby przeprowadzania wszystkich testów + ponownie w przypadku kolejnego uruchomienia skryptu. +

+

15.3.1. Przykładowe użycie systemu GNU autoconf

+

+ Dla przykładu uruchomimy sobie testowe budowanie jakieś małego + projektu, aby nabrać nieco praktyki w systemie GNU autoconf + zanim przejdziemy do jego ustawień. Dla przykładu wybrałem pakiet + GNU coreutils, zawierający narzędzia poznane w drugim + rozdziale. Paczkę z kodem źródłowym możemy pobrać z adresu: + http://ftp.gnu.org/gnu/coreutils/ + Kod należy pobrać, rozpakować a następnie skonfigurować. Żeby nie + robić bałaganu w używanym systemie ustawimy jako katalog docelowy + jeden z podkatalogów w naszym katalogu domowym. +

+
+󱩊 xf0r3m@laptop-d71f06f/ coreutils-9.5/󰯆 ./configure --prefix=$HOME/mycoreutils
+checking for a BSD-compatible install... /usr/bin/install -c
+checking whether build environment is sane... yes
+checking for a race-free mkdir -p... /usr/bin/mkdir -p
+checking for gawk... no
+checking for mawk... mawk
+checking whether make sets $(MAKE)... yes
+checking whether make supports nested variables... yes
+checking whether make supports nested variables... (cached) yes
+checking for gcc... gcc
+checking whether the C compiler works... yes
+checking for C compiler default output file name... a.out
+...
+config.status: executing po-directories commands
+config.status: creating po/POTFILES
+config.status: creating po/Makefile
+
+

+ Po zakończeniu działania skryptu configure, zostaje + wygenerowany na podstawie pliku Makefile.in właściwy dla + naszego systemu plik Makefile. W tym wypadku nie pozostaje + nam nic innego jak wydanie polecenia: make +

+
+󱩊 xf0r3m@laptop-d71f06f/ coreutils-9.5/󰯆 make
+  GEN      lib/alloca.h
+  GEN      lib/arpa/inet.h
+  GEN      lib/configmake.h
+  GEN      lib/ctype.h
+  GEN      lib/dirent.h
+  GEN      lib/error.h
+  GEN      lib/fcntl.h
+...
+  CC       lib/libcoreutils_a-copy-acl.o
+  CC       lib/libcoreutils_a-set-acl.o
+  CC       lib/libcoreutils_a-acl-errno-valid.o
+  CC       lib/libcoreutils_a-acl-internal.o
+  CC       lib/libcoreutils_a-get-permissions.o
+  CC       lib/libcoreutils_a-set-permissions.o
+...
+  CCLD     src/chroot
+  CC       src/hostid.o
+  CCLD     src/hostid
+  CC       src/timeout.o
+  CC       src/operand2sig.o
+  CCLD     src/timeout
+  CC       src/nice.o
+  CCLD     src/nice
+  CC       src/who.o
+  CCLD     src/who
+  CC       src/users.o
+  CCLD     src/users
+  CC       src/pinky.o
+  CCLD     src/pinky
+...
+  GEN      man/chroot.1
+  GEN      man/hostid.1
+  GEN      man/timeout.1
+  GEN      man/nice.1
+  GEN      man/who.1
+  GEN      man/users.1
+  GEN      man/pinky.1
+  GEN      man/stty.1
+...
+make[2]: Leaving directory '/home/xf0r3m/Pobrane/coreutils-9.5'
+Making all in gnulib-tests
+make[2]: Entering directory '/home/xf0r3m/Pobrane/coreutils-9.5/gnulib-tests'
+## ---------------------------------------------------- ##
+## ------------------- Gnulib tests ------------------- ##
+## You can ignore compiler warnings in this directory.  ##
+## ---------------------------------------------------- ##
+make  all-recursive
+make[3]: Entering directory '/home/xf0r3m/Pobrane/coreutils-9.5/gnulib-tests'
+Making all in .
+make[4]: Entering directory '/home/xf0r3m/Pobrane/coreutils-9.5/gnulib-tests'
+  CC       bench_md5-bench-md5.o
+  CC       c-strcasestr.o
+  CC       c32tob.o
+  CC       ioctl.o
+  CC       localename.o
+...
+make[4]: Leaving directory '/home/xf0r3m/Pobrane/coreutils-9.5/gnulib-tests'
+make[3]: Leaving directory '/home/xf0r3m/Pobrane/coreutils-9.5/gnulib-tests'
+make[2]: Leaving directory '/home/xf0r3m/Pobrane/coreutils-9.5/gnulib-tests'
+make[1]: Leaving directory '/home/xf0r3m/Pobrane/coreutils-9.5'
+
+

+ Powyższy przykład może być nieco bardziej obszerny, ponieważ + zamieściłem w nim fragmenty kolejnych etapów jakie wykonuje narzędzie + make. Teoretycznie możemy już wydadwać polecenie: + make install, ale na początku zobaczymy sobie jakie pliki + będą chciały się zainstalować (uruchamiając tym samym polecenie + make w trybie dry-run). +

+
+󱩊 xf0r3m@laptop-d71f06f/ coreutils-9.5/󰯆 make -n install
+make  install-recursive
+make[1]: Entering directory '/home/xf0r3m/Pobrane/coreutils-9.5'
+...
+dot_seen=no; \
+target=`echo install-recursive | sed s/-recursive//`; \
+case "install-recursive" in \
+  distclean-* | maintainer-clean-*) list='po . gnulib-tests' ;; \
+  *) list='po . gnulib-tests' ;; \
+esac; \
+for subdir in $list; do \
+  echo "Making $target in $subdir"; \
+  if test "$subdir" = "."; then \
+    dot_seen=yes; \
+    local_target="$target-am"; \
+  else \
+    local_target="$target"; \
+  fi; \
+  (CDPATH="${ZSH_VERSION+.}:" && cd $subdir && make  $local_target) \
+  || eval $failcom; \
+done; \
+if test "$dot_seen" = "no"; then \
+  make  "$target-am" || exit 1; \
+fi; test -z "$fail"
+Making install in po
+make[2]: Entering directory '/home/xf0r3m/Pobrane/coreutils-9.5/po'
+...
+
+

+ Dodanie opcji -n do polecenia + make spowoduje wyświetlenie poleceń wykonywanych przez + narzędzie make do zrealizowania celu + install. Po sprawdzeniu poleceń, + możemy wydać polecenie make install. +

+
+󱩊 xf0r3m@laptop-d71f06f/ coreutils-9.5/󰯆 make install
+make  install-recursive
+make[1]: Entering directory '/home/xf0r3m/Pobrane/coreutils-9.5'
+Making install in po
+make[2]: Entering directory '/home/xf0r3m/Pobrane/coreutils-9.5/po'
+installing af.gmo as /home/xf0r3m/mycoreutils/share/locale/af/LC_MESSAGES/coreutils.mo
+installing af.gmo link as /home/xf0r3m/mycoreutils/share/locale/af/LC_TIME/coreutils.mo
+installing be.gmo as /home/xf0r3m/mycoreutils/share/locale/be/LC_MESSAGES/coreutils.mo
+installing be.gmo link as /home/xf0r3m/mycoreutils/share/locale/be/LC_TIME/coreutils.mo
+installing bg.gmo as /home/xf0r3m/mycoreutils/share/locale/bg/LC_MESSAGES/coreutils.mo
+...
+make[2]: Leaving directory '/home/xf0r3m/Pobrane/coreutils-9.5/po'
+Making install in .
+make[2]: Entering directory '/home/xf0r3m/Pobrane/coreutils-9.5'
+make[3]: Entering directory '/home/xf0r3m/Pobrane/coreutils-9.5'
+ /usr/bin/mkdir -p '/home/xf0r3m/mycoreutils/bin'
+  src/ginstall -c src/ginstall '/home/xf0r3m/mycoreutils/bin/./install'
+  src/ginstall -c src/chroot src/hostid src/timeout src/nice src/who src/users src/pinky src/stty
+...
+make[4]: Entering directory '/home/xf0r3m/Pobrane/coreutils-9.5/gnulib-tests'
+make[5]: Entering directory '/home/xf0r3m/Pobrane/coreutils-9.5/gnulib-tests'
+make[5]: Leaving directory '/home/xf0r3m/Pobrane/coreutils-9.5/gnulib-tests'
+make[4]: Leaving directory '/home/xf0r3m/Pobrane/coreutils-9.5/gnulib-tests'
+make[3]: Leaving directory '/home/xf0r3m/Pobrane/coreutils-9.5/gnulib-tests'
+make[2]: Leaving directory '/home/xf0r3m/Pobrane/coreutils-9.5/gnulib-tests'
+make[1]: Leaving directory '/home/xf0r3m/Pobrane/coreutils-9.5'
+
+

+ Po podaniu za pomocą opcji --prefix, + narzędzie make zainstalowało + zbudowane pliki wykonywalne we wskazanym w opcji katalogu. A tak + prezentuje się zawartość tego katalogu: +

+
+󱩊 xf0r3m@laptop-d71f06f/ coreutils-9.5/󰯆 ls -l ~/mycoreutils/
+razem 0
+drwxr-xr-x 2 xf0r3m xf0r3m 2160 04-30 18:49 bin
+drwxr-xr-x 3 xf0r3m xf0r3m   60 04-30 18:49 libexec
+drwxr-xr-x 5 xf0r3m xf0r3m  100 04-30 18:49 share
+
+

15.3.2. Instalacja za pomocą narzędzia do tworzenia pakietów

2024; COPYLEFT; ALL RIGHTS REVERSED; -- 2.39.5