execute method
Execute this build step.
The context provides access to the build configuration and logger.
Returns a NativeStepResult containing any artifacts produced by this step.
Implementation
@override
Future<NativeStepResult> execute(
NativeBuildContext context,
ResolvedSource source,
) async {
final logger = context.logger;
final r = runner ?? ProcessRunner(logger: logger);
final expandedSourceDirectory = expandRecipeValue(
sourceDirectory,
context,
source,
);
final srcDir = p.isAbsolute(expandedSourceDirectory)
? expandedSourceDirectory
: p.join(source.directory.path, expandedSourceDirectory);
final buildDir = buildDirectory != null
? (() {
final expandedBuildDirectory = expandRecipeValue(
buildDirectory!,
context,
source,
);
return p.isAbsolute(expandedBuildDirectory)
? expandedBuildDirectory
: p.join(source.directory.path, expandedBuildDirectory);
})()
: p.join(srcDir, 'build');
final buildDirEntity = Directory(buildDir);
buildDirEntity.createSync(recursive: true);
// Detect stale CMakeCache.txt from a previous source path
final cacheFile = File(p.join(buildDir, 'CMakeCache.txt'));
if (cacheFile.existsSync()) {
final cacheContent = cacheFile.readAsStringSync();
final homeDirMatch = RegExp(
r'CMAKE_HOME_DIRECTORY:INTERNAL=(.+)',
).firstMatch(cacheContent);
if (homeDirMatch != null) {
final cachedSource = homeDirMatch.group(1);
if (cachedSource != srcDir) {
logger?.info(
'[cmake_configure] Stale cache detected '
'(cached source: $cachedSource, current: $srcDir). '
'Cleaning build directory.',
);
buildDirEntity.deleteSync(recursive: true);
buildDirEntity.createSync(recursive: true);
}
}
}
final args = <String>['-S', srcDir, '-B', buildDir];
if (generator != null) {
args.addAll(['-G', expandRecipeValue(generator!, context, source)]);
}
if (toolchainFile != null) {
args.addAll([
'-DCMAKE_TOOLCHAIN_FILE=${expandRecipeValue(toolchainFile!, context, source)}',
]);
}
for (final entry in defines.entries) {
args.add(
'-D${entry.key}=${expandRecipeValue(entry.value, context, source)}',
);
}
logger?.info('[$id] Running: cmake ${args.join(' ')}');
await r.runStreaming('cmake', args, workingDirectory: Directory(buildDir));
return const NativeStepResult();
}