execute method

  1. @override
Future<NativeStepResult> execute(
  1. NativeBuildContext context,
  2. ResolvedSource source
)
override

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();
}