Files
PhysX4.1/physx/buildtools/cmake_generate_projects.py
2025-11-28 23:13:44 +05:30

419 lines
19 KiB
Python

import sys
import os
import glob
import os.path
import shutil
import subprocess
import xml.etree.ElementTree
def packmanExt():
if sys.platform == 'win32':
return 'cmd'
return 'sh'
def cmakeExt():
if sys.platform == 'win32':
return '.exe'
return ''
def filterPreset(presetName):
winPresetFilter = ['win','uwp','ps4','switch','xboxone','android','crosscompile','xboxseriesx']
if sys.platform == 'win32':
if any(presetName.find(elem) != -1 for elem in winPresetFilter):
return True
else:
if all(presetName.find(elem) == -1 for elem in winPresetFilter):
return True
return False
def noPresetProvided():
global input
print('Preset parameter required, available presets:')
presetfiles = []
for file in glob.glob("buildtools/presets/*.xml"):
presetfiles.append(file)
if len(presetfiles) == 0:
for file in glob.glob("buildtools/presets/public/*.xml"):
presetfiles.append(file)
counter = 0
presetList = []
for preset in presetfiles:
if filterPreset(preset):
presetXml = xml.etree.ElementTree.parse(preset).getroot()
if(preset.find('user') == -1):
print('(' + str(counter) + ') ' + presetXml.get('name') +
' <--- ' + presetXml.get('comment'))
presetList.append(presetXml.get('name'))
else:
print('(' + str(counter) + ') ' + presetXml.get('name') +
'.user <--- ' + presetXml.get('comment'))
presetList.append(presetXml.get('name') + '.user')
counter = counter + 1
# Fix Python 2.x.
try:
input = raw_input
except NameError:
pass
mode = int(input('Enter preset number: '))
print('Running generate_projects.bat ' + presetList[mode])
return presetList[mode]
class CMakePreset:
presetName = ''
targetPlatform = ''
compiler = ''
cmakeSwitches = []
cmakeParams = []
def __init__(self, presetName):
xmlPath = "buildtools/presets/"+presetName+'.xml'
if os.path.isfile(xmlPath):
print('Using preset xml: '+xmlPath)
else:
xmlPath = "buildtools/presets/public/"+presetName+'.xml'
if os.path.isfile(xmlPath):
print('Using preset xml: '+xmlPath)
else:
print('Preset xml file: '+xmlPath+' not found')
exit()
# get the xml
presetNode = xml.etree.ElementTree.parse(xmlPath).getroot()
self.presetName = presetNode.attrib['name']
for platform in presetNode.findall('platform'):
self.targetPlatform = platform.attrib['targetPlatform']
self.compiler = platform.attrib['compiler']
print('Target platform: ' + self.targetPlatform +
' using compiler: ' + self.compiler)
for cmakeSwitch in presetNode.find('CMakeSwitches'):
cmSwitch = '-D' + \
cmakeSwitch.attrib['name'] + '=' + \
cmakeSwitch.attrib['value'].upper()
self.cmakeSwitches.append(cmSwitch)
for cmakeParam in presetNode.find('CMakeParams'):
if cmakeParam.attrib['name'] == 'CMAKE_INSTALL_PREFIX' or cmakeParam.attrib['name'] == 'PX_OUTPUT_LIB_DIR' or cmakeParam.attrib['name'] == 'PX_OUTPUT_EXE_DIR' or cmakeParam.attrib['name'] == 'PX_OUTPUT_DLL_DIR':
cmParam = '-D' + cmakeParam.attrib['name'] + '=\"' + \
os.environ['PHYSX_ROOT_DIR'] + '/' + \
cmakeParam.attrib['value'] + '\"'
elif cmakeParam.attrib['name'] == 'ANDROID_ABI':
cmParam = '-D' + \
cmakeParam.attrib['name'] + '=\"' + \
cmakeParam.attrib['value'] + '\"'
else:
cmParam = '-D' + \
cmakeParam.attrib['name'] + '=' + \
cmakeParam.attrib['value']
self.cmakeParams.append(cmParam)
pass
def isMultiConfigPlatform(self):
if self.targetPlatform == 'linux':
return False
elif self.targetPlatform == 'linuxAarch64':
return False
elif self.targetPlatform == 'android':
return False
return True
def getCMakeSwitches(self):
outString = ''
for cmakeSwitch in self.cmakeSwitches:
outString = outString + ' ' + cmakeSwitch
if cmakeSwitch.find('PX_GENERATE_GPU_PROJECTS') != -1:
if os.environ.get('PM_CUDA_PATH') is not None:
outString = outString + ' -DCUDA_TOOLKIT_ROOT_DIR=' + \
os.environ['PM_CUDA_PATH']
if self.compiler == 'vc15':
print('VS15CL:' + os.environ['VS150CLPATH'])
outString = outString + ' -DCUDA_HOST_COMPILER=' + \
os.environ['VS150CLPATH']
if self.compiler == 'vc16':
print('VS16CL:' + os.environ['VS160CLPATH'])
outString = outString + ' -DCUDA_HOST_COMPILER=' + \
os.environ['VS160CLPATH']
return outString
def getCMakeParams(self):
outString = ''
for cmakeParam in self.cmakeParams:
outString = outString + ' ' + cmakeParam
return outString
def getPlatformCMakeParams(self):
outString = ' '
if self.compiler == 'vc12':
outString = outString + '-G \"Visual Studio 12 2013\"'
elif self.compiler == 'vc14':
outString = outString + '-G \"Visual Studio 14 2015\"'
elif self.compiler == 'vc15':
outString = outString + '-G \"Visual Studio 15 2017\"'
elif self.compiler == 'vc16':
outString = outString + '-G \"Visual Studio 16 2019\"'
elif self.compiler == 'xcode':
outString = outString + '-G Xcode'
elif self.targetPlatform == 'android':
outString = outString + '-G \"MinGW Makefiles\"'
elif self.targetPlatform == 'linux':
outString = outString + '-G \"Unix Makefiles\"'
elif self.targetPlatform == 'linuxAarch64':
outString = outString + '-G \"Unix Makefiles\"'
if self.targetPlatform == 'win32':
outString = outString + ' -AWin32'
outString = outString + ' -DTARGET_BUILD_PLATFORM=windows'
outString = outString + ' -DPX_OUTPUT_ARCH=x86'
return outString
elif self.targetPlatform == 'win64':
outString = outString + ' -Ax64'
outString = outString + ' -DTARGET_BUILD_PLATFORM=windows'
outString = outString + ' -DPX_OUTPUT_ARCH=x86'
return outString
elif self.targetPlatform == 'uwp64':
outString = outString + ' -Ax64'
outString = outString + ' -DTARGET_BUILD_PLATFORM=uwp'
outString = outString + ' -DPX_OUTPUT_ARCH=x86'
outString = outString + ' -DCMAKE_SYSTEM_NAME=WindowsStore'
outString = outString + ' -DCMAKE_SYSTEM_VERSION=10.0'
return outString
elif self.targetPlatform == 'uwp32':
outString = outString + ' -AWin32'
outString = outString + ' -DTARGET_BUILD_PLATFORM=uwp'
outString = outString + ' -DPX_OUTPUT_ARCH=x86'
outString = outString + ' -DCMAKE_SYSTEM_NAME=WindowsStore'
outString = outString + ' -DCMAKE_SYSTEM_VERSION=10.0'
return outString
elif self.targetPlatform == 'uwparm32':
outString = outString + ' -AARM'
outString = outString + ' -DTARGET_BUILD_PLATFORM=uwp'
outString = outString + ' -DPX_OUTPUT_ARCH=arm'
outString = outString + ' -DCMAKE_SYSTEM_NAME=WindowsStore'
outString = outString + ' -DCMAKE_SYSTEM_VERSION=10.0'
return outString
elif self.targetPlatform == 'uwparm64':
outString = outString + ' -AARM64'
outString = outString + ' -DTARGET_BUILD_PLATFORM=uwp'
outString = outString + ' -DPX_OUTPUT_ARCH=arm'
outString = outString + ' -DCMAKE_SYSTEM_NAME=WindowsStore'
outString = outString + ' -DCMAKE_SYSTEM_VERSION=10.0'
return outString
elif self.targetPlatform == 'ps4':
outString = outString + ' -DTARGET_BUILD_PLATFORM=ps4'
outString = outString + ' -DCMAKE_TOOLCHAIN_FILE=' + \
os.environ['PM_CMakeModules_PATH'] + '/ps4/PS4Toolchain.txt'
outString = outString + ' -DCMAKE_GENERATOR_PLATFORM=ORBIS'
outString = outString + ' -DSUPPRESS_SUFFIX=ON'
return outString
elif self.targetPlatform == 'xboxone':
outString = outString + ' -DTARGET_BUILD_PLATFORM=xboxone'
if self.compiler == 'vc14':
outString = outString + ' -DCMAKE_TOOLCHAIN_FILE=' + \
os.environ['PM_CMakeModules_PATH'] + \
'/xboxone/XboxOneToolchain.txt'
elif self.compiler == 'vc15':
outString = outString + ' -DCMAKE_TOOLCHAIN_FILE=' + \
os.environ['PM_CMakeModules_PATH'] + \
'/xboxone/XboxOneToolchainVC15.txt'
outString = outString + ' -T v141'
outString = outString + ' -DCMAKE_VS150PATH=' + \
os.environ['VS150PATH']
elif self.compiler == 'vc16':
# TODO: Toolchain file need to be created
outString = outString + ' -DCMAKE_TOOLCHAIN_FILE=' + \
os.environ['PM_CMakeModules_PATH'] + \
'/xboxone/XboxOneToolchainVC16.txt'
outString = outString + ' -T v142'
outString = outString + ' -DCMAKE_VS160PATH=' + \
os.environ['VS160PATH']
outString = outString + ' -DCMAKE_GENERATOR_PLATFORM=Durango'
outString = outString + ' -DSUPPRESS_SUFFIX=ON'
return outString
elif self.targetPlatform == 'xboxseriesx':
outString = outString + ' -DTARGET_BUILD_PLATFORM=xboxseriesx'
if self.compiler == 'vc15':
outString = outString + ' -DCMAKE_TOOLCHAIN_FILE=' + \
os.environ['PM_CMakeModules_PATH'] + \
'/xboxseriesx/XboxSeriesXToolchainVC15.txt'
outString = outString + ' -T v141'
outString = outString + ' -DCMAKE_VS150PATH=' + \
os.environ['VS150PATH']
if self.compiler == 'vc16':
# TODO: Toolchain file need to be created
outString = outString + ' -DCMAKE_TOOLCHAIN_FILE=' + \
os.environ['PM_CMakeModules_PATH'] + \
'/xboxseriesx/XboxSeriesXToolchainVC16.txt'
outString = outString + ' -T v142'
outString = outString + ' -DCMAKE_VS160PATH=' + \
os.environ['VS160PATH']
outString = outString + ' -DCMAKE_GENERATOR_PLATFORM=Gaming.Xbox.Scarlett.x64'
outString = outString + ' -DSUPPRESS_SUFFIX=ON'
return outString
elif self.targetPlatform == 'switch32':
outString = outString + ' -DTARGET_BUILD_PLATFORM=switch'
outString = outString + ' -DCMAKE_TOOLCHAIN_FILE=' + \
os.environ['PM_CMakeModules_PATH'] + \
'/switch/NX32Toolchain.txt'
outString = outString + ' -DCMAKE_GENERATOR_PLATFORM=NX32'
return outString
elif self.targetPlatform == 'switch64':
outString = outString + ' -DTARGET_BUILD_PLATFORM=switch'
outString = outString + ' -DCMAKE_TOOLCHAIN_FILE=' + \
os.environ['PM_CMakeModules_PATH'] + \
'/switch/NX64Toolchain.txt'
outString = outString + ' -DCMAKE_GENERATOR_PLATFORM=NX64'
return outString
elif self.targetPlatform == 'android':
outString = outString + ' -DTARGET_BUILD_PLATFORM=android'
outString = outString + ' -DCMAKE_TOOLCHAIN_FILE=' + \
os.environ['PM_CMakeModules_PATH'] + \
'/android/android.toolchain.cmake'
outString = outString + ' -DANDROID_STL=\"gnustl_static\"'
outString = outString + ' -DCM_ANDROID_FP=\"softfp\"'
if os.environ.get('PM_AndroidNDK_PATH') is None:
print('Please provide path to android NDK in variable PM_AndroidNDK_PATH.')
exit(-1)
else:
outString = outString + ' -DANDROID_NDK=' + \
os.environ['PM_AndroidNDK_PATH']
outString = outString + ' -DCMAKE_MAKE_PROGRAM=\"' + \
os.environ['PM_AndroidNDK_PATH'] + '\\prebuilt\\windows\\bin\\make.exe\"'
return outString
elif self.targetPlatform == 'linux':
outString = outString + ' -DTARGET_BUILD_PLATFORM=linux'
outString = outString + ' -DPX_OUTPUT_ARCH=x86'
if self.compiler == 'clang-crosscompile':
outString = outString + ' -DCMAKE_TOOLCHAIN_FILE=' + \
os.environ['PM_CMakeModules_PATH'] + \
'/linux/LinuxCrossToolchain.x86_64-unknown-linux-gnu.cmake'
elif self.compiler == 'clang':
if os.environ.get('PM_clang_PATH') is not None:
outString = outString + ' -DCMAKE_C_COMPILER=' + \
os.environ['PM_clang_PATH'] + '/bin/clang'
outString = outString + ' -DCMAKE_CXX_COMPILER=' + \
os.environ['PM_clang_PATH'] + '/bin/clang++'
else:
outString = outString + ' -DCMAKE_C_COMPILER=clang'
outString = outString + ' -DCMAKE_CXX_COMPILER=clang++'
return outString
elif self.targetPlatform == 'linuxAarch64':
outString = outString + ' -DTARGET_BUILD_PLATFORM=linux'
outString = outString + ' -DPX_OUTPUT_ARCH=arm'
if self.compiler == 'clang-crosscompile':
outString = outString + ' -DCMAKE_TOOLCHAIN_FILE=' + \
os.environ['PM_CMakeModules_PATH'] + \
'/linux/LinuxCrossToolchain.aarch64-unknown-linux-gnueabihf.cmake'
elif self.compiler == 'gcc':
outString = outString + ' -DCMAKE_TOOLCHAIN_FILE=\"' + \
os.environ['PM_CMakeModules_PATH'] + \
'/linux/LinuxAarch64.cmake\"'
return outString
elif self.targetPlatform == 'mac64':
outString = outString + ' -DTARGET_BUILD_PLATFORM=mac'
outString = outString + ' -DPX_OUTPUT_ARCH=x86'
return outString
elif self.targetPlatform == 'ios64':
outString = outString + ' -DTARGET_BUILD_PLATFORM=ios'
outString = outString + ' -DCMAKE_TOOLCHAIN_FILE=\"' + \
os.environ['PM_CMakeModules_PATH'] + '/ios/ios.toolchain.cmake\"'
outString = outString + ' -DPX_OUTPUT_ARCH=arm'
return outString
return ''
def getCommonParams():
outString = '--no-warn-unused-cli'
outString = outString + ' -DCMAKE_PREFIX_PATH=\"' + os.environ['PM_PATHS'] + '\"'
outString = outString + ' -DPHYSX_ROOT_DIR=\"' + \
os.environ['PHYSX_ROOT_DIR'] + '\"'
outString = outString + ' -DPX_OUTPUT_LIB_DIR=\"' + \
os.environ['PHYSX_ROOT_DIR'] + '\"'
outString = outString + ' -DPX_OUTPUT_BIN_DIR=\"' + \
os.environ['PHYSX_ROOT_DIR'] + '\"'
if os.environ.get('GENERATE_SOURCE_DISTRO') == '1':
outString = outString + ' -DPX_GENERATE_SOURCE_DISTRO=1'
return outString
def cleanupCompilerDir(compilerDirName):
if os.path.exists(compilerDirName):
if sys.platform == 'win32':
os.system('rmdir /S /Q ' + compilerDirName)
else:
shutil.rmtree(compilerDirName, True)
if os.path.exists(compilerDirName) == False:
os.makedirs(compilerDirName)
def presetProvided(pName):
parsedPreset = CMakePreset(pName)
print('PM_CMakeModules_PATH: ' + os.environ['PM_CMakeModules_PATH'])
print('PM_PATHS: ' + os.environ['PM_PATHS'])
if os.environ.get('PM_cmake_PATH') is not None:
cmakeExec = os.environ['PM_cmake_PATH'] + '/bin/cmake' + cmakeExt()
else:
cmakeExec = 'cmake' + cmakeExt()
print('Cmake: ' + cmakeExec)
# gather cmake parameters
cmakeParams = parsedPreset.getPlatformCMakeParams()
cmakeParams = cmakeParams + ' ' + getCommonParams()
cmakeParams = cmakeParams + ' ' + parsedPreset.getCMakeSwitches()
cmakeParams = cmakeParams + ' ' + parsedPreset.getCMakeParams()
# print(cmakeParams)
if os.path.isfile(os.environ['PHYSX_ROOT_DIR'] + '/compiler/internal/CMakeLists.txt'):
cmakeMasterDir = 'internal'
else:
cmakeMasterDir = 'public'
if parsedPreset.isMultiConfigPlatform():
# cleanup and create output directory
outputDir = os.path.join('compiler', parsedPreset.presetName)
cleanupCompilerDir(outputDir)
# run the cmake script
#print('Cmake params:' + cmakeParams)
os.chdir(os.path.join(os.environ['PHYSX_ROOT_DIR'], outputDir))
os.system(cmakeExec + ' \"' +
os.environ['PHYSX_ROOT_DIR'] + '/compiler/' + cmakeMasterDir + '\"' + cmakeParams)
os.chdir(os.environ['PHYSX_ROOT_DIR'])
else:
configs = ['debug', 'checked', 'profile', 'release']
for config in configs:
# cleanup and create output directory
outputDir = os.path.join('compiler', parsedPreset.presetName + '-' + config)
cleanupCompilerDir(outputDir)
# run the cmake script
#print('Cmake params:' + cmakeParams)
os.chdir(os.path.join(os.environ['PHYSX_ROOT_DIR'], outputDir))
# print(cmakeExec + ' \"' + os.environ['PHYSX_ROOT_DIR'] + '/compiler/' + cmakeMasterDir + '\"' + cmakeParams + ' -DCMAKE_BUILD_TYPE=' + config)
os.system(cmakeExec + ' \"' + os.environ['PHYSX_ROOT_DIR'] + '/compiler/' +
cmakeMasterDir + '\"' + cmakeParams + ' -DCMAKE_BUILD_TYPE=' + config)
os.chdir(os.environ['PHYSX_ROOT_DIR'])
pass
def main():
if len(sys.argv) != 2:
presetName = noPresetProvided()
os.chdir(os.environ['PHYSX_ROOT_DIR'])
if sys.platform == 'win32':
os.system('generate_projects.bat ' + presetName)
else:
os.system('./generate_projects.sh ' + presetName)
else:
presetName = sys.argv[1]
if filterPreset(presetName):
presetProvided(presetName)
else:
print('Preset not supported on this build platform.')
main()