From adb9995987a0e17d15364c22a2dc7dd549a52815 Mon Sep 17 00:00:00 2001 From: rainy liu Date: Fri, 6 Feb 2026 17:44:07 +0800 Subject: [PATCH 1/2] feat(builder): add parallel build support for CMake Introduce `parallelJobs` and `parallelUseAllProcessors` fields to CMakeBuilder and RunCMakeBuilder to enable parallel compilation using CMake's `--parallel` flag. The feature is automatically enabled only when the detected CMake version is greater than 3.12.0, which introduced the `--parallel` option. --- lib/src/builder/builder.dart | 19 +++++++++++++++++++ lib/src/builder/run_builder.dart | 30 ++++++++++++++++++++++++++++-- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/lib/src/builder/builder.dart b/lib/src/builder/builder.dart index 5a52c35..adea7bd 100644 --- a/lib/src/builder/builder.dart +++ b/lib/src/builder/builder.dart @@ -74,6 +74,19 @@ class CMakeBuilder implements Builder { final bool useVcvars; + /// Number of parallel jobs to use for CMake build, i.e., --parallel []. + /// + /// This is added since CMake 3.12 + /// + /// https://cmake.org/cmake/help/latest/manual/cmake.1.html#cmdoption-cmake-build-j + /// + /// If [parallelUseAllProcessors] is true, [parallelJobs] will be set to + /// [Platform.numberOfProcessors]. + final int? parallelJobs; + + /// Whether to use all processors for parallel jobs. + final bool parallelUseAllProcessors; + /// This constructor initializes a new build config from [sourceDir]. /// /// Parameters: @@ -110,6 +123,8 @@ class CMakeBuilder implements Builder { this.androidArgs = const AndroidBuilderArgs(), this.appleArgs = const AppleBuilderArgs(), this.useVcvars = true, + this.parallelJobs, + this.parallelUseAllProcessors = false, }) : cmakeListsDir = sourceDir; /// This constructor initializes a new build config by cloning the @@ -160,6 +175,8 @@ class CMakeBuilder implements Builder { this.androidArgs = const AndroidBuilderArgs(), this.appleArgs = const AppleBuilderArgs(), this.useVcvars = true, + this.parallelJobs, + this.parallelUseAllProcessors = false, }) : cmakeListsDir = sourceDir { // Some platforms will error if directory does not exist, create it. cmakeListsDir = sourceDir.resolve('external/$name/').normalizePath(); @@ -308,6 +325,8 @@ class CMakeBuilder implements Builder { androidArgs: androidArgs, logLevel: logLevel, userConfig: userConfig, + parallelJobs: parallelJobs, + parallelUseAllProcessors: parallelUseAllProcessors, ); // Do not remove this line for potential extra variables in the future diff --git a/lib/src/builder/run_builder.dart b/lib/src/builder/run_builder.dart index 297df0e..53a95ff 100644 --- a/lib/src/builder/run_builder.dart +++ b/lib/src/builder/run_builder.dart @@ -13,6 +13,7 @@ import 'package:change_case/change_case.dart'; import 'package:code_assets/code_assets.dart'; import 'package:hooks/hooks.dart'; import 'package:logging/logging.dart'; +import 'package:pub_semver/pub_semver.dart'; import '../native_toolchain/android_ndk.dart'; import '../native_toolchain/cmake.dart'; @@ -64,6 +65,10 @@ class RunCMakeBuilder { /// save the last generate status of native_toolchain_cmake final String lastGenStatusFile; + /// number of parallel jobs to use + final int? parallelJobs; + final bool parallelUseAllProcessors; + RunCMakeBuilder({ required this.input, required this.codeConfig, @@ -78,10 +83,13 @@ class RunCMakeBuilder { this.appleArgs = const AppleBuilderArgs(), this.logLevel = LogLevel.STATUS, this.lastGenStatusFile = 'ntc_last_generate_status.txt', + this.parallelUseAllProcessors = false, + int? parallelJobs, Uri? outputDir, UserConfig? userConfig, }) : outDir = outputDir ?? input.outputDirectory, - userConfig = userConfig ?? UserConfig(targetOS: codeConfig.targetOS); + userConfig = userConfig ?? UserConfig(targetOS: codeConfig.targetOS), + parallelJobs = parallelJobs ?? (parallelUseAllProcessors ? Platform.numberOfProcessors : null); Future cmakePath({Map? environment}) async { final cmakeTools = await cmake.defaultResolver?.resolve( @@ -236,8 +244,25 @@ class RunCMakeBuilder { } Future _build({Map? environment}) async { + final cmakeTools = await cmake.defaultResolver?.resolve( + logger: logger, + userConfig: userConfig, + environment: environment, + ); + final _cmake = cmakeTools?.first; + if (_cmake == null) { + throw Exception('Failed to resolve CMake path.'); + } + + final _parallelJobs = []; + // https://cmake.org/cmake/help/latest/manual/cmake.1.html#cmdoption-cmake-build-j + // --parallel added in CMake 3.12.0 + if (parallelJobs != null && _cmake.version != null && _cmake.version! > Version.parse('3.12.0')) { + _parallelJobs.addAll(['--parallel', parallelJobs.toString()]); + } + return runProcess( - executable: await cmakePath(environment: environment), + executable: _cmake.uri, arguments: [ '--build', outDir.normalizePath().toFilePath(), @@ -245,6 +270,7 @@ class RunCMakeBuilder { buildMode.name.toCapitalCase(), if (targets?.isNotEmpty ?? false) '--target', if (targets?.isNotEmpty ?? false) ...targets!, + ..._parallelJobs, ], logger: logger, workingDirectory: outDir, From 8d14392ee8c783c84a047f6d0ceb202e8027e520 Mon Sep 17 00:00:00 2001 From: rainy liu Date: Fri, 6 Feb 2026 17:46:48 +0800 Subject: [PATCH 2/2] chore: bump version to 0.2.4 and update changelog. --- CHANGELOG.md | 4 ++++ pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0379757..12a9aec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # native_toolchain_cmake +## 0.2.4 + +- new: add `parallelJobs` and `parallelUseAllProcessors` to support parallel build or set njobs explicitly. + ## 0.2.3 - new: support skipping generate if cached diff --git a/pubspec.yaml b/pubspec.yaml index 27e9012..748b3c2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: native_toolchain_cmake description: >- A library to invoke and build CMake projects for Dart Native Assets. -version: 0.2.3 +version: 0.2.4 repository: https://github.com/rainyl/native_toolchain_cmake topics: