2009-06-01 12 views
6

Sto provando a incollare due sistemi di generazione. Entrambi sono ricorsivi (le regole nel makefile usano make per chiamare altri makefile per costruire componenti del progetto).Come posso ignorare l'assegnazione della variabile della riga di comando in una build ricorsiva?

Li chiamerò "A" e "B" dove "A" crea l'applicazione e "B" crea librerie utilizzate da "A".

Il makefile di livello superiore in A chiama 'make TARGET = qualunque' che significa che tutti i bit della build creati in modo ricorsivo ereditano il valore di TARGET come variabile di sola lettura, incluso il sistema di compilazione da B, che è chiamato come parte della build ricorsiva.

Non voglio che ciò accada nel sistema di compilazione per "B" (che proviene da un progetto diverso) poiché i file di make lì utilizzano TARGET per i propri scopi e la compilazione fallisce poiché TARGET ha il valore sbagliato ed è sola lettura.

Posso solo vedere due soluzioni a questo, nessuno dei quali è palatable;

1) Rinominare TARGET in qualcos'altro nel makefile in A che lo imposta e nei makefile in A che lo utilizzano, per evitare lo scontro con i livelli inferiori del sistema di generazione.

2) Utilizzare la direttiva 'override' ovunque nei makefile in B in cui è impostata la variabile TARGET per sovrascrivere lo stato di sola lettura.

Qualcuno ha qualche idea migliore? - idealmente, voglio nulla per essere ereditata dal sistema di compilazione della B da A di, ad eccezione di quelle opzioni passo esplicitamente al sistema B costruire da A.

Per inciso, sto usando GNU Make v3.80.

+0

Se non vuoi impostare TARGET nel makefile di B, perché stai passando TARGET = qualunque cosa nel makefile di A? – JesperE

+0

Il makefile di livello superiore passa TARGET = qualunque cosa a un makefile di secondo livello in A (che ne ha bisogno) e il makefile di secondo livello in A quindi chiama il makefile di B, che eredita TARGET come variabile di sola lettura dall'ambiente del marca di secondo livello. –

risposta

0

Forse è possibile utilizzare la direttiva "unexport" per impedire che TARGET venga propagato al makefile di B?

+0

Sfortunatamente, la direttiva unexport impedisce solo le variabili esportate dall'esportazione da esportare, ma non ha alcun effetto sulle variabili passate sulla riga di comando al processo di produzione corrente o ereditate dalla riga di comando di una marca madre. Sembra che l'impostazione di un valore tramite la riga di comando make la induca in modo indistruttibile a tutte le marche figlio. –

+0

Quindi sono fuori di idee. – JesperE

3

È possibile impostare MAKEOVERRIDES a nulla nel makefile di secondo livello in A.

callb: 
     cd subdir && $(MAKE) MAKEOVERRIDES= 

Questo passa lungo i normali parametri di riga di comando come -k e -s ma non a riga di comando definizioni delle variabili .

O si utilizza la storica MFLAGS, che è lo stesso di MAKEFLAGS tranne MFLAGS non contiene le definizioni di riga di comando variabile.

callb: 
    cd subdir && $(MAKE) $(MFLAGS) 

dettagli su questo due opzioni può essere letto qui: The GNU Make Manual

0

Al punto in cui sistema di compilazione Un invoca la costruzione del sistema B, non utilizzare '${MAKE}' direttamente; invoca uno script di shell che richiama il sistema di compilazione B (eventualmente dopo aver disinfettato l'ambiente).

per ottenere il comportamento in cui i comandi vengono eseguiti da 'make -n', precedere la riga di comando nel makefile con '+' (simile al prefisso la linea con '@' o '-').

0

Sembra che tu abbia modificato il makefile A per richiamare in modo ricorsivo il makefile B, e quindi il tuo problema. Perché non introdurre invece un nuovo makefile di primo livello che richiama ricorsivamente il makefile B, e quindi richiama ricorsivamente il makefile A? Ad esempio, combined.mk:

all: 
    $(MAKE) -f Makefile.B 
    $(MAKE) -f Makefile.A 

In questo modo il makefile B non eredita nulla dal makefile A.

Problemi correlati