Qual è il metodo SCONS corretto per l'aggiornamento del contenuto di un file che fa parte della compilazione?Come rendere SCONS aggiornare il contenuto di un file utilizzato in una build
Uso SCONS per creare un progetto abbastanza grande. Ma per il bene di una semplice domanda, per scontato che assomiglia a questo:
env.Program("foo", ["foo.c", "version.c"])
In determinate condizioni di compilazione, è necessario aggiornare il contenuto di uno dei file CPP nella build con nuove informazioni - informazioni sulla versione in realtà. Nell'esempio sopra, avrei bisogno di modificare il contenuto di "version.c". Ho pensato che avrei potuto fare questo piuttosto bene con il seguente esempio:
env.Command(target="version.c", source=[], action=PythonFunctionToUpdateContents)
env.Program("foo", ["foo.c", "version.c"])
I PythonFunctionToUpdateContents userebbero obiettivo [0] come il nome del file, aprirlo, cercare qualche testo specifico, cambiarlo, scrivere le modifiche torna allo stesso file. Sfortunatamente, l'esempio sopra non funziona. SCONS elimina automaticamente un file di destinazione prima di costruirlo, quindi il mio file "version.c" è stato eliminato prima che potesse essere aggiornato.
Ho provato a impostare il target e l'origine sullo stesso file nella chiamata env.Command(), ma ciò crea solo un ciclo di dipendenze.
So che potrei risolvere questo problema facendo in modo che SCONS generi il file ENTRE versione.c, ma non è adatto poiché version.c contiene molti altri codici che possono cambiare come parte del normale sviluppo.
L'esempio era troppo semplice, forse. La mia chiamata "env.Program()" è in realtà una chiamata esterna a un processo di generazione di terze parti che non è basato su SCONS. Quindi sto cercando di ottenere il file modificato prima di avviare il processo. Sono d'accordo: modificare il file non è una buona idea. Ma non ho il controllo su quella parte del processo di costruzione. –
Lo stesso principio si applica però: si dispone di un file che si controlla che è il modello dell'input per il processo di build esterno. Crea una copia modificata del tuo modello nella directory pertinente prima di dare il via al processo esterno. In caso contrario, è sempre possibile creare un'intera copia della build di terze parti (potrebbe non essere pratico) e modificare i file in tale copia. – richq