[Scons-dev] TEMPFILE spaces bug: your thoughts requested

Kenny, Jason L jason.l.kenny at intel.com
Sun Sep 2 18:09:26 EDT 2012


I made a small test of this with Parts and reproduced it.
It seems that the issue is not the tempfile.. but the way the command get processed SCons and passed to the Spawn calls to spawn the command.

In the example we have here we get something like this as a command:
c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\AMD64\lib.exe /nologo /OUT:_build\build_debug_win32-x86_64\part1\foo.lib _build\build_debug_win32-x86_64\part1\foo.obj

If I have a command like:
'"$AR" $ARFLAGS /OUT:$TARGET $SOURCES'

I get SCons to print this out as a command:
"c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\AMD64\lib.exe" /nologo /OUT:_build\build_debug_win32-x86_64\part1\foo.lib _build\build_debug_win32-x86_64\part1\foo.obj

While what I get from the Spawn function looks like this:
Ie ..print cmd,args
"c:\Program ['"c:\\Program', 'Files', '(x86)\\Microsoft', 'Visual', 'Studio', '10.0\\VC\\bin\\AMD64\\lib.exe"', '/nologo', '/OUT:_build\\build_debug_win32-x86_64\\part1\\foo.lib', '"_build\\build_debug_win32-x86_64\\part1\\foo.obj"']

The only way we can get this work at in Scons ( or in any user Spawn functions) is to say something like this:
string.join(args)

This mean the cmd value that is passed in is useless. From what I can see looking at the code it looks like SCons makes a full command and splits it, as you will note the we get strings like:
"C:\Program
and the string of
10.0\\VC\\bin\\AMD64\\lib.exe"

If I use the escape function:
escape(string.join(args))
I will get
""c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\AMD64\lib.exe" /nologo /OUT:_build\build_debug_win32-x86_64\part1\foo.lib "_build\build_debug_win32-x86_64\part1\foo.obj""

This leads to a double "" problem that leads to the failure the issue reports.

I need to look farther in to this, as I am not sure what a good solution is. Hopefully what I stated here helps explain the problem

I do know that SCons needs a tweak to deal with how it passes data to the Spawn function.

Jason

-----Original Message-----
From: scons-dev-bounces at scons.org [mailto:scons-dev-bounces at scons.org] On Behalf Of Gary Oberbrunner
Sent: Sunday, September 02, 2012 9:41 AM
To: SCons developer list
Subject: Re: [Scons-dev] TEMPFILE spaces bug: your thoughts requested

On Sat, Sep 1, 2012 at 11:27 PM, Kenny, Jason L <jason.l.kenny at intel.com> wrote:

> We gave Steve the patch to this issue.. As I recall he did not take it 100% and changed it. I have updated that version here:

>

> http://parts.tigris.org/source/browse/*checkout*/parts/trunk/parts/par

> ts/mappers.py?revision=449&content-type=text%2Fplain

>

> end of the file line 694-800


At least just from looking at the code, I don't see how it quotes cmd[0] or does anything specifically to prevent this problem.


> As I recall Steve tweak the actions to help make it smarter ( I

> believe it was the addition of a print action value), to help separate

> the value the temp file will call from the case when it need to create

> the temp file


Yes, that part is already in SCons.


> I forget the tweak we made, but it fixed the generation issue we found in our builds. I believe the issue is fixed with left overs lnk files in the temp directory. We use TempFile heavily in Part, or tweak the mslink and msvc tool use TEMPFILEMUNGE to deal with CC CXX and LINK commands as we found cases in our build in which the command line of these go way to long.

>

> The issue in 1705 I have not seen in our usages of it with scon 2.1 or

> 2.2


Can you try the simple test case from the bug report? I modified it a little bit to run on modern SCons versions. This test fails for me on the trunk. The fact that env['AR'] has spaces is what makes it fail.

=====
# Test MSVC tempfile handling

import os.path

d = os.path.join( "xxxxx", "yyyyyy", "zzzzzz", "aaaaaa" )
try:
os.makedirs( d )
except OSError, e:
pass


# Create a bunch of source files in xxxxx numSources = 100 sources = [] for x in range(numSources):
source = os.path.join( d, str(x)+ ".cpp" )
sources += [ source ]
print "Making source: ", source
open( source, 'w' ).close()

env = Environment()

# Path to alternative build tools:
env['AR'] = env.WhereIs("lib.exe")
print "Using %s for AR"%env['AR']

# If issue #1705 is still active, this will fail, # saying 'C:\Program' is not recognized as an internal or external command # because it doesn't get quoted properly.
env.StaticLibrary( os.path.join( d, "foo.lib" ), sources )

=====


--
Gary
_______________________________________________
Scons-dev mailing list
Scons-dev at scons.org
http://two.pairlist.net/mailman/listinfo/scons-dev


More information about the Scons-dev mailing list