2012-02-20 11 views
5

Kernel MakefileMakefile: *** mieszane niejawne i normalne zasady

# Modules                                            
/%/: prepare scripts FORCE 
    $(cmd_crmodverdir) 
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ 
    $(build)=$(build-dir) 
%.ko: prepare scripts FORCE 
    $(cmd_crmodverdir) 
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ 
    $(build)=$(build-dir) $(@:.ko=.o) 
    $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost 

wystąpienie błędu Makefile mieszane zasady niejawne i normalne. (do pierwszego ciągu pod podanym kodem)

Myślę, że coś nie tak z składnią /%/, jak mogę to naprawić?

tej pory myślę o oddzielenie Wyklucza to sposób:

# Modules                                            
/: prepare scripts FORCE 
    $(cmd_crmodverdir) 
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ 
    $(build)=$(build-dir) 
%/: prepare scripts FORCE 
    $(cmd_crmodverdir) 
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ 
    $(build)=$(build-dir) 
%.ko: prepare scripts FORCE 
    $(cmd_crmodverdir) 
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ 
    $(build)=$(build-dir) $(@:.ko=.o) 
    $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost 

Ale to mylące dla mnie.

Odpowiedz

4

Co sądzisz, co robi reguła / %/ (oprócz pomieszania Ciebie i make - i mnie)? Co próbujesz osiągnąć bitem %/?

Możesz mieć dwa (lub więcej) cele po lewej stronie okrężnicy, ale oba muszą być bez procenta.

prog1 prog2: something 
    $(CC) -o [email protected] [email protected] ${LIBRARIES} 

% Metaznak nie mogą być używane z reguły bez % w tym, ale make interpretuje:

/ %/: 

za podobny do przykładu prog1 prog2, ale jednym z celów ma % i drugi nie, i nie wolno ci tego mieszać. Reguła / jest jawną zasadą; wydaje się być instrukcjami, jak zaktualizować katalog główny systemu. %/ jest niejawną zasadą; może to być związane z aktualizowaniem katalogów.


Kopiowanie jakiś materiał się z uwagami:

DIRECTORY_BUILD_RULES = \ 
    $(cmd_crmodverdir); \ 
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) $(build)=$(build-dir) 

/: prepare scripts FORCE; $(DIRECTORY_BUILD_RULES) 

%/: prepare scripts FORCE; $(DIRECTORY_BUILD_RULES) 

Ten zapis powinien działać (dlatego użyłem go w komentarzu), ale co będę pisać w makefile jest:

DIRECTORY_DEPENDENCIES = prepare scripts FORCE 
DIRECTORY_BUILD_RULES = \ 
    $(cmd_crmodverdir); \ 
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) $(build)=$(build-dir) 

/: $(DIRECTORY_DEPENDENCIES) 
    $(DIRECTORY_BUILD_RULES) 

%/: $(DIRECTORY_DEPENDENCIES) 
    $(DIRECTORY_BUILD_RULES) 

Jeśli to nadal powoduje problemy, sprawdź, co robi pierwsza (reguła /:). Jesteś pewien, że jest to potrzebne?

+0

Dobra, ale czy moje rozwiązanie jest poprawne? O ile rozumiem, muszę to oddzielić w ten sposób, ale wykonanie tej samej 2-krotnie wygląda dla mnie dziwnie. – Cynede

+2

Tak; oddzielenie będzie konieczne. Tak, dwukrotne wypisanie tych samych zasad nie jest wspaniałe. Może utwórz makro dla akcji, a następnie użyj tego w regułach. 'DIRECTORY_BUILD_RULES = $ (cmd_crmodverdir); $ (Q) $ (MAKE) KBUILD_MODULES = $ (jeśli $ (CONFIG_MODULES), 1) $ (kompilacja) = $ (katalog-build) ', następnie:' /: przygotuj skrypty FORCE; $ (DIRECTORY_BUILD_RULES) 'i'% s: przygotowuje skrypty FORCE; $ (DIRECTORY_BUILD_RULES) '. Możesz nawet uczynić listę zależności innym makrem ... –

+0

teraz mówi: zmienna rekursywna 'DIRECTORY_BUILD_RULES 'odwołuje się (ostatecznie). Zatrzymać. – Cynede