[Scons-users] linker command under windows not working (too long)

Philipp Kraus philipp.kraus at flashpixx.de
Sun Mar 31 21:07:18 EDT 2013


I have create this configuration

envlib["TEMPFILE"] = BuildTempFile
envlib["SHLINKCOM"] = "$SHLINK -o $TARGET $SHLINKFLAGS
${TEMPFILE('$SOURCES')} $_LIBDIRFLAGS $_LIBFLAGS"


and the temp build class:

class BuildTempFile(object):
def __init__(self, cmd):
self.cmd = cmd
def __call__(self, target, source, env, for_signature):
if for_signature:
return self.cmd

cmd = env.subst_list(self.cmd, SCons.Subst.SUBST_CMD, target,
source)[0]
try:
maxline = int(env.subst('$MAXLINELENGTH'))
except ValueError:
maxline = 2048

length = 0
for c in cmd:
length += len(c)
if length <= maxline:
return self.cmd

(fd, tmp) = tempfile.mkstemp('.lnk', text=True)
native_tmp = SCons.Util.get_native_path(os.path.normpath(tmp))

if (env['SHELL'] and env['SHELL'] == 'sh') :
native_tmp = native_tmp.replace('\\', r'\\\\')
rm = env.Detect('rm') or 'del'
else:
rm = 'del'

prefix = env.subst('$TEMPFILEPREFIX')
if not prefix:
prefix = '@'

args = list(map(SCons.Subst.quote_spaces, cmd[1:]))
if "mingw" in env['platform'] :
args = [i.replace('\\', r'\\') for i in args]

os.write(fd, " ".join(args) + "\n")
os.close(fd)
if SCons.Action.print_actions:
print("Using tempfile "+native_tmp+" for command line:\n"+
str(cmd[0]) + " " + " ".join(args))

return [ cmd[0], prefix + native_tmp + '\n' + rm, native_tmp ]

but Scons create the wrong command:

g++ -o Irrlicht.dll -Wl,--add-stdcall-alias -Wl,--kill-at -shared
source\Irrlicht\C3DSMeshFileLoader.o
@c:\users\admini~1\appdata\local\temp\tmpzk1l0n.lnk


IMHO all *.o files should be in the temporary file.


On 2013-04-01 00:08:56 +0200, Philipp Kraus said:


> On shared lib I must modifiy SHLINKCOM but on MinGW seems to be an error in

> correct escaping path names (see the platform/__init__.py script and

> the class TempFileMunge)

>

> the line in the method __call__

> args = list(map(SCons.Subst.quote_spaces, cmd[1:]))

>

> must be a correct path escaping eg

> if "mingw" in env['platform'] :

> args = [i.replace('\\', r'\\\\') for i in args]

>

> because on MinGW toolset, that is run direct in Windows command line

> the pathes are stored only with \ but must be \\

>

> Phil

>

>

> On 2013-03-31 17:44:05 +0200, Philipp Kraus said:

>

>> I have set my linker command to

>> envlib["LINKCOM"] = "${TEMPFILE('"+envlib["LINKCOM"]+"')}"

>>

>> the tempfile is set on default to Scons TempFileMunge

>> and the prefix stores the @ char.

>> But my object files are not passed to the file and the linker command

>> is also gcc <o files>, so it is not modified with the tempfile

>>

>> I'm a little bit confused

>>

>> Thx

>>

>> Phil

>>

>>

>> On 2013-03-31 14:34:26 +0200, Philipp Kraus said:

>>

>>> Is there an example for the callable class? Because which information

>>> must be returned by the callable method?

>>>

>>>

>>> Am 31.03.2013 um 03:17 schrieb Bill Deegan:

>>> Won't TEMPFILE work for this?

>>>

>>> A callable class.  You can set an Environment variable to this,

>>>     then call it with a string argument, then it will perform temporary

>>>     file substitution on it.  This is used to circumvent the long command

>>>     line limitation.

>>>

>>>     Example usage:

>>>     env["TEMPFILE"] = TempFileMunge

>>>     env["LINKCOM"] = "${TEMPFILE('$LINK $TARGET $SOURCES')}"

>>>

>>>     By default, the name of the temporary file used begins with a

>>>     prefix of '@'.  This may be configred for other tool chains by

>>>     setting '$TEMPFILEPREFIX'.

>>>

>>>     env["TEMPFILEPREFIX"] = '-@'        # diab compiler

>>>     env["TEMPFILEPREFIX"] = '-via'      # arm tool chain

>>>

>>> -Bill

>>>

>>>

>>> On Sat, Mar 30, 2013 at 11:26 AM, Philipp Kraus

>>> <philipp.kraus at flashpixx.de> wrote:

>>> Hi,

>>>

>>> thanks for this idea but I don't use the env.Object call, I call

>>> env.SharedLibrary direct in the build script, so the *.o file is

>>> created by the dependency graph that is build by Scons.

>>> So I need to change my script for the MinGW toolset and create the

>>> object files first and referenced them via the file. It should be a

>>> IMHO a "hacking solution".

>>>

>>> Thanks a lot, so I can test my build script

>>>

>>> Phil

>>>

>>>

>>> On 2013-03-30 19:07:42 +0100, Brady Johnson said:

>>>

>>>

>>> You can use response files, (supported by both gcc and msvc) which

>>> allows you to list several object files, etc in a file, then refer to

>>> that file on the command line prepending it with the '@' symbol. Here

>>> is a question/answer on Stack Overflow that addresses this:

>>> http://stackoverflow.com/q/15242177/1158895

>>>

>>> Notice, though that SCons wont read what's in the response file, so

>>> dependency checking wont work as expected. I addressed this in my

>>> answer to the Stack Overflow question.

>>>

>>> Hope that helps,

>>>

>>> Brady

>>>

>>>

>>>

>>> On Sat, Mar 30, 2013 at 3:07 PM, Philipp Kraus

>>> <philipp.kraus at flashpixx.de> wrote:

>>> Hello,

>>>

>>> I try to build Irrlicht engine with mingw toolset under Scons. The

>>> compiler calls works well, but the last linker command to build the

>>> shared library creates the error, that the command length is reached.

>>> MS describe the probleme here http://support.microsoft.com/kb/830473/en-us

>>> The command shows:

>>>

>>> g++ -shared -o Irrlicht.dll <here all *.o files> -Wl,--out-implib,libIrrlicht.a

>>>

>>> I don't know how I can solve this problems. The problem exists only

>>> with the MinGW toolset under MSVC the problem does not exists.

>>>

>>> Thanks for help

>>>

>>> Phil

>>>

>>>

>>>

>>> _______________________________________________

>>> Scons-users mailing list

>>> Scons-users at scons.org

>>> http://four.pairlist.net/mailman/listinfo/scons-users

>>>

>>> _______________________________________________

>>> Scons-users mailing list

>>> Scons-users at scons.org

>>> http://four.pairlist.net/mailman/listinfo/scons-users

>>

>> _______________________________________________

>> Scons-users mailing list

>> Scons-users at scons.org

>> http://four.pairlist.net/mailman/listinfo/scons-users

>

> _______________________________________________

> Scons-users mailing list

> Scons-users at scons.org

> http://four.pairlist.net/mailman/listinfo/scons-users

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://four.pairlist.net/pipermail/scons-users/attachments/20130401/5a5282a9/attachment.htm>


More information about the Scons-users mailing list