// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'base/file_system.dart'; import 'cmake_project.dart'; /// Extracts the `BINARY_NAME` from a project's CMake file. /// /// Returns `null` if it cannot be found. String? getCmakeExecutableName(CmakeBasedProject project) { if (!project.cmakeFile.existsSync()) { return null; } final RegExp nameSetPattern = RegExp(r'^\s*set\(BINARY_NAME\s*"(.*)"\s*\)\s*$'); for (final String line in project.cmakeFile.readAsLinesSync()) { final RegExpMatch? match = nameSetPattern.firstMatch(line); if (match != null) { return match.group(1); } } return null; } /// Extracts the `PACKAGE_GUID` from a project's CMake file. /// /// Returns `null` if it cannot be found. String? getCmakePackageGuid(File cmakeFile) { if (!cmakeFile.existsSync()) { return null; } final RegExp nameSetPattern = RegExp(r'^\s*set\(PACKAGE_GUID\s*"(.*)"\s*\)\s*$'); for (final String line in cmakeFile.readAsLinesSync()) { final RegExpMatch? match = nameSetPattern.firstMatch(line); if (match != null) { return match.group(1); } } return null; } String _escapeBackslashes(String s) { return s.replaceAll(r'\', r'\\'); } /// Writes a generated CMake configuration file for [project], including /// variables expected by the build template and an environment variable list /// for calling back into Flutter. void writeGeneratedCmakeConfig(String flutterRoot, CmakeBasedProject project, Map<String, String> environment) { // Only a limited set of variables are needed by the CMake files themselves, // the rest are put into a list to pass to the re-entrant build step. final String escapedFlutterRoot = _escapeBackslashes(flutterRoot); final String escapedProjectDir = _escapeBackslashes(project.parent.directory.path); final StringBuffer buffer = StringBuffer(''' # Generated code do not commit. file(TO_CMAKE_PATH "$escapedFlutterRoot" FLUTTER_ROOT) file(TO_CMAKE_PATH "$escapedProjectDir" PROJECT_DIR) # Environment variables to pass to tool_backend.sh list(APPEND FLUTTER_TOOL_ENVIRONMENT "FLUTTER_ROOT=$escapedFlutterRoot" "PROJECT_DIR=$escapedProjectDir" '''); environment.forEach((String key, String value) { final String configValue = _escapeBackslashes(value); buffer.writeln(' "$key=$configValue"'); }); buffer.writeln(')'); project.generatedCmakeConfigFile ..createSync(recursive: true) ..writeAsStringSync(buffer.toString()); }