Skip to content

Commit

Permalink
[gn] Change sdk_rewriter() template to use depfiles (#51314)
Browse files Browse the repository at this point in the history
Part of flutter/flutter#144430

From `gn help inputs`: "It may be tempting to write a script that enumerates all files in a directory
as inputs. Don't do this!"
  • Loading branch information
zanderso authored Mar 11, 2024
1 parent 6cefbe1 commit eac124e
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 29 deletions.
5 changes: 2 additions & 3 deletions web_sdk/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ sdk_rewriter("web_ui_library_sources") {
output_dir = "$root_out_dir/flutter_web_sdk/lib/ui/"

# exclude everything in the engine directory, it will be a separate internal library
exclude_patterns = [ rebase_path("//flutter/lib/web_ui/lib/src/*") ]
exclude_pattern = rebase_path("//flutter/lib/web_ui/lib/src")
}

web_ui_ui_web_with_output("web_ui_ui_web") {
Expand All @@ -55,8 +55,7 @@ sdk_rewriter("web_engine_library") {
output_dir = "$root_out_dir/flutter_web_sdk/lib/_engine/"

# exclude skwasm, it will be a separate internal library
exclude_patterns =
[ rebase_path("//flutter/lib/web_ui/lib/src/engine/skwasm/*") ]
exclude_pattern = rebase_path("//flutter/lib/web_ui/lib/src/engine/skwasm")
}

sdk_rewriter("skwasm_stub_library") {
Expand Down
38 changes: 31 additions & 7 deletions web_sdk/sdk_rewriter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,10 @@ final ArgParser argParser = ArgParser()
..addOption('library-name')
..addOption('api-file')
..addMultiOption('source-file')
..addOption('stamp');
..addOption('stamp')
..addOption('depfile')
..addOption('exclude-pattern')
..addOption('build-dir');

final List<Replacer> uiPatterns = <Replacer>[
AllReplacer(RegExp(r'library\s+ui;'), 'library dart.ui;'),
Expand Down Expand Up @@ -113,6 +116,10 @@ void main(List<String> arguments) {
final ArgResults results = argParser.parse(arguments);
final Directory directory = Directory(results['output-dir'] as String);
final String inputDirectoryPath = results['input-dir'] as String;
final String? excludePattern = results['exclude-pattern'] as String?;
final String stampfilePath = results['stamp'] as String;
final String depfilePath = results['depfile'] as String;
final String buildDirPath = results['build-dir'] as String;

String Function(String source)? preprocessor;
List<Replacer> replacementPatterns;
Expand All @@ -130,13 +137,25 @@ void main(List<String> arguments) {
preprocessor = (String source) => preprocessPartFile(source, libraryName!);
replacementPatterns = generatePartsPatterns(libraryName, isPublic);
}
for (final String inputFilePath in results['source-file'] as Iterable<String>) {
String pathSuffix = inputFilePath.substring(inputDirectoryPath.length);

final List<String> inputFiles = <String>[];
final List<FileSystemEntity> entries = Directory(inputDirectoryPath).listSync(
recursive: true, followLinks: false,
);
for (final File inputFile in entries.whereType<File>()) {
if (excludePattern != null && inputFile.path.startsWith(excludePattern)) {
continue;
}
if (!inputFile.path.endsWith('.dart') || inputFile.path.endsWith('_test.dart')) {
continue;
}
inputFiles.add(path.relative(inputFile.path, from: buildDirPath));
String pathSuffix = inputFile.path.substring(inputDirectoryPath.length);
if (libraryName != null) {
pathSuffix = path.join(libraryName, pathSuffix);
}
final String outputFilePath = path.join(directory.path, pathSuffix);
processFile(inputFilePath, outputFilePath, preprocessor, replacementPatterns);
processFile(inputFile.path, outputFilePath, preprocessor, replacementPatterns);
}

if (results['api-file'] != null) {
Expand All @@ -159,10 +178,15 @@ void main(List<String> arguments) {
);
}

File(stampfilePath).writeAsStringSync('stamp');
writeDepfile(depfilePath, stampfilePath, inputFiles);
}

if (results['stamp'] != null) {
File(results['stamp'] as String).writeAsStringSync('stamp');
}
void writeDepfile(String depfilePath, String stampfilePath, List<String> inputFiles) {
final StringBuffer outBuf = StringBuffer();
outBuf.write('$stampfilePath: ');
outBuf.write(inputFiles.join(' '));
File(depfilePath).writeAsStringSync(outBuf.toString());
}

List<String> getExtraImportsForLibrary(String libraryName) {
Expand Down
32 changes: 13 additions & 19 deletions web_sdk/web_sdk.gni
Original file line number Diff line number Diff line change
Expand Up @@ -18,42 +18,41 @@ template("sdk_rewriter") {
assert(defined(invoker.input_dir), "Must pass 'input_dir'")
assert(defined(invoker.output_dir), "Must pass 'output_dir'")

source_dart_files = exec_script("$dart_src/tools/list_dart_files.py",
[
"absolute",
rebase_path(invoker.input_dir),
],
"list lines")

if (defined(invoker.exclude_patterns)) {
filtered_files = filter_exclude(source_dart_files, invoker.exclude_patterns)
source_dart_files = []
source_dart_files = filtered_files
}

prebuilt_dart_action(target_name) {
packages = dart_sdk_package_config
pool = "//flutter/build/dart:dart_pool"

script = "//flutter/web_sdk/sdk_rewriter.dart"
inputs = source_dart_files + [ script ]

depfile = "$target_gen_dir/$target_name.d"

stamp_location = "$target_gen_dir/$target_name.stamp"
outputs = [
stamp_location,
invoker.output_dir,
]

build_dir = rebase_path(root_out_dir)
input_dir = rebase_path(invoker.input_dir)
output_dir = rebase_path(invoker.output_dir)

args = [
"--build-dir=$build_dir",
"--output-dir=$output_dir",
"--input-dir=$input_dir",
"--depfile",
rebase_path(depfile),
"--stamp",
rebase_path(stamp_location, root_build_dir),
]

if (defined(invoker.exclude_pattern)) {
args += [
"--exclude-pattern",
invoker.exclude_pattern,
]
}

if (defined(invoker.is_public) && invoker.is_public) {
args += [ "--public" ]
}
Expand All @@ -68,11 +67,6 @@ template("sdk_rewriter") {
"--api-file=$api_file",
]
}

foreach(source_file, source_dart_files) {
path = rebase_path(source_file)
args += [ "--source-file=$path" ]
}
}
}

Expand Down

0 comments on commit eac124e

Please sign in to comment.