[Python-Dev] Compiling python with the free .NET SDK (original) (raw)
Garth garth at garthy.com
Sat Jan 17 15:54:29 EST 2004
- Previous message: [Python-Dev] Re: Python in 2003 summary
- Next message: [Python-Dev] Compiling python with the free .NET SDK
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Hi
I written a script that allows you to compile python with the free .NET Framework SDK. It reads in the XML file and uses a rule set to build the commands. At the moment it just executes them but I'm going to write a Makefile writter (GNU make is all I know though) It's probably possible to write rules to compile with mingw32 as well.
What would be a real help is if someone could send me the console output from the Debug and Release buiilds when you use command line devstudio to build it as some of the xml properties make no sense but I could probably work out what they mean. Things like 'RuntimeLibrary="2"' have no meaning unless I can see the output.
You need the free .NET framework SDK and the Platform SDK both available for free from microsoft
Just put the two python files in the PCBuild directory and run
vcproj_read.py pythoncore.vcproj "Release|Win32"
or
vcproj_read.py pythoncore.vcproj "Debug|Win32"
I've only tested it with pythoncode.vcproj and python.vcproj so if you get a keyerror around line 187 you need to add more rules to interpret the settings.
Cheers
Garth
-------------- next part -------------- import sys from xml.dom.ext.reader import Sax2 import xml.dom.ext import file_rules
if len(sys.argv) < 3: print " " sys.exit(1)
xml_file = file( sys.argv[1], 'rU' )
reader = Sax2.Reader()
doc = reader.fromStream( xml_file )
xml_file.close()
vsproj = doc.getElementsByTagName('VisualStudioProject')[0]
def attributes2dict(dom): """ """ d = {} for attr in dom.attributes: #print attr d[attr.name] = attr.nodeValue return d
def xmlnode2dict( dom ): #print dom #print dir(dom) #self = { } self = attributes2dict( dom ) if dom.hasChildNodes(): for child in dom.childNodes: try: childdict = xmlnode2dict( child ) try: self[child.nodeName].append( childdict ) except KeyError: self[child.nodeName] = [ childdict ] except TypeError: pass #print "skipping",child return self
project = xmlnode2dict( vsproj )
Select the configuration
for config in project['Configurations'][0]['Configuration']: if config['Name'] == sys.argv[2]: currentconfig = config
try: print "Config selected", currentconfig['Name'] except NameError: print "Couldn't find config",sys.argv[2] sys.exit(1)
file_rules.currentconfig = currentconfig
write the makefile by sening ocommand off to MakfileWrite class
For now just exe
objectlist = [] import os for f in project['Files'][0]['File']: print "Processing ",f['RelativePath']
cmdline,obj = file_rules.generate_command_line( f )
print cmdline
if cmdline:
os.system( cmdline )
objectlist.append( obj )
Now link.....
print "link ",objectlist print "When I get around to writing it"
-------------- next part -------------- import os.path
Tool rule setting
Sometimes file setting s override trhe config rule and sometimes they
just add to it maybe this is wrong?
TOOL_RULE_OVERRIDE = 0 TOOL_RULE_BOTH = 1
currentconfig = None
def find_file_config( fileconfig ): for config in fileconfig['FileConfiguration']: if config['Name'] == currentconfig['Name']: return config
def find_tool_settings( fileconfig, name, setting, rule): settings = [] try: currentfileconfig = find_file_config( fileconfig ) for tool in currentfileconfig['Tool']: if tool['Name'] == name: if tool[setting] != '': settings.append( tool[setting] ) if rule == TOOL_RULE_OVERRIDE: return tool[setting] except KeyError: # OK no file specific config for this file pass
for tool in currentconfig['Tool']:
if tool['Name'] == name:
settings.append( tool[setting] )
if rule == TOOL_RULE_BOTH:
return settings
else:
return tool[setting]
raise KeyError,"DAMN" + str(fileconfig) + str(name) + str(setting)
Guessing at this.. need to fill in the real values
DebugInformationFormatmap = {'3' : '-Zi'}
Optimizationmap = {'0' : "", '1' : "/O1", '2' : "/O2", '3' : "/Ox"}
def option_list( fconfig, tool, var, delimiter, prefix ): """ """ options = find_tool_settings( fconfig, tool,var,TOOL_RULE_BOTH) optionlist = [] for option in options: optionlist += option.split( delimiter ) return prefix + prefix.join( optionlist )
def option_param( fconfig, tool, var, prefix ): """ """ option = find_tool_settings( fconfig, tool,var,TOOL_RULE_OVERRIDE) return prefix + option
def option_bool( fconfig, tool, boolname, prefix ): """ """ line = "" b = find_tool_settings( fconfig, 'VCCLCompilerTool',boolname,TOOL_RULE_OVERRIDE) if bool(b): line = prefix return line
def option_bool_param(fconfig, tool, boolname, paramname, prefix ): """ """ line = "" b = find_tool_settings( fconfig, 'VCCLCompilerTool',boolname,TOOL_RULE_OVERRIDE) if bool(b): paramvalue = find_tool_settings( fconfig, 'VCCLCompilerTool',paramname,TOOL_RULE_OVERRIDE) line = prefix + paramvalue return line
def option_map( fconfig, tool, var, optionmap ): """ """ option = find_tool_settings( fconfig, tool,var,TOOL_RULE_OVERRIDE) return optionmap[ option ]
toolextmap = {'c' : 'VCCLCompilerTool', 'rc': 'VCResourceCompilerTool', 'ico' : None,}
HMM are the ones I'm not sure about...
OPTION_TYPE_HMM = 0
OPTION_TYPE_BOOL = 1 OPTION_TYPE_BOOL_PARAM = 2 OPTION_TYPE_MAP = 3 OPTION_TYPE_PARAM = 4 OPTION_TYPE_LIST = 5
IGNORE is there as they are probably used in some other
parameter thing
OPTION_TYPE_IGNORE = 6
toolmap = {'VCCLCompilerTool' : { 'pre' : 'cl ' , 'post' : ' -c ', 'objpath': 'ObjectFile', 'objext' : 'obj', #'Name': {'type' : OPTION_TYPE_IGNORE }, 'AdditionalOptions' : {'type' : OPTION_TYPE_PARAM, 'flag' : '', }, 'PrecompiledHeaderFile': {'type' : OPTION_TYPE_IGNORE }, 'EnableFunctionLevelLinking' : { 'type' : OPTION_TYPE_BOOL, 'flag' : '-Gy' }, 'StringPooling': { 'type' : OPTION_TYPE_BOOL, 'flag' : '-Gf' }, # Not sure about this one 'InlineFunctionExpansion': { 'type' : OPTION_TYPE_BOOL, 'flag' : '-Ob1' }, 'ProgramDataBaseFileName' : {'type' : OPTION_TYPE_IGNORE },
'RuntimeLibrary' : {'type' : OPTION_TYPE_HMM },
'AssemblerListingLocation' : {'type' : OPTION_TYPE_HMM },
'CompileAs' : {'type' : OPTION_TYPE_HMM },
'AdditionalIncludeDirectories' : {'type' : OPTION_TYPE_LIST,
'delim' : ',',
'flag' : ' -I',
},
'PreprocessorDefinitions' : {'type' : OPTION_TYPE_LIST,
'delim' : ';',
'flag' : ' -D',
},
'BrowseInformation' : { 'type' : OPTION_TYPE_BOOL_PARAM,
'paramname' :'ProgramDataBaseFileName',
'flag' : '-FR'
},
'DebugInformationFormat' : { 'type' : OPTION_TYPE_MAP,
'map' : DebugInformationFormatmap,
},
'ObjectFile' : {'type' : OPTION_TYPE_PARAM,
'flag' : '-Fo',
},
'Optimization': { 'type' : OPTION_TYPE_MAP,
'map' : Optimizationmap,
},
'WarningLevel' : {'type' : OPTION_TYPE_PARAM,
'flag' : '-W',
},
'UsePrecompiledHeader': { 'type' : OPTION_TYPE_BOOL_PARAM,
'paramname' :'PrecompiledHeaderFile',
'flag' : '-YX',
},
'SuppressStartupBanner' : { 'type' : OPTION_TYPE_BOOL,
'flag' : '-nologo'
},
},
'VCResourceCompilerTool' : {'pre' : 'rc ' ,
'post' : '',
'objpath': None,
'objext' : 'res',
'Name': {'type' : OPTION_TYPE_IGNORE },
'PreprocessorDefinitions' : {'type' : OPTION_TYPE_LIST,
'delim' : ';',
'flag' : ' -d',
},
'AdditionalIncludeDirectories' : {'type' : OPTION_TYPE_LIST,
'delim' : ',',
'flag' : ' -i',
},
'Culture': {'type' : OPTION_TYPE_PARAM,
'flag' : '-l',
},
}
}
def run_option( f, tool, option ): """ """ line = "" oinfo = toolmap[tool][option]
print oinfo
if oinfo['type'] == OPTION_TYPE_HMM:
print "Option ", option, "Not implemented yet!"
pass
elif oinfo['type'] == OPTION_TYPE_BOOL:
line = option_bool(f, tool, option, oinfo['flag'] )
elif oinfo['type'] == OPTION_TYPE_BOOL_PARAM :
line = option_bool_param( f, tool, option, oinfo['paramname'], oinfo['flag'] )
elif oinfo['type'] == OPTION_TYPE_MAP:
line = option_map( f, tool, option, Optimizationmap)
elif oinfo['type'] == OPTION_TYPE_PARAM:
line = option_param( f, tool, option, oinfo['flag'] )
elif oinfo['type'] == OPTION_TYPE_LIST:
line = option_list( f, tool, option, oinfo['delim'], oinfo['flag'] )
return line
def generate_command_line( f ): """ """ cmd = "" obj = "" ext = f['RelativePath'].split(".")[-1] toolname = toolextmap[ ext ] if toolname: lines = [] for tool in currentconfig['Tool']: if tool['Name'] == toolname: for setting in tool: lines.append( run_option( f, toolname, setting) )
cmd = toolmap[ toolname ]['pre']
cmd += (" ".join( lines ))
cmd += toolmap[ toolname ]['post']
cmd += " " + f['RelativePath']
if toolmap[ toolname ]['objpath']:
objectpath = find_tool_settings( f, toolname, toolmap[ toolname ]['objpath'] ,TOOL_RULE_OVERRIDE)
else:
objectpath = os.path.split( f['RelativePath'] )[0]
objectfile = "".join( os.path.splitext( os.path.split( f['RelativePath'] )[1] )[0] ) + toolmap[ toolname ]['objext']
obj = os.path.join(objectpath,objectfile)
return ( cmd, obj)
def generate_command_line_old( f ): """ """ ext = f['RelativePath'].split(".")[-1] cmdlinefunc = filetype[ ext ] return cmdlinefunc( f )
def generate_link_line( files ): """ """ line = ['link'] raise SystemError,"WriteME!"
- Previous message: [Python-Dev] Re: Python in 2003 summary
- Next message: [Python-Dev] Compiling python with the free .NET SDK
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]