Voglio rendere un target dipendente dalla lingua. In particolare: ho un file sorgente e voglio creare oggetti diversi da aggiungere alla cartella della lingua corrispondente. Quel singolo file sorgente sarà diverso nei C-Flags, il compilatore otterrà. Finché l'ho usato in modo statico, funziona abbastanza bene.Makefile GNU - La regola di pattern con più destinazioni con una dipendenza ignora tutti i target ma il primo
de/info.o en/info.o es/info.o : info.c
$(ECHO) (DEP) $< for [email protected]
Ora ho pensato, sarebbe bello se si è un po 'più dinamico, nel caso in cui io aggiungo un file di lingua seconda nuova. Così ho usato un jolly come segue:
de/%.o en/%.o es/%.o : %.c
$(ECHO) (DEP) $< for [email protected]
Ma ora è solo fare il primo obiettivo e ignora il resto. Il Make-debug stampa il seguente cosa:
Successfully remade target file `de/info.o'.
Considering target file `en/info.o'.
File `en/info.o' was considered already.
Solo nel caso: No, non esistono gli oggetti. Quindi non esiste un obiettivo, ma una dipendenza esistente, quindi make dovrebbe eseguire le regole.
MODIFICA: ha trovato una soluzione per questo problema.
define FOO
$(1)/%.o : %.c
$(ECHO) $$< for $(1)
endef
$(foreach lang,$(LANGUAGE_LIST), $(eval $(call FOO,$(lang))))
Ispirato da: http://www.gnu.org/software/make/manual/make.html#Eval-Function
Ah ok, sì, ho letto questo ... ma ho pensato che ci sarebbe stata una soluzione affidabile per questo problema. Perché così devi aggiungere un bersaglio ogni volta che aggiungi una lingua. – Mario
Bene, se i tuoi comandi sono multi-linea, prendi in considerazione la definizione di una macro multilinea chiamata 'commands' e usandola con' @ $ (call commands) '. Quindi ogni nuova lingua richiede solo l'aggiunta di due righe. La macro – Jens
era un buon suggerimento! una combinazione di '$ (foreach,,)', '$ (eval)' e '$ (call)' ha risolto il problema! Modifico il mio primo post. – Mario