Do czego służy „make install”?

52

Przechodząc z systemu Windows na Linux, nie rozumiem procesu instalowania oprogramowania w systemie Linux. W systemie Windows, gdy uruchamiamy plik instalacyjny, pyta, gdzie chcesz zainstalować program, najprawdopodobniej tylko w folderze plików programu. Później edytuje rejestr. Nazywa się to instalacją w systemie Windows. Co dokładnie oznacza „instalowanie oprogramowania” w systemie Linux?

Załóżmy, że pobrałem kod źródłowy, skonfigurowałem go, a następnie zbudowałem plik binarny make. Teraz jest to tylko program binarny, jeszcze nie nadający się do użytku. Jak to się „instaluje”? By make install? A co dokładnie robi to polecenie?

KawaiKx
źródło
1
Moja odpowiedź na stackoverflow.com/questions/528399/… zawiera krótki przegląd typowych czynności wykonywanych make installkrokami z punktu widzenia programisty.
dmckee

Odpowiedzi:

44

Make to program do zarządzania przepływem zadań ogólnego przeznaczenia, zwykle używany do kompilacji. Ale można go używać do wszystkiego.

Kiedy robisz coś takiego jak „make all”, program make wykonuje regułę o nazwie „all” z pliku w bieżącym katalogu o nazwie „Makefile”. Ta reguła zwykle wywołuje kompilator w celu kompilacji kodu źródłowego do plików binarnych.

Po wykonaniu polecenia „make install” program make pobiera pliki binarne z poprzedniego kroku i kopiuje je do odpowiednich lokalizacji, aby można było uzyskać do nich dostęp. W przeciwieństwie do systemu Windows instalacja wymaga jedynie skopiowania niektórych bibliotek i plików wykonywalnych i nie ma wymogu rejestru jako takiego. W skrócie, „make install” po prostu kopiuje skompilowane pliki do odpowiednich lokalizacji.

Sharjeel
źródło
4
Z technicznego punktu widzenia rejestr nie jest wymagany - to, co dodają wszyscy instalatorzy, jest jedynie funkcją zapewniającą wygodę, podobnie jak baza danych menedżera pakietów w Linuksie, dla osób lubiących odinstalowywać oprogramowanie.
grawity
2
@grawity W rzeczywistości w systemie Windows jest wymagana edycja rejestru z wielu powodów, takich jak integracja. W Linuksie integracja oprogramowania zwykle polega na kopiowaniu plików lub dodawaniu wierszy do plików konfiguracyjnych za pomocą skryptu poinstalacyjnego.
Camilo Martin,
@sharjeel Przydałoby się powiedzieć, jak mogę znaleźć regułę nazwaną allw Makefileznaczniku i jak wygląda znacznik końcowy tej sekcji, aby zobaczyć, gdzie przetwarzanie reguły dla allzatrzymań.
Pro Backup
36

make installrobi wszystko, co Makefilechce autor. Zazwyczaj w tym momencie jest już za późno na zmianę katalogu instalacyjnego, jak to często wiadomo wcześniej podczas kompilacji, więc do plików pomocy i plików konfiguracyjnych można odwoływać się za pomocą poprawnych nazw ścieżek.

Wiele projektów korzysta z GNU Autotools w celu poprawy ich przenośności między różnicami sprzętowymi i systemowymi. (Różne warianty Uniksa używają nieco innych nagłówków do deklaracji funkcji, które są nieco poza zwykłą ścieżką - z wyjątkiem większości programów, które wymagają jednego lub drugiego z tych zadeklarowanych w różnych lokalizacjach.)

Kiedy projekt korzysta z Autotools, normalną mantrą do instalacji jest:

./configure
make
make install

./configureZazwyczaj pozwala na użycie opcji wiersza polecenia podobnego --prefix /opt/apachelub coś podobnego, aby określić inną ścieżkę. /usr/local/jest częstym domyślnym prefix. Lokalnie zbudowane oprogramowanie jest o wiele łatwiejsze do zamieszkania w jednym miejscu, a oprogramowanie dostarczane przez dystrybucję do życia w „głównych katalogach”: /usr/ /bin/i tak dalej. (Pakowacze są bardzo ostrożni, aby nigdy nie dotykać plików /usr/local/- wiedzą, że jest to wyłącznie dla administratorów systemu).

W każdym razie, ./configure --prefix /path/to/new/prefixustawi zmienną, Makefilektóra jest dostępna podczas kompilacji programu, modyfikując strony podręcznika, aby wskazywały prawidłowe lokalizacje plików, modyfikując pliki konfiguracyjne itp. Więc makezbuduje oprogramowanie specjalnie dla żądanej lokalizacji instalacji i make installzainstaluje go w tej lokalizacji.

Większość programów może działać nawet bez ostatniego make installkroku - po prostu ./program_nameczęsto je uruchamiają. Jest to z pewnością rzecz per-projektu - niektóre, jak postfix, qmailitp, składają się z wielu ruchomych elementów i opierają się na nich wszystkich razem pracować. Inne, takie jak lslub sumogą być wystarczająco samodzielne, aby dobrze wykonać z katalogu, w którym zostały wbudowane. (To nie jest często przydatne - ale czasami bardzo przydatne).

Jednak nie wszystkie projekty używają Autotools - są ogromne , skomplikowane i nieszczęśliwe w utrzymaniu. Odręczne pisanie Makefilejest znacznie prostsze do napisania, a ja osobiście uważam, że dystrybucja prostej Makefilez dostępnymi zmiennymi konfiguracyjnymi jest o wiele łatwiejsza zarówno dla programistów, jak i użytkowników. (Chociaż ./configure ; make ; make installmantra jest naprawdę łatwa dla użytkowników, gdy działa).

Sarnold
źródło
19

make installrobi nic innego niż wykonanie installfunkcji / sekcji w twoimMakefile

sascha
źródło
Tak, po prostu to lubi make clean, po prostu wykonuje kody w sekcji.
Wulfric Lee
8

Najważniejszą rzeczą, o której należy wspomnieć podczas instalowania oprogramowania w systemie Linux, jest to, że jest on o wiele bardziej niezawodny i łatwiejszy do zainstalowania oprogramowania z Twojej dystrybucji (jest to jego cel!). Używaj tylko make installwtedy, gdy nie ma innej możliwości (rozważ również programy alternatywne).

Częstym błędem użytkowników systemu Windows jest pobieranie programów z różnych miejsc i próba ich zainstalowania, zapominając o sprawdzeniu ich pakietów dystrybucyjnych, które można zainstalować za pomocą jednego kliknięcia lub polecenia (w menedżerze pakietów).

Pamiętaj również, że jednym z głównych powodów braku infekcji wirusowych w systemie Linux jest to, że oprogramowanie jest (lub powinno być) instalowane z centralnej (zaufanej) lokalizacji zamiast z wielu losowych stron.

Jako dodatkową uwagę, chociaż dystrybucje takie jak Ubuntu zawsze zawierają nieaktualne pakiety, istnieją również takie dystrybucje jak Arch Linux, które są zawsze aktualne (chociaż nie oferują dosłownie każdego programu kiedykolwiek wydanego dla Linuksa, takiego jak Debian / Ubuntu).

Jeśli chodzi o to, co dokładnie się stanie, gdy użyjesz menedżera pakietów, sprawdziłby on zależności, pobierał pakiety, rozpakowywał, umieszczał wszystkie pliki w odpowiednich katalogach, zgodnie z wytycznymi FHS i własnymi dystrybucjami oraz innymi procedurami, o których prawdopodobnie możesz się dowiedzieć ze strony man menedżera pakietów.

Korwin
źródło