]> gitweb.morketsmerke.org Git - mmdev.git/commitdiff
Rozpoczęcie tworzenia rozdziału 15. Podrozdział 15.3.2.
authorxf0r3m <jakubstasinski@protonmail.com>
Tue, 30 Apr 2024 17:01:57 +0000 (19:01 +0200)
committerxf0r3m <jakubstasinski@protonmail.com>
Tue, 30 Apr 2024 17:01:57 +0000 (19:01 +0200)
articles/terminallog/Linux.Podstawy.html

index c5a02f4975bc78510dfee707ae9f7009084d4b68..464a32d026a5c37623cd3e033e056266e7c85f51 100644 (file)
@@ -12307,6 +12307,296 @@ $ java -jar file.jar
 <pre class="code-block">
 $ javac file.java
 </pre>
+        <h1 id="15.introducingtoccsourcecodesoftware">15. Wprowadzenie do kompilacji oprogramowania kodu źródłowego C</h1>
+        <p>
+          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
+          <strong>open source</strong> - otwartych źródeł.
+        </p>
+        <p>
+          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.
+        </p>
+        <h2 id="15.1.softwarebuildsystems">15.1. Systemy do budowania oprogramowania</h2>
+        <p>
+          Jak pamietam z poprzedniego rozdziału do automatycznego stworzenia
+          pliku wykonywalnego dla naszej przykładowej aplikacji
+          wykorzystaliśmy narzędzie <em>make</em>, narzędzie to wymaga pliku
+          <em>Makefile</em>, 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 <strong>GNU autoconf</strong>. Zadaniem
+          skryptów tego narzędzia jest przygotowanie plików <em>Makefile</em>
+          na podstawie analizy docelowego systemu. System ten korzysta z
+          istniejących już narzędzi takich jak <em>make</em>. Natomiast jeśli
+          mieli byśmy opisać proces instalacji programów w C w Uniksach to
+          wyglądałby on następująco:
+        </p>
+        <ol>
+          <li>Rozpakowanie archiwum z kodem źródłowym.</li>
+          <li>Konfigurowanie pakietu.</li>
+          <li>Uruchomienie polecenie <em>make</em> lub innego polecenia
+          służącego do kompilacji programów.</li>
+          <li>Uruchomienie polecenie <em>make install</em> i instalacja
+          programów.</li>
+        </ol>
+        <h2 id="15.2.sourcecodeunpack">15.2. Rozpakowywanie kodu źródłowego.</h2>
+        <p>
+          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 <strong>-t</strong> polecenia <em>tar</em>,
+          pozwoli nam wyświetlić zawartość archiwum bez jego wcześniejszego
+          rozpakowywania. Na co powinno się zwrócić uwagę? Otóż na taki
+          drobiazg jak <strong>scieżka bezwzględna</strong>, przez co
+          wypakowanie może nadpisać ważne systemowe pliki.
+        </p>
+        <p>
+          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. 
+        </p>
+        <h2 id="15.3.gnuautconf">15.3. GNU autoconf</h2>
+        <p>
+          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 <em>Makefile</em> nie wykonana poprawnie
+          budowania programu. Rozważano opcję utworzenia dla każdej platformy
+          osobny plik <em>Makefile</em> jednak. To wspomniany wcześniej
+          <em>GNU autoconf</em> stał się rozwiązaniem tego problemu.
+        </p>
+        <p>
+          Projekty programistyczne przygotowane do współpracy z <em>GNU autoconf</em>
+          zazwyczaj są dostarczane z plikami <em>configure</em>, <em>Makefile.in</em>
+          oraz <em>config.h.in</em>. Pliki z rozszeniami <em>.in</em> są
+          szablonami.
+        </p>
+        <p>
+          Natomiast sama koncepcja jest dość prosta. Polega ona na uruchomienie
+          pliku <em>configure</em>, który sprawdzi system i dokona odpowiednich
+          podstawień w pliku <em>Makefile.in</em>, tworząc odpowiedni plik
+          <em>Makefile</em> dla uruchomionego systemu oraz platformy
+          sprzętowej. Uruchomienie skryptu następuje w bardzo prosty sposób.
+        </p>
+<pre class="code-block">
+$ ./configure
+</pre>
+        <p>
+          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 <em>Makefile</em>, <em>config.h</em> oraz <em>config.cache</em>.
+          Dzięki czemu nie ma potrzeby przeprowadzania wszystkich testów
+          ponownie w przypadku kolejnego uruchomienia skryptu.
+        </p>
+        <h3 id="15.3.1.sampleusageofgnuautoconf">15.3.1. Przykładowe użycie systemu GNU autoconf</h3>
+        <p>
+          Dla przykładu uruchomimy sobie testowe budowanie jakieś małego
+          projektu, aby nabrać nieco praktyki w systemie <em>GNU autoconf</em>
+          zanim przejdziemy do jego ustawień. Dla przykładu wybrałem pakiet
+          <em>GNU coreutils</em>, zawierający narzędzia poznane w drugim
+          rozdziale. Paczkę z kodem źródłowym możemy pobrać z adresu:
+          <a href="http://ftp.gnu.org/gnu/coreutils/">http://ftp.gnu.org/gnu/coreutils/</a>
+          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.
+        </p>
+<pre class="code-block">
+󱩊 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
+</pre>
+        <p>
+          Po zakończeniu działania skryptu <em>configure</em>, zostaje
+          wygenerowany na podstawie pliku <em>Makefile.in</em> właściwy dla
+          naszego systemu plik <em>Makefile</em>. W tym wypadku nie pozostaje
+          nam nic innego jak wydanie polecenia: <em>make</em>
+        </p>
+<pre class="code-block">
+󱩊 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'
+</pre>
+        <p>
+          Powyższy przykład może być nieco bardziej obszerny, ponieważ
+          zamieściłem w nim fragmenty kolejnych etapów jakie wykonuje narzędzie
+          <em>make</em>. Teoretycznie możemy już wydadwać polecenie: 
+          <em>make install</em>, ale na początku zobaczymy sobie jakie pliki
+          będą chciały się zainstalować (uruchamiając tym samym polecenie
+          <em>make</em> w trybie <em>dry-run</em>).
+        </p>
+<pre class="code-block">
+󱩊 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+.}:" &amp;&amp; cd $subdir &amp;&amp; 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'
+...
+</pre>
+        <p>
+          Dodanie opcji <code class="code-inline">-n</code> do polecenia
+          <em>make</em> spowoduje wyświetlenie poleceń wykonywanych przez
+          narzędzie <em>make</em> do zrealizowania celu
+          <code class="code-inline">install</code>. Po sprawdzeniu poleceń,
+          możemy wydać polecenie <code class="code-inline">make install</code>.
+        </p>
+<pre class="code-block">
+󱩊 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'
+</pre>
+        <p>
+          Po podaniu za pomocą opcji <em>--prefix</em>,
+          narzędzie <em>make</em> zainstalowało
+          zbudowane pliki wykonywalne we wskazanym w opcji katalogu. A tak
+          prezentuje się zawartość tego katalogu:
+        </p>
+<pre class="code-block">
+󱩊 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
+</pre>
+        <h3 id="15.3.2.installationviapackagestool">15.3.2. Instalacja za pomocą narzędzia do tworzenia pakietów</h3>
       </div>
                        <p style="margin: 15px; padding: 0; outline: 0;">
                                2024; COPYLEFT; ALL RIGHTS REVERSED;