[Scons-users] ??: Scons don't build target with absolute
    yangsc 
    yangsc2009 at gmail.com
       
    Mon Jul 14 22:16:45 EDT 2014
    
    
  
Here's my SConstruct File(The resRoot is the absolute path dir):
 
import os,sys
#the resmgr lib would modify the import path
#restore it later
oldPath=sys.path
import fxbuilder
import SCons.Scanner
import ResMgr
sys.path=oldPath
import fxconfig
import string
 
 
 
env = Environment(ENV = os.environ)
fxBuilder = Builder(action     = fxbuilder.FxBuilder,
                    src_suffix = ['.fx','.fxo'],
                                               emitter    =
fxbuilder.FxEmitter)
expr = '^[ \t]*#[ \t]*(?:include)[ \t]*(<|")([^>"]+)(>|")'
fxscan = SCons.Scanner.ClassicCPP("MyInputScan", [".fx",".fxo"], "CPPPATH",
expr)
env = Environment(BUILDERS = {'scfxBuilder' : fxBuilder})
env.Append(SCANNERS = fxscan)
Decider('MD5-timestamp')
 
oldPath=sys.path
docRoot = minidom.parse('paths.xml').documentElement
resRoot = docRoot.getElementsByTagName('Path')[0].childNodes[0].nodeValue
print '---------resRoot:', resRoot
sys.path=oldPath
 
fxconfig.fxPath=os.path.join(resRoot,fxconfig.fxPath)
fxconfig.fxmPath=os.path.join(resRoot,fxconfig.fxmPath)
fxconfig.fbiPath=os.path.join(resRoot,fxconfig.fbiPath)
 
#add the include paths
env.Append(CPPPATH=fxconfig.fxhPath)
 
def ListBuild(listFileName):
         rootSec=ResMgr.openSection(listFileName)
         if (rootSec==None):
                   print "list file not found"
         else:
                   for x in rootSec.values():
                            fileName=x.asString
                            fileName=os.path.join(resRoot,fileName)
                            if (os.path.exists(fileName)==True):
                                     env.scfxBuilder(fileName)
                            else:
                                     print "list build error:
\""+fileName+"\" not found"
 
ListBuild(fxconfig.listFile)
 
And my Builder and Emitter
import string
import fxexporter
import fxconfig
def FxBuilder(target, source, env):
         fxFile=str(source[0])
         fxmFile=str(target[0])
         fbiFile=str(target[1])
         fxFile=string.replace(fxFile,'\\','/')
         fxmFile=string.replace(fxmFile,'\\','/')
         fbiFile=string.replace(fbiFile,'\\','/')
         print "Building "+fxFile
         incPathList=env['CPPPATH']
         fxexporter.ExportEffect(fxFile,fxmFile,fbiFile,incPathList,
 
fxconfig.preMacros,
 
fxconfig.EXPORT_DESC)
         return None
 
#the emitter modify the target list to be generated
def FxEmitter(target, source, env):
         target=[] 
         for x in source:
#format source's and fxPath and elimite the fxPath's part in source's path.
#e.g: source="x/y/source.fx" and fxPath="x"
#then sx should be y/source.fx
                   sx=string.replace(str(x),'\\','/')
                   fxPath=string.replace(fxconfig.fxPath,'\\','/')
                   sx=string.replace(sx,fxPath,'',1)
                   if (len(sx)>0):
                            if (sx[0]=='/'):
                                     sx=string.replace(sx,'/','',1)
#elimite the suffix: '.fx'
                   words=string.split(sx,'.')
                   fxName=""
                   for i in range(len(words)-1):
                            fxName=fxName+words[i]
                   fxmName=fxconfig.fxmPath+"/"+fxName+".fxm"
                   fbiName=fxconfig.fbiPath+"/"+fxName+".fbi"
                   fxmName=fxmName.encode('utf-8')
                   fbiName=fbiName.encode('utf-8')
                   target.append(fxmName)
                   target.append(fbiName)
         print target
         print str(source[0])
         return target, source
#-----------------------------------------------------------
 
The Building Output
ocessor>scons
scons: Reading SConscript files ...
---------resRoot: D:\testRoot
['D:\\testRoot\\object/std_effects/branch.fxm',
'D:\\testRoot\\object/std_effecs/branch.fbi']
D:\testRoot\shaders\std_effects\branch.fx
scons: done reading SConscript files.
scons: Building targets ...
scons: `.' is up to date.
scons: done building targets.
 
 
In the source and target dir "D:\testRoot", the
"D:\testRoot\shaders\std_effects\branch.fx" exists and the object file
doesn't exist. I'm sure this emitter can work with a relative path resRoot.
I Added some output inside the builder which shows the builder never called.
It seems scons implicit dependency check is wrong when passing target file
an absolute path.
----------------------------------------------------------------------------
----------------------------------------------------------------------------
-----------------------
 
Message: 1
Date: Fri, 11 Jul 2014 09:16:59 +0200
From: Dirk B?chle <tshortik at gmx.de>
To: scons-users at scons.org
Subject: Re: [Scons-users] ??: Scons don't build target with absolute
         file path.
Message-ID: <53BF8F6B.8090503 at gmx.de>
Content-Type: text/plain; charset="utf-8"; Format="flowed"
 
Hi,
 
On 11.07.2014 03:40, yangsc wrote:
> 
> Hi,
> 
> In construct file I used my own builder and emmiter. My source file 
> has an absolute path like ?D:/testDir? which is different with the dir 
> of construct script file.
> 
> And my emitter also generated the target based on the source file Path 
> which is also an absolute path.
> 
> #the emitter modify the target list to be generated
> 
> def FxEmitter(target, source, env):
> 
> target=[]
> 
> for x in source:
> 
> ?
> 
> target.append(*target1Name*)
> 
> target.append(*target2Name*)
> 
> return target, source
> 
> My problem is the target is not exist, but scons always tell ?done 
> building targets?. And when I change the target to relative path, it 
> worked.
> 
> Is this a bug of scons? And is there any solution?
> 
> 
this is very difficult to tell, without seeing your full example. This would
include your Builder, Emitter and SConstruct/SConscripts. Do you have your
project checked in to a public repository (github, bitbucket, ...)? Then an
URL to your current development version/commit would help us to be able to
reproduce your error.
You can also try to create a minimal working example, compress the files
into a single archive, and attach it to your next email.
 
If you have not already done so, when writing Tools and Builders you should
have a short look at our http://www.scons.org/wiki/ToolsForFools
guide.
 
Your error might be similar to this issue: 
http://scons.tigris.org/issues/show_bug.cgi?id=2958
but that's just a wild guess.
 
Best regards,
 
Dirk
 
 
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://four.pairlist.net/pipermail/scons-users/attachments/20140715/ea348b85/attachment-0001.html>
    
    
More information about the Scons-users
mailing list