<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+.}:" && 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'
+...
+</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;