blob: 463fcd2c7bd1efe903de1de9496666e072dcd09a [file] [log] [blame]
// 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 '../../base/project_migrator.dart';
import '../../cmake_project.dart';
import 'utils.dart';
const String _cmakeFileToolBackendBefore = r'''
add_custom_command(
OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}
${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN}
${CPP_WRAPPER_SOURCES_APP}
${PHONY_OUTPUT}
COMMAND ${CMAKE_COMMAND} -E env
${FLUTTER_TOOL_ENVIRONMENT}
"${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat"
windows-x64 $<CONFIG>
VERBATIM
)
''';
const String _cmakeFileToolBackendAfter = r'''
add_custom_command(
OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}
${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN}
${CPP_WRAPPER_SOURCES_APP}
${PHONY_OUTPUT}
COMMAND ${CMAKE_COMMAND} -E env
${FLUTTER_TOOL_ENVIRONMENT}
"${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat"
${FLUTTER_TARGET_PLATFORM} $<CONFIG>
VERBATIM
)
''';
const String _cmakeFileTargetPlatformBefore = r'''
# TODO: Move the rest of this into files in ephemeral. See
# https://github.com/flutter/flutter/issues/57146.
set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper")
# === Flutter Library ===
''';
const String _cmakeFileTargetPlatformAfter = r'''
# TODO: Move the rest of this into files in ephemeral. See
# https://github.com/flutter/flutter/issues/57146.
set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper")
# Set fallback configurations for older versions of the flutter tool.
if (NOT DEFINED FLUTTER_TARGET_PLATFORM)
set(FLUTTER_TARGET_PLATFORM "windows-x64")
endif()
# === Flutter Library ===
''';
/// Migrates Windows build to target specific architecture.
/// In more, it deletes old runner folder
class BuildArchitectureMigration extends ProjectMigrator {
BuildArchitectureMigration(
WindowsProject project,
Directory buildDirectory,
super.logger
)
: _cmakeFile = project.managedCmakeFile,
_buildDirectory = buildDirectory;
final File _cmakeFile;
final Directory _buildDirectory;
@override
Future<void> migrate() async {
final Directory oldRunnerDirectory = _buildDirectory
.parent
.childDirectory('runner');
if (oldRunnerDirectory.existsSync()) {
logger.printTrace('''
Deleting previous build folder ${oldRunnerDirectory.path}.
New binaries can be found in ${_buildDirectory.childDirectory('runner').path}.
''');
try {
oldRunnerDirectory.deleteSync(recursive: true);
} on FileSystemException catch (error) {
logger.printError(
'Failed to remove ${oldRunnerDirectory.path}: $error. '
'A program may still be using a file in the directory or the directory itself. '
'To find and stop such a program, see: '
'https://superuser.com/questions/1333118/cant-delete-empty-folder-because-it-is-used'
);
}
}
// Skip this migration if the affected file does not exist. This indicates
// the app has done non-trivial changes to its runner and this migration
// might not work as expected if applied.
if (!_cmakeFile.existsSync()) {
logger.printTrace('''
windows/flutter/CMakeLists.txt file not found, skipping build architecture migration.
This indicates non-trivial changes have been made to the "windows" folder.
If needed, you can reset it by deleting the "windows" folder and then using the
"flutter create --platforms=windows ." command.
''');
return;
}
// Migrate the windows/flutter/CMakeLists.txt file.
final String originalCmakeContents = _cmakeFile.readAsStringSync();
final String cmakeContentsWithTargetPlatform = replaceFirst(
originalCmakeContents,
_cmakeFileTargetPlatformBefore,
_cmakeFileTargetPlatformAfter,
);
final String newCmakeContents = replaceFirst(
cmakeContentsWithTargetPlatform,
_cmakeFileToolBackendBefore,
_cmakeFileToolBackendAfter,
);
if (originalCmakeContents != newCmakeContents) {
logger.printStatus('windows/flutter/CMakeLists.txt does not use FLUTTER_TARGET_PLATFORM, updating.');
_cmakeFile.writeAsStringSync(newCmakeContents);
}
}
}