build_package_image.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. # Copyright (c) Contributors to the Open 3D Engine Project.
  2. # For complete copyright and license terms please see the LICENSE at the root
  3. # of this distribution.
  4. #
  5. # SPDX-License-Identifier: Apache-2.0 OR MIT
  6. #
  7. #
  8. import argparse
  9. from pathlib import Path
  10. import re
  11. import shutil
  12. from tempfile import TemporaryDirectory
  13. import sys
  14. sys.path.append(str(Path(__file__).parent.parent.parent / 'Scripts'))
  15. from builders.vcpkgbuilder import VcpkgBuilder
  16. import builders.monkeypatch_tempdir_cleanup
  17. def regex_to_remove(platform_name: str):
  18. """
  19. Get the regular expression for files and sub-folders to remove.
  20. :param platform_name: Name of the platform.
  21. :return: Regular expression for files and sub-folders to remove.
  22. """
  23. regex_map = {
  24. 'windows':
  25. '^(?:.*_|.*\\\\)?(?:ios|mac|android|linux|fuchsia|non|x86|test|testing|vcpkg|BUILD_INFO|CONTROL)(?:_.*)?(?:\\.h)?$'
  26. }
  27. return regex_map.get(platform_name, '.*')
  28. def remove_files_by_regex(package_dir: Path, regex: str):
  29. """
  30. Remove files and sub-folders from the package by an regular expression.
  31. :param package_dir: Path to the package directory.
  32. :param regex: Regular expression for the files and sub-folders to remove.
  33. """
  34. pattern = re.compile(regex)
  35. for item in package_dir.glob('**/*'):
  36. if re.search(pattern, item.name) and item.exists():
  37. if item.is_file():
  38. item.unlink()
  39. else:
  40. shutil.rmtree(item)
  41. def main():
  42. parser = argparse.ArgumentParser(description='Builds this package')
  43. parser.add_argument(
  44. '--platform-name',
  45. choices=['windows', 'android', 'mac', 'ios', 'linux'],
  46. default=VcpkgBuilder.defaultPackagePlatformName(),
  47. )
  48. args = parser.parse_args()
  49. package_system_dir = Path(__file__).resolve().parents[1]
  50. crashpad_package_source_dir = package_system_dir / 'Crashpad'
  51. output_dir = package_system_dir / f'Crashpad-{args.platform_name}'
  52. crashpad_patch = crashpad_package_source_dir / 'add_o3de_handler_extensions.patch'
  53. cmake_find_file = crashpad_package_source_dir / f'FindCrashpad_{args.platform_name}.cmake.template'
  54. if not cmake_find_file.exists():
  55. cmake_find_file = crashpad_package_source_dir / 'FindCrashpad.cmake.template'
  56. cmake_find_file_template = cmake_find_file.open().read()
  57. with TemporaryDirectory() as tempdir:
  58. tempdir = Path(tempdir)
  59. builder = VcpkgBuilder('Crashpad', 'crashpad', tempdir, args.platform_name, static=False)
  60. builder.cloneVcpkg('3639676313a3e8b6fe1e94b9e7917b71d32511e3')
  61. builder.bootstrap()
  62. builder.patch(crashpad_patch)
  63. builder.build()
  64. builder.copyBuildOutputTo(
  65. output_dir,
  66. extraFiles={
  67. Path(f'{builder.vcpkgDir}/buildtrees/{builder.portName}/{builder.triplet}-rel/gen/build/chromeos_buildflags.h'):
  68. Path(f'{output_dir}/{builder.packageName}/include/{builder.portName}/mini_chromium/build/'),
  69. Path(f'{builder.vcpkgDir}/ports/{builder.portName}/o3de_handler_extensions.patch'):
  70. Path(f'{output_dir}/{builder.packageName}/share/{builder.portName}/')
  71. })
  72. port_dir = output_dir / builder.packageName / 'include' / builder.portName
  73. package_info_list = [
  74. {
  75. 'dir': output_dir,
  76. 'settings': {
  77. 'PackageName': f'Crashpad-0.8.0-rev1-{args.platform_name}',
  78. 'URL': 'https://chromium.googlesource.com/crashpad/crashpad/+/master/README.md',
  79. 'License': 'Apache-2.0',
  80. 'LicenseFile': f'{builder.packageName}/share/{builder.portName}/copyright'
  81. }
  82. },
  83. {
  84. 'dir': port_dir / 'getopt',
  85. 'settings': {
  86. 'PackageName': 'getopt',
  87. 'URL': 'https://sourceware.org/legacy-ml/newlib/2005/msg00758.html',
  88. 'License': 'custom',
  89. 'LicenseFile': 'LICENSE'
  90. }
  91. },
  92. {
  93. 'dir': port_dir / 'mini_chromium' / 'base' / 'third_party' / 'icu',
  94. 'settings': {
  95. 'PackageName': 'ICU',
  96. 'URL': 'http://site.icu-project.org/',
  97. 'License': 'Unicode-DFS-2016',
  98. 'LicenseFile': 'LICENSE'
  99. }
  100. },
  101. {
  102. 'dir': port_dir / 'mini_chromium',
  103. 'settings': {
  104. 'PackageName': 'mini_chromium',
  105. 'URL': 'https://chromium.googlesource.com/chromium/mini_chromium/',
  106. 'License': 'BSD-3-Clause',
  107. 'LicenseFile': 'LICENSE'
  108. }
  109. },
  110. {
  111. 'dir': port_dir / 'zlib',
  112. 'settings': {
  113. 'PackageName': 'zlib',
  114. 'URL': 'https://zlib.net/',
  115. 'License': 'Zlib',
  116. 'LicenseFile': 'LICENSE'
  117. }
  118. }
  119. ]
  120. for package_info in package_info_list:
  121. builder.writePackageInfoFile(
  122. package_info.get('dir', ''),
  123. settings=package_info.get('settings', {})
  124. )
  125. builder.writeCMakeFindFile(
  126. output_dir,
  127. template=cmake_find_file_template
  128. )
  129. remove_files_by_regex(
  130. output_dir,
  131. regex_to_remove(args.platform_name)
  132. )
  133. if __name__ == '__main__':
  134. main()