Linux Makefile wyjaśnił

Linux Makefile wyjaśnił
W tworzeniu oprogramowania proces tworzenia i zarządzania dużymi repozytoriami kodu może stać się bardzo złożony.

Aby zarządzać i zmniejszyć tę złożoność, programiści organizują kod w małych plikach, które łączą się z określonymi modułami. Deweloperzy mogą skompilować każdy z tych plików osobno, a następnie łączyć je ze sobą, aby utworzyć ostateczne oprogramowanie wykonywalne.

Przykładem tego są projekty C złożone z plików kodu źródłowego w .C rozszerzenia i interfejsy oprogramowania w .H rozszerzenia. Każdy plik źródłowy jest kompilowany z plikami nagłówka, aby utworzyć. o Obiekty połączone za pomocą bibliotek, tworząc w ten sposób pliki wykonywalne.

Aby wykonać ten proces, programiści oprogramowania używają narzędzi, takich jak Make, do automatyzacji procesu kompilacji i wymaganych zależności plików. Tworzyć używające pliki do zarządzania zachowaniem procesu kompilacji.

GNU Make Tools zapewnia zestaw reguł i konwencji używanych do tworzenia paliw i zmniejszenia złożoności w poprawie wydajności.

W tym samouczku omówimy w szczególności makefiles z jądra Linux Kconfig I Kbuild.

Zanim zaczniemy, warto zauważyć, że ten artykuł nie udaje wszystkiego o systemie kompilacji jądra. Zapewniamy jednak przegląd na wysokim poziomie budowania obrazu i modułów VMlinux.

Jeśli chcesz uzyskać informacje poza zakresem tego samouczka, zalecamy następujące zasoby, aby uzyskać lepsze informacje:

https: // linkfy.do/gomakefilesDocs

https: // linkfy.do/gnumake

Kernel Makefiles: przegląd

System kompilacji jądra, zwany również systemem konfiguracji, jest niezbędnym narzędziem dla tych, którzy tego potrzebują-istnieje od jakiegoś czasu. Jednak nie wszyscy będą korzystać z tego systemu; Nawet sterowniki i inni twórcy oprogramowania niskiego poziomu rzadko go używają. Ponieważ to czytasz, oznacza to, że chcesz dowiedzieć się więcej o systemie kompilacji jądra.

W ten sposób omówimy, w jaki sposób jądro zostanie skompilowane i omówimy system KBuild i KcConfig, abyś mógł je lepiej zrozumieć.

Makefile jądra ma pięć podstawowych elementów:

  1. Makefile: To jest górny plik Make znajdujący się w źródle.
  2. Arch/$ (Arch) Makefile: To jest Makefile Arch; Działa jak uzupełnienie najlepszego makefile.
  3. .Konfiguracja: To jest plik konfiguracji jądra.
  4. Skrypty/makefile.*: To definiuje ustalone reguły dla wszystkich kbuild Makefiles.
  5. KBUILD Makefiles: Istnieje około 500 kbuild Makefile i nie są one łatwe do odczytania. Rozważ plik, taki jak:

https: // elixir.bootlin.com/linux/najnowsze/źródło/scenariusze/kbuild.włączać

Kconfig

Plik KCONFIG zawiera moduły, które pomagają podczas korzystania z konfiguracji Make *. Pomaga jądrze dokonywać selektywnych konfiguracji, tworząc modułowość i możliwość dostosowywania procesu kompilacji jądra.

Istnieją różne cele konfiguracyjne określone przez system KCONFIG. Możesz użyć pomocy, aby wyświetlić dostępne cele. Te cele są przetwarzane przez różne programy dostarczane przez jądro podczas procesu kompilacji.

Niektóre cele KCONFIG obejmują:

  • Konfiguracja: Służy do aktualizacji pliku konfiguracji jądra za pomocą programu liniowego.
  • Menuconfig: To jest funkcja lub mechanizm KCONFIG, który oferuje menu dostęp do opcji jądra. Aby uruchomić Menuconfig i inne funkcje KCONFIG, powinieneś znajdować się w katalogu projektu platformy. Możesz użyć następujących, aby uruchomić funkcję KCONFIG Menuconfig. Można jednak uruchomić Menuconfig z innymi funkcjami konfiguracji jądra GUI Linux, takimi jak Xconfig i Gconfig.
  • Uczyń Linux-Windriver.Menuconfig - wykonuje menuconfig w oddzielnej sesji terminalowej.
  • GCONFIG i XCONFIG: GCONFIG aktywuje funkcje jądra Linux na bazie GUI. GCONFIG wykorzystuje interfejs oparty na GTK lub (oparty na x). Z drugiej strony Xconfig wykorzystuje interfejs oparty na QT. Użyj następujących poleceń, aby uruchomić odpowiednio GCONFIG i XCONFIG:
Uczyń Linux-Windriver.Gconfig
Uczyń Linux-Windriver.xconfig

NOTATKA: Aby korzystać z GCONFIG i XCONFIG, powinieneś mieć instalowane narzędzia programistyczne QT w systemie hosta.

  • Nconfig: Funkcja NCONFIG uruchamia bieżącą konfigurację (BuildTools) i ma zastosowanie do programu opartego na menu NCurses. Pozwala to na zbudowanie pakietów, takich jak procesor, sterowniki i system plików podczas budowy jądra. Użyj polecenia: Make NConfig.
  • OLDCONFIG: Funkcja OldConfig pozwala zastosować nowsze .Pliki konfigurowe do starszych plików konfiguracji jądra. Na przykład stary .Plik konfiguracyjny i nowszy .Plik konfiguracyjny (nowsza wersja jądra) będzie miał różnice, co oznacza, że ​​musisz zaktualizować bieżącą konfigurację przed kompilacji jądra. Możesz użyć Make OldConfig do interaktywnego aktualizacji starej konfiguracji, stosując opcje brakujące w starym pliku konfiguracji.
  • Defconfig: Ta funkcja umożliwia systemowi kompilacji jądra dodanie nowej konfiguracji dostarczonej przez defconfig do .plik konfiguracyjny. Mówiąc dokładniej, system KBuild sprawdza wszystkie pliki KCONFIG. Jeśli defconfig określa opcję w pliku, system KBuild używa określonej wartości, aby dodać opcję do .konfigurator. Jeśli defconfig nie wspomina o tej opcji, KBuild używa wartości domyślnych w .konfigurator.

Rozważ następujące:

Migawka kodu defconfig z następującego zasobu:

https: // elixir.bootlin.com/linux/v5.9/Source/Scripts/kconfig/Makefile#L98

1. defconfig: $ (obj)/conf
2. ifneq ($ (WildCard $ (srctree)/arch/$ (srcarch)/configs/$ (kBuild_Defconfig)),)
3. @$ (kecho) "*** Domyślna konfiguracja jest oparta na„ $ (kBuild_DefConfig) '"
4. $ (Q) $< $(silent) --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig)
5. w przeciwnym razie
6. @$ (kecho) "*** Domyślna konfiguracja jest oparta na celu„ $ (kBuild_Defconfig) '"
7. $ (Q) $ (make) -f $ (srctree)/Makefile $ (kBuild_Defconfig)
8. Endif
9.
10. %_defconfig: $ (obj)/conf
11. $ (Q) $< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
12.
13. configFiles = $ (WildCard $ (srctree)/jądro/configs/$@ $ (srctree)/arch/$ (srcarch)/configs/$@)
14.
15. %.config: $ (obj)/conf
16. $ (if $ (call configfiles) ,, $ (błąd nie istnieje konfiguracja dla tego celu w tej architekturze))))
17. $ (Q) $ (config_shell) $ (srctree)/scripts/kconfig/merge_config.sh -m .config $ (configFiles)
18. $ (Q) $ (make) -f $ (srctree)/Makefile Olddefconfig

Migawka kodu oldconfig z następującego zasobu:

https: // elixir.bootlin.com/linux/v5.9/Source/Scripts/Kconfig/Conf.C#L694

1. Case Olddefconfig:
2. domyślny:
3. przerwa;
4.
5.
6. if (input_mode == savedefconfig)
7. if (conf_write_defconfig (defconfig_file))
8. fprintf (stderr, „n *** błąd podczas zapisywania defconfig do: %s \ n \ n”,
9. defconfig_file);
10. zwrot 1;
11.
12. else if (input_mode != ListNeWConfig && input_mode != helpNewconfig)
13. Jeśli (!no_conf_write && conf_write (null))
14. fprintf (stderr, „\ n *** Błąd podczas pisania konfiguracji.\ n \ n ”);
15. wyjście (1);
16.
17.
18. /*
19. * Utwórz automatyczne.Conf, jeśli nie istnieje.
20. * To uniemożliwia GNU wykonanie 4.1 lub starsze od emitowania
21. * „Uwzględnij/config/auto.Conf: brak takiego pliku lub katalogu ”
22. * W najwyższym poziomie Makefile
23. *
24. * Syncconfig zawsze tworzy lub aktualizuje automatyczne.konfort, ponieważ tak jest
25. * Używany podczas kompilacji.
26. */
27. if (conf_write_autoconf (sync_kconfig) && sync_kconfig)
28. fprintf (Stderr,
29. „\ n *** Błąd podczas synchronizacji konfiguracji.\ n \ n ”);
30. zwrot 1;
31.
32.
33. powrót 0;
34.
  • Savedefconfig: Ta reguła zapisuje bieżącą .konfigurować w formie ./defconfig, który jest uważany za minimalny plik konfiguracji. Użyj polecenia: Zrób savedefconfig
  • ListNeWconfig: Służy to do wymienienia nowych opcji.
  • Kvmconfig: Umożliwia to opcje obsługi KVM. Użyj polecenia: Make Kvm_Guest.konfigurator
  • Allyesconfig: To buduje nowy plik konfiguracji jądra ze wszystkimi opcjami ustawionymi na tak. To przeciwieństwo Allnoconfig.
  • AllModConfig: To buduje nową konfigurację jądra, z którą moduły są domyślnie włączone.
  • Randconfig: To buduje nowy plik konfiguracji jądra z losowymi odpowiedziami na wszystkie opcje.
  • TinyConfig: To umożliwia najmniejsze jądro.

Istnieje wiele celów w systemie KCONFIG. Niektóre typowe obejmują Config i Menuconfig.

Jak wspomniano, cele są przetwarzane przez różne programy w systemach hosta, zapewniając GUI lub wiersz poleceń. Narzędzia KCONFIG można znaleźć w /skrypty /kconfig w źródle jądra.

https: // elixir.bootlin.com/linux/najnowsze/źródło/scenariusze/kconfig

https: // elixir.bootlin.com/linux/najnowsze/źródło/scenariusze/kconfig/makefile

Pierwszym procesem jest zazwyczaj odczytanie pliku KCONFIG w katalogu głównym, który służy do tworzenia początkowej bazy danych konfiguracji. W trakcie procesu baza danych jest aktualizowana podczas czytania plików w następującej kolejności:

.konfigurator
/lib/modules/$ (shell, uname-r)/.konfigurator
/etc/jądro-config
/boot/config-$ (powłoka, uname-r)
Arch_defconfig
arch/$ (arch)/defconfig

.Plik konfiguracyjny jest następnie upuszczany do Syncconfig, który akceptuje .Plik konfiguracyjny jako wejście. Przetwarza pliki i pobiera pliki, które są następnie podzielone na różne kategorie, takie jak:

  • Autoconf.H: Jest to używane do plików źródłowych języka C.
  • automatyczny.conf i tristate.Conf: Są one używane do przetwarzania tekstu Makefile.
  • /Obejmuje/config: Są to puste pliki nagłówka używane w śledzeniu zależności.

Pliki kBuild

Prawie wszystkie pliki jądra to kbuild Makefile, które korzystają z infrastruktury KBuild, która jest funkcją rekurencyjną. Recursive Make to sposób na użycie narzędzia Make jako polecenia w makefile. Rekurencja jest bardzo przydatna podczas kompilacji dużego projektu.

KBuild działa, odnosząc się do wszystkich plików, o których wspomnialiśmy w powyższej sekcji.

System KBuild buduje swoje komponenty za pomocą najlepszego Makefile, który zawiera arch Makefiles z nazwą Arch/$ (arch)/Makefile w plikach konfiguracyjnych. Rekurencyjnie schodzi do podkładów wywołujących tworzenie komponentów za pomocą procedur w skryptach/makefile.*. KBuild następnie buduje sąsiedni obiekt i łączy je z obiektami, tworząc vmlinux.

Aby dowiedzieć się więcej o składni używanej w kbuild Makefiles, zapoznaj się z dokumentacją.

Rozważ następujący skrypt.

https: // github.com/torvalds/linux/blob/master/scripts/link-vmlinux.cii

Pliki obiektów O używane do utworzenia vmlinux są najpierw skompilowane w odpowiednich wbudowanych .Pliki jako var kbuild_vmlinux_init, main, libs. Są one składane w Vmlinux.

https: // github.com/torvalds/linux/blob/master/scripts/Makefile.zbudować

Wniosek

W tym przewodniku przyjrzeliśmy się systemom KBUILD i KCONFIG w systemie kompilacji jądra i jak to działa. Jak wspomnieliśmy na początku samouczka, omawiane tematy są szerokie i nie mogą być omówione w jednym samouczku.