blob: 227b150f6f6d991a2a7b0cb238da53085b72dd00 [file] [log] [blame]
#TODO: Propgroups below UserMacros, ClCompile, Link, & Lib stuff, pre and postbuild events
#Issues: Which additional include directories to include?
import os
outputDir = 'converted-module-projects'
sourceExtensions = ['c', 'cpp', 'cxx','l','y','ll','yy', 'crc']
headerExtensions = ['h', 'hxx', 'hrc']
libExtensions = ['lib']
includeDebug = False
def main(moduleDir, mainDir):
os.chdir(moduleDir)
print (moduleDir)
name = moduleDir.rsplit('\\',1)
outputFile = open(mainDir+'\\' + outputDir + '\\'+name[len(name)-1] + ".vcxproj","w+")
#printAndOutput("Name:",outputFile)
#printAndOutput(name[1],outputFile)
#printAndOutput('',outputFile)
try:
file = open('prj/d.lst')
except IOError:
print ('prj.lst not found, skipping folder')
outputFile.close()
return
constructProjFile(outputFile, file, name[1], moduleDir, mainDir)
def constructProjFile(projFile, buildFile, name, moduleDir, mainDir):
xmlVersionTag(projFile)
projectTag(projFile, buildFile, name, mainDir, moduleDir)
def xmlVersionTag(projFile):
printAndOutput(projFile, '<?xml version="1.0" encoding="utf-8"?>')
def projectTag(projFile, buildFile, name, mainDir, moduleDir):
printAndOutput(projFile, '<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">')
projectConfiguration(projFile)
globalsProperty(projFile, name)
if (includeDebug):
conditionProperty(projFile)
conditionProperty(projFile)
importProject(projFile, 'props') # imports 'props' project
extensionSettings(projFile)
if (includeDebug):
propertySheets(projFile) # Include if debug version is included
propertySheets(projFile)
userMacros(projFile)
if (includeDebug):
libPropertyGroup(projFile, mainDir, name) # include if debug version is included
libPropertyGroup(projFile, mainDir, name)
if (includeDebug):
itemDefinitionGroup(projFile, mainDir, moduleDir)
itemDefinitionGroup(projFile, mainDir, moduleDir)
headerFiles(projFile, moduleDir)
sourceFiles(projFile, moduleDir)
importProject(projFile, 'targets') # imports 'targets' project
extensionSettings(projFile)
printAndOutput(projFile, '</Project>')
# Whether or not a debug version is included is defined here
def projectConfiguration(projFile):
printAndOutput(projFile, '<ItemGroup Label="ProjectConfigurations">')
printAndOutput(projFile, '<ProjectConfiguration Include="Debug|Win32">')
printAndOutput(projFile, '<Configuration>Debug</Configuration>')
printAndOutput(projFile, '<Platform>Win32</Platform>')
printAndOutput(projFile, '</ProjectConfiguration>')
printAndOutput(projFile, '<ProjectConfiguration Include="Release|Win32">')
printAndOutput(projFile, '<Configuration>Release</Configuration>')
printAndOutput(projFile, '<Platform>Win32</Platform>')
printAndOutput(projFile, '</ProjectConfiguration>')
printAndOutput(projFile, '</ItemGroup>')
# Requires a GUID of form: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12 chars & ints)
def globalsProperty(projFile, name):
printAndOutput(projFile, '<PropertyGroup Label="Globals">')
printAndOutput(projFile, '<ProjectGuid>{' + ProjectGUID() + '}</ProjectGuid>')
printAndOutput(projFile, '<Keyword>Win32Proj</Keyword>')
printAndOutput(projFile, '<RootNamespace>' + name + '</RootNamespace>')
printAndOutput(projFile, '</PropertyGroup>')
# I'm not sure how this is generated, but it looks like each VS Project has a unique identifier. This function should try to generate one.
# Could just use rand on each char in the sequence from 0-F
# Format is 8-4-4-4-12 hexadecimal characters (0-9A-F)
def ProjectGUID():
return 'FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF'
# May need to look in build.lst to see what type to buiild to - dll, app, etc.
def conditionProperty(projFile):
if (includeDebug):
printAndOutput(projFile, '<PropertyGroup Condition="\'$(Configuration)|$(Platform)\'==\'Debug|Win32\'" Label="Configuration">')
else:
printAndOutput(projFile, '<PropertyGroup Condition="\'$(Configuration)|$(Platform)\'==\'Release|Win32\'" Label="Configuration">')
printAndOutput(projFile, '<ConfigurationType>Application</ConfigurationType>')
printAndOutput(projFile, '<UseDebugLibraries>false</UseDebugLibraries>')
printAndOutput(projFile, '<PlatformToolset>v110</PlatformToolset>') # Looks like this is where we can change the VS version - v110 is VS2012
printAndOutput(projFile, '<WholeProgramOptimization>true</WholeProgramOptimization>')
printAndOutput(projFile, '<CharacterSet>NotSet</CharacterSet>')
printAndOutput(projFile, '</PropertyGroup>')
def importProject(projFile, proj):
printAndOutput(projFile, '<Import Project="$(VCTargetsPath)\Microsoft.Cpp.' + proj + '" />')
def extensionSettings(projFile):
printAndOutput(projFile, '<ImportGroup Label="ExtensionSettings">')
printAndOutput(projFile, '</ImportGroup>')
def propertySheets(projFile):
if (includeDebug):
printAndOutput(projFile, '<ImportGroup Label="PropertySheets" Condition="\'$(Configuration)|$(Platform)\'==\'Debug|Win32\'">')
else:
printAndOutput(projFile, '<ImportGroup Label="PropertySheets" Condition="\'$(Configuration)|$(Platform)\'==\'Release|Win32\'">')
printAndOutput(projFile, '<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists(\'$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props\')"')
printAndOutput(projFile, 'Label="LocalAppDataPlatform" />')
printAndOutput(projFile, '</ImportGroup>')
def userMacros(projFile):
printAndOutput(projFile, '<PropertyGroup Label="UserMacros" />')
def libPropertyGroup(projFile, mainPath, projName):
if (includeDebug):
printAndOutput(projFile, '<PropertyGroup Condition="\'$(Configuration)|$(Platform)\'==\'Debug|Win32\'">')
printAndOutput(projFile, '<LinkIncremental>true</LinkIncremental>')
printAndOutput(projFile, '<LibraryPath>' + mainPath + '\\solver\\410\\wntmsci12.pro\\lib;$(LibraryPath)</LibraryPath>') # Make sure this is actual path!
else:
printAndOutput(projFile, '<PropertyGroup Condition="\'$(Configuration)|$(Platform)\'==\'Release|Win32\'">')
printAndOutput(projFile, '<LinkIncremental>false</LinkIncremental>')
printAndOutput(projFile, '<OutDir>' + mainPath + '\\solver\\410\\wntmsci12.pro\\bin\\</OutDir>')
printAndOutput(projFile, '<TargetName>' + projName + '</TargetName>')
printAndOutput(projFile, '</PropertyGroup>')
def itemDefinitionGroup(projFile, mainPath, modulePath):
if (includeDebug):
printAndOutput(projFile, '<ItemDefinitionGroup Condition="\'$(Configuration)|$(Platform)\'==\'Debug|Win32\'">')
else:
printAndOutput(projFile, '<ItemDefinitionGroup Condition="\'$(Configuration)|$(Platform)\'==\'Release|Win32\'">')
clCompile(projFile, mainPath, modulePath)
link(projFile, mainPath)
printAndOutput(projFile, '</ItemDefinitionGroup>')
def clCompile(projFile, mainPath, modulePath):
printAndOutput(projFile, '<ClCompile>')
if (includeDebug):
printAndOutput(projFile, '<WarningLevel>Level3</WarningLevel>')
printAndOutput(projFile, '<Optimization>Disabled</Optimization>')
printAndOutput(projFile, '<PrecompiledHeader>')
printAndOutput(projFile, '</PrecompiledHeader>')
printAndOutput(projFile, '<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;WNT;CPPU_ENV;%(PreprocessorDefinitions)')
printAndOutput(projFile, '</PreprocessorDefinitions>') # Important, may need editing
else:
printAndOutput(projFile, '<WarningLevel>Level3</WarningLevel>')
printAndOutput(projFile, '<Optimization>MaxSpeed</Optimization>')
printAndOutput(projFile, '<FunctionLevelLinking>true</FunctionLevelLinking>')
printAndOutput(projFile, '<IntrinsicFunctions>true</IntrinsicFunctions>')
additionalIncludeDirectories(projFile, modulePath) # Debug & non are equivalent
printAndOutput(projFile, '</ClCompile>')
def link(projFile, mainPath):
printAndOutput(projFile, '<Link>')
if (includeDebug):
printAndOutput(projFile, '<SubSystem>Windows</SubSystem>')
printAndOutput(projFile, '<GenerateDebugInformation>true</GenerateDebugInformation>')
printAndOutput(projFile, '<AdditionalLibraryDirectories>' + mainPath + '<\\solver\\410\\wntmscipro12.pro\\lib;')
printAndOutput(projFile, '%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>')
else:
printAndOutput(projFile, '<GenerateDebugInformation>true</GenerateDebugInformation>')
printAndOutput(projFile, '<EnableCOMDATFolding>true</EnableCOMDATFolding>')
printAndOutput(projFile, '<OptimizeReferences>true</OptimizeReferences>')
additionalDependencies(projFile, mainPath)
printAndOutput(projFile, '<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>')
printAndOutput(projFile, '<IgnoreSpecificDefaultLibraries>LIBCMT</IgnoreSpecificDefaultLibraries>')
printAndOutput(projFile, '</Link>')
if (includeDebug):
printAndOutput('<Lib><AdditionalDependencies>sfx.lib;%(AdditionalDependencies)</AdditionalDependencies></Lib>') # Doubt this is needed
# Not sure which directories this will need to include
def additionalIncludeDirectories(projFile, modulePath):
printAndOutput(projFile, '<AdditionalIncludeDirectories>')
printAndOutput(projFile, modulePath + '\\inc\\pch;')
printAndOutput(projFile, modulePath + '\\source')
# hwpfilter\win32\hwpfilter\hwpfilter - shouldn't be needed
cwd = modulePath.rpartition('\\')[0]
printAndOutput(projFile, cwd + '\\solver\\410\\wntmsci12.pro\\inc')
printAndOutput(projFile, cwd + '\\solver\\410\\wntmsci12.pro\inc\\external')
printAndOutput(projFile, cwd + '\\solver\\410\\wntmsci12.pro\\inc\\offuh')
printAndOutput(projFile, '%(AdditionalIncludeDirectories)')
printAndOutput(projFile, '</AdditionalIncludeDirectories>')
def additionalDependencies(projFile, mainPath):
printAndOutput(projFile, '<AdditionalDependencies>')
loadLibFiles(projFile, mainPath)
#loadFileTypes(libExtensions, mainPath, '', projFile, 2) # Loads lib files
printAndOutput(projFile, '%(AdditionalDependencies)')
printAndOutput(projFile, '</AdditionalDependencies>')
def headerFiles(projFile, curDir):
printAndOutput(projFile, '<ItemGroup>')
loadFileTypes(headerExtensions, curDir, '', projFile, 0)
printAndOutput(projFile, '</ItemGroup>')
def sourceFiles(projFile, curDir):
printAndOutput(projFile, '<ItemGroup>')
loadFileTypes(sourceExtensions, curDir, '', projFile, 1)
printAndOutput(projFile, '</ItemGroup>')
def printAndOutput(outputFile, out):
print (out)
outputFile.write(out + '\r\n')
def loadLibFiles(projFile, mainPath):
path = mainPath + '\\solver\\410\\wntmsci12.pro\\lib\\'
for file in os.listdir(path):
fileExt = file.split('.') # index 0 is name, 1 is ext
if (len(fileExt) > 1 and fileExt[1] in libExtensions):
printAndOutput(projFile, file + ';')
def loadFileTypes(extensions, path, matchName, projFile, extType):
for root, dirs, files in os.walk(path):
for name in files:
tempName = name.rsplit('\\',1)
p = os.path.join(root,name)
if checkFilename(tempName[len(tempName)-1], matchName, extensions):
if (extType == 0): # 0 is headers
printAndOutput(projFile, '<ClInclude Include="..\\..\\..\\' + p.replace(path+"\\","") + '" />')
elif (extType == 1): # 1 is sources
printAndOutput(projFile, '<ClCompile Include="..\\..\\..\\' + p.replace(path+"\\","") + '" />')
else: # 2/otherwise is libs
printAndOutput(projFile, name + ';') # Is lib file
def checkFilename(inputName, names, extensions):
temp = inputName.split(".")
if temp[0] in names:
return True
elif (len(temp) > 1 and temp[1] in extensions):
return True
else:
return False
def directories(path):
for file in os.listdir(path):
if os.path.isdir(os.path.join(path, file)):
yield file
def runEveryFolder(startDir):
try:
os.mkdir(startDir + '\\' + outputDir)
except:
pass
for d in directories(startDir):
print ('######################')
main(os.path.join(startDir + '\\' + d),startDir)
print ('######################')
runEveryFolder(os.getcwd())