Dlaczego zawsze./ configure; make; make install; as 3 separate steps?

Za każdym razem, gdy kompilujesz coś ze źródła, przechodzisz przez te same 3 kroki:

$ ./configure
$ make
$ make install

Rozumiem, że to ma sens, aby podzielić proces instalacji na różne etapy, ale nie rozumiem, dlaczego każdy koder na tej planecie musi pisać te same trzy polecenia raz po raz, aby wykonać jedno zadanie. Z mojego punktu widzenia byłoby całkowicie sensowne, aby skrypt ./install.sh dostarczany automatycznie z kodem źródłowym, który zawiera następujące tekst:

#!/bin/sh
./configure
make
make install
Dlaczego ludzie mieliby robić te 3 kroki osobno?
Author: Cœur, 2012-06-09

4 answers

Ponieważ każdy krok robi różne rzeczy

Przygotowanie (Konfiguracja) środowiska do budowy

./configure

Ten skrypt ma wiele opcji, które należy zmienić. Jak --prefix lub --with-dir=/foo. Oznacza to, że każdy system ma inną konfigurację. Również ./configure sprawdza brakujące biblioteki, które powinny być zainstalowane. Cokolwiek złego tutaj powoduje, że nie budujesz aplikacji. Dlatego DISTRO ma pakiety instalowane w różnych miejscach, ponieważ każda distro uważa, że jest lepiej zainstalować pewne biblioteki i pliki do określonych katalogów. Mówi się, że działa ./configure, ale w rzeczywistości należy go zawsze zmieniać.

Na przykład spójrz na stronę Arch Linux packages. Tutaj zobaczysz, że każdy pakiet używa innego parametru configure (Załóżmy, że używa autotools dla systemu budowania).

Budowanie systemu

make

To jest rzeczywiście make all domyślnie. A każda marka ma inne działania do wykonania. Niektórzy budują, niektórzy wykonują testy po zbudowaniu, inni dokonują płatności z zewnętrznych repozytoriów SCM. Zazwyczaj nie trzeba podawać żadnych parametrów, ale niektóre pakiety wykonują je inaczej.

Zainstaluj w systemie

make install

Spowoduje instalację pakietu w miejscu określonym w configure. Jeśli chcesz, możesz określić ./configure, aby wskazać katalog domowy. Jednak wiele opcji konfiguracji wskazuje na /usr lub /usr/local. Oznacza to, że musisz użyć actually sudo make install, ponieważ tylko root może kopiować pliki do /usr I/usr / local.


Teraz widzisz, że każdy krok jest wstępnym wymogiem dla następnego kroku. Każdy krok jest przygotowaniem, aby wszystko działało w bezproblemowym przepływie. DISTRO używa tej metafory do budowania pakietów (takich jak RPM, deb, itp.).

Tutaj zobaczysz, że każdy krok jest w rzeczywistości innym stanem. Dlatego Menedżery pakietów mają różne opakowania. Poniżej znajduje się przykład opakowania, które pozwala zbudować cały pakiet w jednym kroku. Ale pamiętaj, że każdy aplikacja ma inny wrapper (w rzeczywistości te wrappery mają nazwę jak spec, PKGBUILD, itp.):

def setup:
... #use ./configure if autotools is used

def build:
... #use make if autotools is used

def install:
... #use make all if autotools is used

Tutaj można użyć autotools, czyli ./configure, make i make install. Ale inny może używać SCons, Python związane konfiguracji lub coś innego.

Jak widzisz dzielenie każdego stanu znacznie ułatwia utrzymanie i wdrażanie, szczególnie dla opiekunów pakietów i dystrybutorów.

 108
Author: Fatih Arslan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-19 23:22:03

Po pierwsze, powinno być ./configure && make && make install ponieważ każdy zależy od sukcesu pierwszego. Po części powodem jest ewolucja, a po części wygoda dla przepływu pracy nad rozwojem.

Początkowo większość Makefile zawierałaby tylko polecenia kompilacji programu, a instalację pozostawiono użytkownikowi. Dodatkowa reguła pozwala make install umieścić skompilowane wyjście w miejscu, które może być poprawne; nadal istnieje wiele dobrych powodów, dla których możesz nie chcieć tego robić, w tym nie być administrator systemu, nie chce go w ogóle instalować. Co więcej, jeśli rozwijam oprogramowanie, prawdopodobnie nie chcę go instalować. Chcę wprowadzić kilka zmian i przetestować wersję znajdującą się w moim katalogu. To staje się jeszcze bardziej istotne, jeśli mam zamiar mieć wiele wersji leżących wokół.

./configure goes i wykrywa, co jest dostępne w środowisku i / lub jest pożądane przez użytkownika, aby określić, jak zbudować oprogramowanie. Nie jest to coś, co musi się bardzo często zmieniać i często może to zająć trochę czasu. Ponownie, jeśli jestem programistą, nie warto poświęcać czasu na ciągłe rekonfigurowanie. Co ważniejsze, ponieważ {[4] } używa znaczników czasu do odbudowy modułów, jeśli ponownie uruchomię configure istnieje możliwość, że flagi się zmienią i teraz niektóre komponenty w mojej kompilacji będą kompilowane z jednym zestawem FLAG, a inne z innym zestawem flag, które mogą prowadzić do innego, niezgodnego zachowania. Dopóki nie uruchamiam ponownie configure, wiem, że moje środowisko kompilacji pozostaje takie samo nawet jeśli zmienię źródła. Jeśli powtórzę configure, powinienem make clean najpierw usunąć wszelkie wbudowane źródła, aby upewnić się, że rzeczy są zbudowane jednolicie.

Jedynym przypadkiem, w którym trzy polecenia są uruchamiane z rzędu, jest zainstalowanie programu przez użytkowników lub zbudowanie pakietu (np. Debian 's debuild lub RedHat' s rpmbuild). I to zakłada, że pakiet może mieć zwykły configure, co zwykle nie ma miejsca w przypadku opakowania, gdzie, co najmniej, --prefix=/usr jest pożądane. A pacakgers są jak mieć do czynienia z fake-roots podczas wykonywania make install części. Ponieważ istnieje wiele wyjątków, tworzenie ./configure && make && make install reguły byłoby niewygodne dla wielu osób, które robią to znacznie częściej!

 27
Author: apmasell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-09 13:47:09

configure może się nie udać, jeśli stwierdzi, że brakuje zależności.

make uruchamia domyślny cel, pierwszy wymieniony w pliku Makefile. Często celem jest all, ale nie zawsze. Więc mógłbyś tylko make all install, gdybyś wiedział, że to był cel.

Więc ...

#!/bin/sh

if ./configure $*; then
  if make; then
    make install
  fi
fi

Lub:

./configure $* && ./make && ./make install

$* jest włączone, ponieważ często trzeba podać opcje do configure.

Ale dlaczego po prostu nie pozwolić ludziom zrobić to sami? Czy to naprawdę taka wielka wygrana?

 3
Author: ghoti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-09 13:37:58

Po pierwsze ./ configure nie zawsze znajduje wszystko, czego potrzebuje, lub w innych przypadkach znajduje wszystko, czego potrzebuje, ale nie wszystko, czego może użyć. W takim przypadku chciałbyś o tym wiedzieć (i twój ./install.sh scenariusz i tak by się nie powiódł!) Klasycznym przykładem braku awarii z niezamierzonymi konsekwencjami, z mojego punktu widzenia, jest kompilacja dużych aplikacji, takich jak ffmpeg czy mplayer. Będą one używać bibliotek, jeśli są one dostępne, ale i tak będą kompilowane, jeśli nie są, pozostawiając niektóre opcje wyłączone. Problem polega na tym, że później odkryjesz, że został skompilowany bez wsparcia dla jakiegoś formatu lub innego, co wymaga powrotu i ponownego wykonania go.

Inna sprawa ./ configure robi nieco interaktywnie daje możliwość dostosowania gdzie w systemie aplikacja zostanie zainstalowana. Różne dystrybucje / środowiska mają różne konwencje i prawdopodobnie chciałbyś trzymać się konwencji w swoim systemie. Możesz również zainstalować to lokalnie (wyłącznie dla siebie). Tradycyjnie ./ configure and make kroki nie są uruchamiane jako root, podczas gdy make install (chyba że jest zainstalowany wyłącznie dla siebie) musi być uruchamiane jako root.

Określone dystrybucje często dostarczają skrypty, które to wykonują ./install.sh funkcjonalność w sposób wrażliwy na dystrybucję - na przykład źródło RPMs + plik spec + rpmbuildlub slackbuilds.

(przypis: to powiedziawszy, zgadzam się z tym ./ configure; make; make install; może być bardzo uciążliwe.)

 3
Author: Soz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-09 13:44:05