2015-04-28 15 views
5

Quando si eseguono le regole di gnu-make con -jN make crea un jobserver per la gestione del conteggio dei lavori tra i sottomarini. Inoltre è possibile "passare l'ambiente Jobserver" per una ricetta make mettendo il prefisso con + - ad esempio:È possibile "passare" GNU rendere l'ambiente di un server di lavoro a un sottotesto servito da terze parti (non-make)

target : 
     +./some/complex/call/to/another/make target 

Ora, invece di un sub-make Ho uno script (Python) che gestisce alcune azioni di confezionamento complesse (troppo complesso per fare). Una delle azioni in cui può essere eseguito può effettivamente generare un comando make.

package.stamp : $(DEPS) 
     +./packaging.py $(ARGS) 
     touch [email protected] 

Ora, quando che rendono comando viene richiamato all'interno packaging.py

make[1]: warning: jobserver unavailable: using -j1. Add `+' to parent make rule. 

Questo rende un po 'di senso, perché qualsiasi ambiente sia di impostazione per marca, non possono essere onorato o attraversato da pitone.

È possibile passare i riferimenti jobserver tramite il programma python al sotto-make - se sì, come?

risposta

5

Ci sono due aspetti per il server dei lavori che devono essere preservati: il primo è una variabile di ambiente reale, che si usa per inviare opzioni ai sub-marchi. Quel valore viene preservato correttamente, altrimenti make non saprebbe che dovrebbe anche cercare il server di lavoro e non vedresti quel messaggio di avviso.

Il secondo aspetto sono due descrittori di file aperti che vengono passati ai figli di make. Lo script DEVE preservare questi due descrittori e lasciarli aperti quando invoca il sotto-make.

Non ci viene mostrato quale codice Python viene utilizzato per richiamare il sotto-make. Per impostazione predefinita, il modulo subprocess non chiude i descrittori di file, ma è possibile fornire l'opzione close_fds=True per fare in modo che ... si dovrebbe non utilizzare questa opzione se si desidera che le chiamate parallele di make funzionino correttamente con il server di lavoro.

Se non stai usando subprocess, allora dovrai mostrarci cosa stai facendo .

Probabilmente dovresti contrassegnarlo con un tag python poiché si tratta principalmente di una domanda Python.

+0

Grazie - sì ho avuto 'close_fds' come vero. Lascerò Python fuori dalle etichette - quello che volevo rispondere e quello che hai risposto è "ciò che deve essere preservato da un sottoprocesso affinché il jobserver funzioni". Le variabili di ambiente di risposta e i descrittori di file aperti sono la risposta corretta indipendente dal fallimento del mio python. – Greg

0

Per riassumere e chiarire la risposta - per la Jobserver a lavorare nei vostri sotto-processi è necessario conservare:

  • variabili d'ambiente
  • FDS JobServer

Uno dell'ambiente le variabili passate sembrano (per me) come segue:

MAKEFLAGS= --jobserver-fds=3,4 -j -- NAME=VALUE 

jobserver-fds comunica quale fds make è stato aperto per comunicare con il server del lavoro. Affinché il submake sia in grado di utilizzare il server di lavoro, è necessario preservare, o predisporre di essere disponibili, quei fds specifici (o riscrivere la variabile di ambiente in modo appropriato per indirizzarli a qualsiasi fd su cui finiscono).

NAME=VALUE è argomenti passati da me alla marca originale.

+0

Si noti che fino a GNU fare 4.2, quel flag era considerato un comportamento interno di make GNU e non pubblico. A partire da GNU make 4.2, l'interfaccia jobserver è stata ufficialmente pubblicata in modo che possa essere utilizzata da altri strumenti, ma insieme a questa opzione è stata rinominata in --jobserver-auth. – MadScientist

Problemi correlati