Ich versuche, eine gemeinsame Bibliothek von gcc und gfortran Objekte mit SCons und MinGW unter Windows zu erstellen, aber während der letzten Link die Befehlszeile ist zu lang, mehr als 18000 Zeichen. Ich weiß, dass ich eine temporäre Datei (Antwortdatei?) Verwenden muss, um die Befehlszeile zu übergeben, aber ich kann keinen Weg finden, SCons dazu zu bringen, dies direkt zu tun. Ich benutzte CMake für diese Bibliothek und es behandelte die Antwortdatei ohne meine Einmischung.SCons lange Befehlszeile TEMPFILE mit MinGW
SCons scheint CommandGeneratorAction zu verwenden, um die Befehlszeile der gemeinsam genutzten Bibliothek zu generieren. Gibt es eine Möglichkeit, dieser Aktion mitzuteilen, den Mechanismus der Antwortdatei zu verwenden? Gibt es eine andere Methode zum Behandeln langer Befehlszeilen, die ich übersehen habe?
Relevante SConscript:
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=['.',])
Relevante Ausgabe von env.Dump():
'SHLIBSUFFIX': '.dll',
'SHLINK': '$LINK',
'SHLINKCOM': <SCons.Action.CommandGeneratorAction object at 0x02DDF770>,
'SHLINKFLAGS': ['$LINKFLAGS', '-shared'],
ich die Befehlszeile Vorlage in meiner Umgebung vorbereiten konnte env['SHLINKCOM']="${TEMPFILE('$SHLINK -o $TARGET ... $SOURCE')}"
, aber dies scheint zerbrechlich und ich würde lieber, wenn SCs damit umgehen.
Ich versuchte mit String-Ersetzung env['SHLINKCOM']='${TEMPFILE("%s")}' % (env['SHLINKCOM'],)
, aber das Ergebnis war eine unvollständige Befehlszeile und jetzt Antwortdatei sowieso.
EDIT
ich die LongCmdLinesOnWin32 Abhilfe gesehen haben. Ich würde es vorziehen, den TEMPFILE-, TempFileMunge-, Commandline-Indirection-Mechanismus zu verwenden, wenn möglich.
Ich habe diese Problemumgehung gesehen. Allerdings ist diese [Lösung] (http://scons.org/wiki/LongCmdLinesOnWin32?action=recall&rev=1) jetzt 8 Jahre alt. Es hat den Anschein, dass sich SCons entwickelt hat, um den TTF-Indirektions-Mechanismus seither zu verwenden. Wenn ich die geeignete Verwendung von tempfile nicht festhalten kann, werde ich diese Problemumgehung versuchen. – tharen
Der letzte Kommentar ist ziemlich neu. Wie auch immer, wenn Sie einen besseren Weg finden, wird ein Patch immer geschätzt. http://scons.org/wiki/LongCmdLinesOnWin32?action=diff&rev1=40&rev2=41 –
Hinweis: Es gibt Probleme mit [LongCmdLinesOnWin32] (http://scons.org/wiki/LongCmdLinesOnWin32). Es muss erweitert werden, um Pfadnamen mit eingebetteten Anführungszeichen zu behandeln (hinzugefügt, um Leerzeichen in einer Cygwin-Umgebung zu behandeln), aber es scheint auch ein Problem mit Visual Studio zu geben. Es sieht so aus, als ob die VS-Umgebung ihre eigene Version von SPAWN installiert, die die MSVC-Kommandozeilen-Shell startet (und somit die benötigten env.-Werte einstellt), was dazu führt, dass Kompilierungen mit "cl" fehlschlagen. – TheDuke