blob: 91e94dff7dda76911cbe2f5fb617d8c5eebfc265 [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 '../base/version.dart';
import '../ios/xcodeproj.dart';
import '../xcode_project.dart';
/// Starting in Xcode 15, when building macOS, DT_TOOLCHAIN_DIR cannot be used
/// to evaluate LD_RUNPATH_SEARCH_PATHS or LIBRARY_SEARCH_PATHS. `xcodebuild`
/// error message recommend using TOOLCHAIN_DIR instead.
///
/// This has been fixed upstream in CocoaPods, but migrate a copy of their
/// workaround so users don't need to update.
class CocoaPodsToolchainDirectoryMigration extends ProjectMigrator {
CocoaPodsToolchainDirectoryMigration(
XcodeBasedProject project,
XcodeProjectInterpreter xcodeProjectInterpreter,
super.logger,
) : _podRunnerTargetSupportFiles = project.podRunnerTargetSupportFiles,
_xcodeProjectInterpreter = xcodeProjectInterpreter;
final Directory _podRunnerTargetSupportFiles;
final XcodeProjectInterpreter _xcodeProjectInterpreter;
@override
Future<void> migrate() async {
if (!_podRunnerTargetSupportFiles.existsSync()) {
logger.printTrace('CocoaPods Pods-Runner Target Support Files not found, skipping TOOLCHAIN_DIR workaround.');
return;
}
final Version? version = _xcodeProjectInterpreter.version;
// If Xcode not installed or less than 15, skip this migration.
if (version == null || version < Version(15, 0, 0)) {
logger.printTrace('Detected Xcode version is $version, below 15.0, skipping TOOLCHAIN_DIR workaround.');
return;
}
final List<FileSystemEntity> files = _podRunnerTargetSupportFiles.listSync();
for (final FileSystemEntity file in files) {
if (file.basename.endsWith('xcconfig') && file is File) {
processFileLines(file);
}
}
}
@override
String? migrateLine(String line) {
final String trimmedString = line.trim();
if (trimmedString.startsWith('LD_RUNPATH_SEARCH_PATHS') || trimmedString.startsWith('LIBRARY_SEARCH_PATHS')) {
const String originalReadLinkLine = r'{DT_TOOLCHAIN_DIR}';
const String replacementReadLinkLine = r'{TOOLCHAIN_DIR}';
return line.replaceAll(originalReadLinkLine, replacementReadLinkLine);
}
return line;
}
}