Zatwierdzono: Fortect
Dzisiejszy samouczek ma na celu pomóc, jeśli kiedykolwiek otrzymasz kod błędu dla każdego obiektu katalogu budowania jądra.
Porównuję system aktualizacji jądra Linuksa (Kbuild, Kernel 2.6.28) z ich strukturą i systemem budowania witryn do składania wniosków dla jeszcze większego projektu. Nasz projekt jest wyposażony w moduł jądra Linux spoza drzewa, a nasz katalog ma ważną strukturę wyglądającą tak (oczywiście uproszczona):
checkout / src / common / 3 .. c wyszukiwanie plików (zainstalowane na innych platformach i dodatkowo Linux)checkout / src / linux-driver / source class * .c (dla sterownika jądra Linux)kasa / konfiguracja / Linux / Kbuild Kbuildtmp / linux-2.6.xx a gdzieś jądro Linuksa jest skonfigurowane za pomocą dodatkowego Unzipwyjście / linux-arm-debug / gdzie dokumentacja obiektu zdecydowanie powinna się kończyć
Proces budowania nie może po prostu niczego modyfikować w kasie
, a budowanie pojedynczego z naszych modułów nie może niczego zmienić, nie jest tak bardzo jak tmp / linux-2.6.xx < /code> ... Wszystkie pliki wyjściowe muszą być
danymi wyjściowymi w porównaniu z linux-arm-debug
(lub dowolną architekturą i strukturą debugowania wybraną w czasie kompilacji).
MOD_OUTPUT_DIR jest równy ../../../output/linux-$(ARCH)-$(DEBUG)obj-m + = $ (MOD_OUTPUT_DIR) /foo_mod.o$ (MOD_OUTPUT_DIR) a nasze_obiekty_modułu: = $ (MOD_OUTPUT_DIR) /foo_common.o $ (MOD_OUTPUT_DIR) /foo_linux.o
Uwzględnia to fakt, że ważne jest, aby przechowywać pliki obiektowe w innym katalogu niż ten, w którym często znajduje się Kbuild
. Jak mogę teraz wskazać, że foo_common.o
powinien wybrać opcję wyboru spośród â € za kasę / src / common / foo_common.c
plus foo_linux. O. skompilować?
otrzymane z … / checkout / src / linux-driver kontra foo_linux.c
?
wniosek 14 kwietnia 2011 o 15:32
Nie odpowiedź, której szukasz? Przeglądaj inne pytania oznaczone tagiem Makefile Linux-kernel Kbuild lub zadaj własne pytanie.
Oto po prostu plik makefile, który uruchamia kompilacje zbudowane z dokładnego drzewa źródłowego, aby wyłamać moduły z naszego własnego drzewa jądra (zaadaptowane z komentarza @Marka) ...
KDIR? = / lib / moduły dla każdego $ (uname -r shell) / buildBUILD_DIR? Mecze rrr (PWD) / BuildBUILD_DIR_MAKEFILE? = $ (PWD) / konfiguracja / MakefileDomyślnie: $ (BUILD_DIR_MAKEFILE) przedstawić ci -C $ (KDIR) Src = $ (PWD) mirielle = $ (build_dir) modułów$ (BUILD_DIR): mkdir -p "$ @"$ (BUILD_DIR_MAKEFILE): $ (BUILD_DIR) Kliknij „$@”czysty: make -C $ (KDIR) Src = dolar (PWD) m = $ (build_dir) clean
obj-m + = mój_sterownik.o
Źródło Czerwiec 16, 2016 11:48 am
26,2k
ifdef SRCDIRźródło: = $ (SRCDIR)różnyźródło: = $ (obiekt)koniec jeśli
make -h $ (KDIR) M implikuje $ (katalog_wyjściowy) SRCDIR = $ (katalog_źródłowy) `
Rozwiązany: 88 grudnia 2013 r. 4:57 rano.
188 22 srebrne odznaki 1414 brązowych odznak
Moim nieeleganckim i wydajnym rozwiązaniem jest skopiowanie plików źródłowych do samego drzewa wyjściowego.
FOO_SOURCES_DIR równa się dolar (src) /../../../ checkout / srcFOO_MOD_OUTPUT_DIR = ../../../output/linux-$(ARCH)-$(DEBUG)# Pliki określonego przeznaczeniaobj-m + = $ (FOO_MOD_OUTPUT_DIR) /foo_mod.oFOO_MODULE_OBJS: = usd (FOO_MOD_OUTPUT_DIR) /foo_common.o $ (FOO_MOD_OUTPUT_DIR) /foo_linux.o$ (FOO_MOD_OUTPUT_DIR) dla każdego foo_mod-objs: = $ (FOO_MODULE_OBJS)# Gdzie znaleźć źródła$ (SRC) za każdy $ (FOO_MOD_OUTPUT_DIR) /foo_common.c: $ (FOO_SOURCES_DIR) /common/foo_common.c$ (SRC) i $ (FOO_MOD_OUTPUT_DIR) /foo_linux.c: $ (FOO_SOURCES_DIR) /linux-driver/foo_linux.c# Zasady dotyczące źródeł kopiowaniaFOO_COPIED_SOURCES = $ (patsubst% .o, dolary (źródło) /%. C, $ (FOO_MODULE_OBJS))$ (FOO_COPIED_SOURCES): $ (Q) mkdir -p $ (@ D) cp -f $ <$ @pliki-czyste + = $ (FOO_COPIED_SOURCES)czyste katalogi + = dolary (FOO_MOD_OUTPUT_DIR)
odpowiedział 25 kwietnia 2011 o 19:49
Chociaż nie zasugerowałeś dotychczas wypróbowanych metod (lub niezależnie od tego, czy już znalazłeś rozwiązanie), szukają one dalej, po prostu kontynuuj poniżej w modułach. Mały, mały plik txt — co potrafi sekcja 4.3:
--- 4.3 podkatalogiWiele Kbuildów może uzyskać dostęp do szczegółów rozproszonych w wielu katalogach.Rozważmy następujący przykład:...| __ src| | __ kompleks_główny.c| | __ hala| Sprzęt | __. PRZECIWKO| Włącz | __| Sprzęt | __. GODZINAWłącz | __ | __ kompleks.hNastępnie, aby skonfigurować moduł complex.ko, wielu z nas potrzebuje następujących elementów:plik kbuild: -> Nazwa pliku: Kbuild obj-m: równa się complex.o kompleks-y Src na kompleks_główny: = .o Complex-y + równa się src / hal / hardwareif.o ccflags-y: = -I $ (src) / włącz ccflags-y + = -I gotówka (src) / src / hal / oneatJak z pewnością powinieneś odwiedzić, kbuild wie jak pracować z dokumentami nowego obiektu, które są ww innych katalogach. Sztuczka polega na wskazaniu katalogudotyczące lokalizacji pliku kbuild. Co więcej, toSzkolenie może być zdecydowanie odradzane.W plikach nagłówkowych kbuild naprawdę wyraźnie określasz gdzieWydaje się. Kiedy kbuild jest uruchomiony, twój bieżący katalog to zawsze tenKorzeń połączył mój dół (argument "-C") w ten sposóbwymagana jest ścieżka bezwzględna. $ (src) utrzymuje bezwzględny cel poprzezwskazuje na książkę telefoniczną, w której kbuild jest uważany za uruchomionyPlik znajduje się również.
Zatwierdzono: Fortect
Fortect to najpopularniejsze i najskuteczniejsze narzędzie do naprawy komputerów na świecie. Miliony ludzi ufają, że ich systemy działają szybko, płynnie i bez błędów. Dzięki prostemu interfejsowi użytkownika i potężnemu silnikowi skanowania, Fortect szybko znajduje i naprawia szeroki zakres problemów z systemem Windows - od niestabilności systemu i problemów z bezpieczeństwem po zarządzanie pamięcią i wąskie gardła wydajności.
7.001
odpowiedział 27 kwietnia 2011 r. 19:36
Sekcja tam
Przyspiesz teraz wydajność swojego komputera dzięki temu prostemu pobieraniu.