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: [email protected] [mailto:[email protected]] 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 <[email protected]> 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
[email protected]
http://two.pairlist.net/mailman/listinfo/scons-dev
_______________________________________________
Scons-dev mailing list
[email protected]
http://two.pairlist.net/mailman/listinfo/scons-dev

Reply via email to