2012-02-20 9 views
5

in kernel MakefileMakefile errore regola: *** misti regole implicite e normali

# 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 

causando errore regole implicite e normali misti Makefile. (alla prima stringa su codice fornito)

Penso che qualcosa di sbagliato con /%/ sintassi, come posso ripararlo?

finora sto pensando di separare le regole in questo modo:

# 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 

ma è fonte di confusione per me.

risposta

4

Cosa pensi che stia facendo la regola / %/ (a parte confondere te e make - e me)? Cosa stai cercando di ottenere con lo %/ bit?

È possibile avere due (o più) bersagli a sinistra dei due punti, ma entrambi devono essere percento in meno.

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

Il % metacarattere non può essere utilizzata con una regola senza % in esso, ma make sta interpretando:

/ %/: 

come simile all'esempio prog1 prog2, ma uno degli obiettivi ha un % e l'altro no, e non ti è permesso mescolarli. La regola / è la regola esplicita; sembra essere istruzioni su come aggiornare la directory root del tuo sistema. %/ è la regola implicita; potrebbe fare qualcosa relativo alla creazione di directory aggiornate.


copia Alcuni materiali fino dai commenti:

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) 

Questa notazione dovrebbe funzionare (che è il motivo per cui l'ho usato nel commento), ma quello che mi piacerebbe scrivere in un makefile è:

Se ciò continua a causare problemi, rivedere ciò che fa la prima regola (la /:). Sei sicuro che sia necessario?

+0

Buono ma la mia soluzione è corretta? Per quanto ho capito, ho bisogno di separarlo in questo modo, ma eseguire lo stesso make 2 volte è strano per me. – Cynede

+2

Sì; la separazione sarà necessaria. Sì, scrivere due volte le stesse regole non è grandioso. Magari creare una macro per le azioni e usarla nelle regole. 'DIRECTORY_BUILD_RULES = $ (cmd_crmodverdir); $ (Q) $ (MAKE) KBUILD_MODULES = $ (se $ (CONFIG_MODULES), 1) $ (build) = $ (build-dir) ', quindi:' /: prepara gli script FORCE; $ (DIRECTORY_BUILD_RULES) 'e'% s: preparare gli script FORCE; $ (DIRECTORY_BUILD_RULES) '. È anche possibile creare l'elenco delle dipendenze in un'altra macro ... –

+0

ora indica: La variabile ricorsiva 'DIRECTORY_BUILD_RULES 'si riferisce a se stessa (eventualmente). Stop. – Cynede