[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