|
15 | 15 | # ----------------------------------------------------------------------------
|
16 | 16 |
|
17 | 17 | import os.path
|
| 18 | +import re |
18 | 19 |
|
19 | 20 | from build_swift.build_swift import cache_utils
|
20 | 21 |
|
21 | 22 | from . import product
|
22 | 23 | from .. import shell
|
| 24 | +from ..utils import log_time_in_scope |
23 | 25 |
|
24 | 26 |
|
25 | 27 | class Ninja(product.Product):
|
@@ -52,12 +54,48 @@ def ninja_bin_path(self):
|
52 | 54 | def build(self):
|
53 | 55 | if os.path.exists(self.ninja_bin_path):
|
54 | 56 | return
|
55 |
| - shell.call([ |
56 |
| - self.toolchain.cmake, |
57 |
| - "-S", self.source_dir, |
58 |
| - "-B", self.build_dir, |
59 |
| - "-DCMAKE_BUILD_TYPE=Release", |
60 |
| - "-DBUILD_TESTING=OFF", |
61 |
| - f"-DCMAKE_C_COMPILER={self.toolchain.cc}", |
62 |
| - f"-DCMAKE_CXX_COMPILER={self.toolchain.cxx}"]) |
63 |
| - shell.call([self.toolchain.cmake, "--build", self.build_dir]) |
| 57 | + |
| 58 | + print("--- Local Ninja Build ---") |
| 59 | + with log_time_in_scope('local ninja'): |
| 60 | + shell.call([ |
| 61 | + self.toolchain.cmake, |
| 62 | + "-S", self.source_dir, |
| 63 | + "-B", self.build_dir, |
| 64 | + "-DCMAKE_BUILD_TYPE=Release", |
| 65 | + "-DBUILD_TESTING=OFF", |
| 66 | + f"-DCMAKE_C_COMPILER={self.toolchain.cc}", |
| 67 | + f"-DCMAKE_CXX_COMPILER={self.toolchain.cxx}"]) |
| 68 | + shell.call([self.toolchain.cmake, "--build", self.build_dir]) |
| 69 | + |
| 70 | + |
| 71 | +def get_ninja_version(ninja_bin_path): |
| 72 | + if not ninja_bin_path or not os.path.isfile(ninja_bin_path): |
| 73 | + return |
| 74 | + ninja_version_pattern = re.compile(r'^(\d+)\.(\d+)\.(\d+).*') |
| 75 | + version = shell.capture([ninja_bin_path, "--version"], dry_run=False, |
| 76 | + echo=True, optional=True) |
| 77 | + m = ninja_version_pattern.match(version) |
| 78 | + if m is None: |
| 79 | + return |
| 80 | + (major, minor, patch) = map(int, m.groups()) |
| 81 | + return (major, minor, patch) |
| 82 | + |
| 83 | + |
| 84 | +def get_ninja_path(toolchain, args, workspace): |
| 85 | + min_ninja_version = (1, 8, 2) |
| 86 | + |
| 87 | + built_ninja_path = os.path.join(workspace.build_dir('build', 'ninja'), 'ninja') |
| 88 | + built_ninja_version = get_ninja_version(built_ninja_path) |
| 89 | + if built_ninja_version and min_ninja_version <= built_ninja_version: |
| 90 | + return built_ninja_path |
| 91 | + |
| 92 | + toolchain_ninja_version = get_ninja_version(toolchain.ninja) |
| 93 | + if toolchain_ninja_version and min_ninja_version <= toolchain_ninja_version: |
| 94 | + return toolchain.ninja |
| 95 | + |
| 96 | + # Build ninja from source |
| 97 | + ninja_build = Ninja.new_builder(args=args, |
| 98 | + toolchain=toolchain, |
| 99 | + workspace=workspace) |
| 100 | + ninja_build.build() |
| 101 | + return ninja_build.ninja_bin_path |
0 commit comments