build.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. ##############################################################################
  2. # Packaging script for building and packaging gameplay-deps-<platform>.zip
  3. ##############################################################################
  4. import os
  5. import glob
  6. import platform
  7. import subprocess
  8. import shutil
  9. import sys
  10. import time
  11. import zipfile
  12. from pathlib import Path
  13. from distutils.dir_util import copy_tree
  14. # constants
  15. ##############################################################################
  16. CMAKE_WINDOWS_GENERATOR = "Visual Studio 16 2019"
  17. CMAKE_UNIX_GENERATOR = "Unix Makefiles"
  18. BUILD_FOLDER = "_build"
  19. PACKAGE_FOLDER = "_package"
  20. TOOLS_FOLDER = "_tools"
  21. ZIP_FOLDER = "_zip"
  22. # platform-architecture
  23. ##############################################################################
  24. platform_arch = ""
  25. if sys.platform == "win32":
  26. platform_arch = "windows-x86_64"
  27. elif sys.platform == "darwin":
  28. platform_arch = "macos-x86_64"
  29. else:
  30. platform_arch = "linux-x86_64"
  31. # function utils
  32. ##############################################################################
  33. def clear_dir(dir_path):
  34. if os.path.exists(dir_path):
  35. shutil.rmtree(dir_path, ignore_errors=True)
  36. path = Path(dir_path)
  37. path.mkdir(parents=True)
  38. def init_vsvars():
  39. vswhere_path = r"%ProgramFiles(x86)%/Microsoft Visual Studio/Installer/vswhere.exe"
  40. vswhere_path = os.path.expandvars(vswhere_path)
  41. if not os.path.exists(vswhere_path):
  42. raise EnvironmentError("vswhere.exe not found at: %s", vswhere_path)
  43. vs_path = os.popen('"{}" -latest -property installationPath'.format(vswhere_path)).read().rstrip()
  44. vsvars_path = os.path.join(vs_path, "VC\\Auxiliary\\Build\\vcvars64.bat")
  45. output = os.popen('"{}" && set'.format(vsvars_path)).read()
  46. for line in output.splitlines():
  47. pair = line.split("=", 1)
  48. if(len(pair) >= 2):
  49. os.environ[pair[0]] = pair[1]
  50. def cmake_generator_args(user_args):
  51. if sys.platform == "win32":
  52. return f"-G \"{CMAKE_WINDOWS_GENERATOR}\"{user_args}"
  53. else:
  54. return f"-G \"{CMAKE_UNIX_GENERATOR}\"{user_args}"
  55. def cmake_build(dep_folder, generator_args, solution, **kwargs):
  56. project_dir = os.path.join(os.getcwd(), dep_folder)
  57. build_dir = os.path.join(project_dir, BUILD_FOLDER)
  58. clear_dir(build_dir)
  59. cmake_proc = subprocess.Popen(f"cmake {generator_args} ..", cwd=build_dir, shell=True)
  60. cmake_proc.wait()
  61. caller_dir = os.getcwd()
  62. os.chdir(build_dir)
  63. if sys.platform == "win32":
  64. init_vsvars()
  65. cmd = f"msbuild {solution}.sln /property:Configuration=Debug"
  66. subprocess.run(cmd)
  67. cmd = f"msbuild {solution}.sln /property:Configuration=Release"
  68. subprocess.run(cmd)
  69. else:
  70. cmd = f"make"
  71. subprocess.run(cmd)
  72. os.chdir(caller_dir)
  73. def copy_files(src_dir, dst_dir, match_exp):
  74. clear_dir(dst_dir)
  75. for filename in glob.glob(os.path.join(src_dir, match_exp)):
  76. shutil.copy(filename, dst_dir)
  77. def remove_files(src_dir, match_exp):
  78. for filename in glob.glob(os.path.join(src_dir, match_exp)):
  79. os.remove(filename)
  80. def create_package(src_dir, dst_file):
  81. package = zipfile.ZipFile(dst_file, 'w', zipfile.ZIP_DEFLATED)
  82. for root, dirs, files in os.walk(src_dir):
  83. for file in files:
  84. full_path = os.path.join(root, file)
  85. package.write(full_path, os.path.relpath(full_path, src_dir))
  86. package.close()
  87. # package outputs
  88. ##############################################################################
  89. package_dir = os.path.join(os.getcwd(), PACKAGE_FOLDER)
  90. clear_dir(package_dir)
  91. # pybind11
  92. ##############################################################################
  93. dep_folder = "pybind11-2.6.2"
  94. print(f"Preparing {dep_folder}...")
  95. dst_dir = os.path.join(package_dir, "pybind11")
  96. src_include_dir = os.path.join(dep_folder, "include", "pybind11")
  97. dst_include_dir = os.path.join(dst_dir, "include", "pybind11")
  98. copy_tree(src_include_dir, dst_include_dir)
  99. # spdlog
  100. ##############################################################################
  101. dep_folder = "spdlog-1.8.2"
  102. print(f"Preparing {dep_folder}...")
  103. dst_dir = os.path.join(package_dir, "spdlog")
  104. src_include_dir = os.path.join(dep_folder, "include", "spdlog")
  105. dst_include_dir = os.path.join(dst_dir, "include", "spdlog")
  106. copy_tree(src_include_dir, dst_include_dir)
  107. # glm
  108. ##############################################################################
  109. dep_folder = "glm-0.9.9.8"
  110. print(f"Preparing {dep_folder}...")
  111. src_include_dir = os.path.join(dep_folder, "glm")
  112. dst_include_dir = os.path.join(package_dir, "glm", "include", "glm")
  113. copy_tree(src_include_dir, dst_include_dir)
  114. remove_files(dst_include_dir, "*.txt")
  115. # cpptoml
  116. ##############################################################################
  117. dep_folder = "cpptoml-0.1.1"
  118. print(f"Preparing {dep_folder}...")
  119. src_include_dir = os.path.join(dep_folder, "include")
  120. dst_include_dir = os.path.join(package_dir, "cpptoml", "include")
  121. copy_tree(src_include_dir, dst_include_dir)
  122. # stb
  123. ##############################################################################
  124. dep_folder = "stb-b42009b"
  125. print(f"Preparing {dep_folder}...")
  126. src_include_dir = os.path.join(dep_folder)
  127. dst_include_dir = os.path.join(package_dir, "stb", "include")
  128. copy_files(src_include_dir, dst_include_dir,"*.h")
  129. # glfw
  130. ##############################################################################
  131. dep_folder = "glfw-3.3.2"
  132. print(f"Preparing {dep_folder}...")
  133. dst_dir = os.path.join(package_dir, "glfw")
  134. cmake_build(dep_folder, cmake_generator_args(" -D USE_MSVC_RUNTIME_LIBRARY_DLL=FALSE"), "GLFW")
  135. src_include_dir = os.path.join(dep_folder, "include", "GLFW")
  136. dst_include_dir = os.path.join(dst_dir, "include", "GLFW")
  137. copy_files(src_include_dir, dst_include_dir, "*.*")
  138. dst_bin_dir = os.path.join(dst_dir, "bin", platform_arch)
  139. src_bin_dir = os.path.join(dep_folder, BUILD_FOLDER, "src")
  140. if sys.platform == "win32":
  141. copy_files(os.path.join(src_bin_dir, "Debug"), os.path.join(dst_bin_dir, "debug"), "*.*")
  142. copy_files(os.path.join(src_bin_dir, "Release"), os.path.join(dst_bin_dir, "release"), "*.*")
  143. else:
  144. copy_files(src_bin_dir, dst_bin_dir, "lib*.a")
  145. # freetype
  146. ##############################################################################
  147. dep_folder = "freetype-2.10.4"
  148. print(f"Preparing {dep_folder}...")
  149. dst_dir = os.path.join(package_dir, "freetype")
  150. cmake_build(dep_folder, cmake_generator_args(" -D DISABLE_FORCE_DEBUG_POSTFIX=TRUE"), "freetype")
  151. src_include_dir = os.path.join(dep_folder, "include")
  152. dst_include_dir = os.path.join(package_dir, "freetype", "include")
  153. copy_tree(src_include_dir, dst_include_dir)
  154. dst_bin_dir = os.path.join(dst_dir, "bin", platform_arch)
  155. src_bin_dir = os.path.join(dep_folder, BUILD_FOLDER)
  156. if sys.platform == "win32":
  157. copy_files(os.path.join(src_bin_dir, "Debug"), os.path.join(dst_bin_dir, "debug"), "*.*")
  158. copy_files(os.path.join(src_bin_dir, "Release"), os.path.join(dst_bin_dir, "release"), "*.*")
  159. else:
  160. copy_files(src_bin_dir, dst_bin_dir, "lib*.a")
  161. # imgui
  162. ##############################################################################
  163. dep_folder = "imgui-1.8.0"
  164. print(f"Preparing {dep_folder}...")
  165. src_dir = dep_folder
  166. dst_dir = os.path.join(package_dir, "imgui")
  167. copy_tree(src_dir, dst_dir)
  168. clear_dir(os.path.join(dst_dir, "examples"))
  169. clear_dir(os.path.join(dst_dir, "docs"))
  170. remove_files(dst_dir, "LICENSE.txt")
  171. # zip file
  172. ##############################################################################
  173. zip_dir = ZIP_FOLDER
  174. clear_dir(zip_dir)
  175. zip_filename = ""
  176. if sys.platform == "win32":
  177. zip_filename = "gameplay-deps-windows.zip"
  178. elif sys.platform == "darwin":
  179. zip_filename = "gameplay-deps-macos.zip"
  180. else:
  181. zip_filename = "gameplay-deps-linux.zip"
  182. print(f"Packaging {zip_filename}...")
  183. create_package(package_dir, os.path.join(zip_dir, zip_filename))