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

Philipp Kraus philipp.kraus at flashpixx.de
Sat Apr 6 17:50:59 EDT 2013


I can not create a working solution, so I implementated this myself
(see the code here:
https://github.com/flashpixx/Storage/blob/master/Irrlicht/SConstruct )
My code is similar to the Scons tempfile, but here push only the linker
files to a file, so I write an own Python function:

# creating a resource file for suppress long-line-error (Windows problem)
# @param env environment object
# @param sources list files (should be absoute path names)
def ResourceFile(env, list) :
    (fd, resource) = tempfile.mkstemp(".res", text=True)
    for i in list :
        os.write (fd, "%s\n" % str(i).replace("\\", "\\\\"))
    os.close(fd)
    return env.get("TEMPFILEPREFIX", "") + resource

It is recommand, that the path seperators on MinGW replace from \ to
\\, because the paths can not be resolved in a correct way.

After that I replace the build commands in the environment object:
envlib["SHLINKCOM"] = "$SHLINK -o $TARGET $SHLINKFLAGS
${ResourceFile(__env__, SOURCES.abspath)} $_LIBDIRFLAGS $_LIBFLAGS"
envlib["ARCOM"] = "$AR $ARFLAGS $TARGET
${ResourceFile(__env__, SOURCES.abspath)}"

but I use the SHLINKCOM for the envlib.SharedLibrary call and the ARCOM
is used on the envlib.StaticLibrary. I push always absolut path
information to the file
because a correct reference to the object files

Phil


On 2013-04-01 14:38:42 +0200, Philipp Kraus said:


> Hi,

>

> s

> Am 01.04.2013 um 03:39 schrieb William Deegan:

> Take a look at this bit of logic.. It's how the path to the temp file

> is rendered on the command line:

>         if (env['SHELL'] and env['SHELL'] == 'sh') :

>             native_tmp = native_tmp.replace('\\', r'\\\\')

>                                                                        

>    ^^^^^^^

> This was a little typo error on  copy & past the code, I use

> replace('\\', r'\\'). I have used the original Scons

> code from the platform/__init__.py script. I have added only

>

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

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

>

>

> but another difference is the "$TARGET", but I can not get a working

> solution with the tempfile. The tempfile call

> in the linkcom create more linker errors.

>

> Another inconsistence is, that the SHLINKCOM is a Scons.Action object

> and the LINKCOM a string.

> The difference is also, that in the LINKCOM on gcc the part "-o

> $TARGET" exists, but in the SHLINKCOM not.

>

> If I do str(env["SHLINKCOM"]).replace("$SOURCE",

> "${TEMPFILE('$SOURCE')} the created statement creates

> a linker error, because the -o $TARGET part does not exists. (This

> problem exists on Scons 2.3.0 devel & 2.2 stable).

>

> My working solution without the tempfile is a manual code

>

> obj = envlib.SharedObject(srclibrary)

> resource = "tempfile.res"

> with open(resource, "w") as f:

> for obj_name in obj:

>         f.write ("%s\n" %os.path.abspath(str(obj_name)).replace("\\",

> "/"))    

> envlib.AppendUnique(LINKFLAGS = ["@"+resource])

> lib = envlib.SharedObject("mytarget", [])

> Depend(lib, obj)

>

>

> The tempfile call is IMHO not usable at the moment, because path

> escaping are creates errors, linker commands are

> inconsistent after adding the tempfile (I found the difference after

> debugging the env object and print the full linker

> command to a file)

>

>

>

>

>

>             rm = env.Detect('rm') or 'del'

>         else:

>             rm = 'del'

>

> The 'native_tmp" bit..

>

> -Bill

> On Mar 31, 2013, at 6:07 PM, Philipp Kraus <philipp.kraus at flashpixx.de> wrote:

> 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

>

> _______________________________________________

> 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/20130406/640d3d23/attachment-0001.html>


More information about the Scons-users mailing list