2012-11-13 11 views
5

Sto provando a creare una libreria condivisa dagli oggetti gcc e gfortran utilizzando SCons e MinGW su Windows, ma durante il collegamento finale la riga di comando è troppo lunga, con oltre 18000 caratteri. So che ho bisogno di usare un tempfile (file di risposta?) Per passare la riga di comando, ma non riesco a trovare un modo per ottenere direttamente da SCons. Stavo usando CMake per questa libreria e gestiva il file di risposta senza la mia interferenza.SCONOMETRO TEMPFILE a linea di comando con MinGW

Sembra che SCons utilizzi CommandGeneratorAction per generare la riga di comando della libreria condivisa. C'è un modo per dire a questa azione di utilizzare il meccanismo del file di risposta? Esiste un altro metodo per gestire lunghe righe di comando che sto trascurando?

SConscript Rilevante:

sqllib = env.SharedLibrary(target='fvssql', source=sqllib_sources, LIBS=['odbc32',]) 
ffelib = env.SharedLibrary(target='fvspncffe', source=ffelib_sources, LIBS=[sqllib,], LIBPATH=['.',]) 

fvsobjs = env.SharedObject(fvslib_sources) 
fvsobjs = [obj for obj in fvsobjs if obj.get_suffix()=='.o'] 

fvslib = env.SharedLibrary(target='fvspnc', source=fvsobjs, LIBS=sqllib+ffelib, LIBPATH=['.',]) 

relativa uscita da env.Dump():

'SHLIBSUFFIX': '.dll', 
'SHLINK': '$LINK', 
'SHLINKCOM': <SCons.Action.CommandGeneratorAction object at 0x02DDF770>, 
'SHLINKFLAGS': ['$LINKFLAGS', '-shared'], 

ho potuto preparare il modello di riga di comando nel mio ambiente env['SHLINKCOM']="${TEMPFILE('$SHLINK -o $TARGET ... $SOURCE')}", ma questo sembra fragile e mi piacerebbe preferisci che SCons lo gestisca, se possibile.

Ho provato a utilizzare la sostituzione di stringa env['SHLINKCOM']='${TEMPFILE("%s")}' % (env['SHLINKCOM'],), ma il risultato era una riga di comando incompleta e ora il file di risposta comunque.

EDIT

ho visto la soluzione LongCmdLinesOnWin32. Preferirei usare il TEMPFILE, TempFileMunge, meccanismo di riferimento indiretto, se possibile.

risposta

1

Hai visto http://scons.org/wiki/LongCmdLinesOnWin32? Sembra che ci sia una risposta al tuo esatto problema con un lungo comando durante la fase di collegamento.

+0

Ho visto questa soluzione alternativa. Tuttavia, questa [soluzione] (http://scons.org/wiki/LongCmdLinesOnWin32?action=recall&rev=1) ha ora 8 anni. Sembra che SCons si sia evoluto per utilizzare il meccanismo di indiretta tempfile da allora. Se non riesco a definire l'uso appropriato di tempfile, darò una soluzione a questa soluzione alternativa. – tharen

+0

L'ultimo commento è piuttosto recente. Ad ogni modo, se trovi un modo migliore, una patch è sempre apprezzata. http://scons.org/wiki/LongCmdLinesOnWin32?action=diff&rev1=40&rev2=41 –

+0

Nota ci sono problemi con [LongCmdLinesOnWin32] (http://scons.org/wiki/LongCmdLinesOnWin32). Deve essere esteso per gestire i nomi dei percorsi con citazioni incorporate (aggiunte per gestire gli spazi in un ambiente cygwin) ma, inoltre, sembra che ci sia qualche problema con Visual Studio. Sembra che l'ambiente VS stia installando la propria versione di SPAWN, che avvia la shell della riga di comando di MSVC (impostando così i valori di env. Necessari), facendo fallire la compilazione di "cl". – TheDuke