@@ -13,6 +13,7 @@ import 'package:change_case/change_case.dart';
1313import 'package:code_assets/code_assets.dart' ;
1414import 'package:hooks/hooks.dart' ;
1515import 'package:logging/logging.dart' ;
16+ import 'package:pub_semver/pub_semver.dart' ;
1617
1718import '../native_toolchain/android_ndk.dart' ;
1819import '../native_toolchain/cmake.dart' ;
@@ -64,6 +65,10 @@ class RunCMakeBuilder {
6465 /// save the last generate status of native_toolchain_cmake
6566 final String lastGenStatusFile;
6667
68+ /// number of parallel jobs to use
69+ final int ? parallelJobs;
70+ final bool parallelUseAllProcessors;
71+
6772 RunCMakeBuilder ({
6873 required this .input,
6974 required this .codeConfig,
@@ -78,10 +83,13 @@ class RunCMakeBuilder {
7883 this .appleArgs = const AppleBuilderArgs (),
7984 this .logLevel = LogLevel .STATUS ,
8085 this .lastGenStatusFile = 'ntc_last_generate_status.txt' ,
86+ this .parallelUseAllProcessors = false ,
87+ int ? parallelJobs,
8188 Uri ? outputDir,
8289 UserConfig ? userConfig,
8390 }) : outDir = outputDir ?? input.outputDirectory,
84- userConfig = userConfig ?? UserConfig (targetOS: codeConfig.targetOS);
91+ userConfig = userConfig ?? UserConfig (targetOS: codeConfig.targetOS),
92+ parallelJobs = parallelJobs ?? (parallelUseAllProcessors ? Platform .numberOfProcessors : null );
8593
8694 Future <Uri > cmakePath ({Map <String , String >? environment}) async {
8795 final cmakeTools = await cmake.defaultResolver? .resolve (
@@ -236,15 +244,33 @@ class RunCMakeBuilder {
236244 }
237245
238246 Future <RunProcessResult > _build ({Map <String , String >? environment}) async {
247+ final cmakeTools = await cmake.defaultResolver? .resolve (
248+ logger: logger,
249+ userConfig: userConfig,
250+ environment: environment,
251+ );
252+ final _cmake = cmakeTools? .first;
253+ if (_cmake == null ) {
254+ throw Exception ('Failed to resolve CMake path.' );
255+ }
256+
257+ final _parallelJobs = < String > [];
258+ // https://cmake.org/cmake/help/latest/manual/cmake.1.html#cmdoption-cmake-build-j
259+ // --parallel added in CMake 3.12.0
260+ if (parallelJobs != null && _cmake.version != null && _cmake.version! > Version .parse ('3.12.0' )) {
261+ _parallelJobs.addAll (['--parallel' , parallelJobs.toString ()]);
262+ }
263+
239264 return runProcess (
240- executable: await cmakePath (environment : environment) ,
265+ executable: _cmake.uri ,
241266 arguments: [
242267 '--build' ,
243268 outDir.normalizePath ().toFilePath (),
244269 '--config' ,
245270 buildMode.name.toCapitalCase (),
246271 if (targets? .isNotEmpty ?? false ) '--target' ,
247272 if (targets? .isNotEmpty ?? false ) ...targets! ,
273+ ..._parallelJobs,
248274 ],
249275 logger: logger,
250276 workingDirectory: outDir,
0 commit comments