Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(152)

Unified Diff: tools/gn/ninja_create_bundle_target_writer.cc

Issue 2105613003: Fix dependencies rules for create_bundle and bundle_data ninja steps. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove stamps (to allow using hardlinks) Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tools/gn/ninja_create_bundle_target_writer.cc
diff --git a/tools/gn/ninja_create_bundle_target_writer.cc b/tools/gn/ninja_create_bundle_target_writer.cc
index 26701e50db59e6a886ae516aadaaf9ac5480129b..351ec0c883e91666e1861fa1e51b82ed69ed1511 100644
--- a/tools/gn/ninja_create_bundle_target_writer.cc
+++ b/tools/gn/ninja_create_bundle_target_writer.cc
@@ -57,13 +57,10 @@ void NinjaCreateBundleTargetWriter::Run() {
std::string code_signing_rule_name = WriteCodeSigningRuleDefinition();
- OutputFile input_dep =
- WriteInputDepsStampAndGetDep(std::vector<const Target*>());
-
std::vector<OutputFile> output_files;
- WriteCopyBundleDataRules(input_dep, &output_files);
- WriteCompileAssetsCatalogRule(input_dep, &output_files);
- WriteCodeSigningRules(code_signing_rule_name, input_dep, &output_files);
+ WriteCopyBundleDataSteps(&output_files);
+ WriteCompileAssetsCatalogStep(&output_files);
+ WriteCodeSigningStep(code_signing_rule_name, &output_files);
std::vector<OutputFile> order_only_deps;
for (const auto& pair : target_->data_deps())
@@ -113,37 +110,41 @@ std::string NinjaCreateBundleTargetWriter::WriteCodeSigningRuleDefinition() {
return custom_rule_name;
}
-void NinjaCreateBundleTargetWriter::WriteCopyBundleDataRules(
- const OutputFile& input_dep,
+void NinjaCreateBundleTargetWriter::WriteCopyBundleDataSteps(
std::vector<OutputFile>* output_files) {
- for (const BundleFileRule& file_rule : target_->bundle_data().file_rules()) {
- for (const SourceFile& source_file : file_rule.sources()) {
- OutputFile output_file = file_rule.ApplyPatternToSourceAsOutputFile(
- settings_, target_->bundle_data(), source_file);
- output_files->push_back(output_file);
-
- out_ << "build ";
- path_output_.WriteFile(out_, output_file);
- out_ << ": "
- << GetNinjaRulePrefixForToolchain(settings_)
- << Toolchain::ToolTypeToName(Toolchain::TYPE_COPY_BUNDLE_DATA)
- << " ";
- path_output_.WriteFile(out_, source_file);
- if (!input_dep.value().empty()) {
- out_ << " | ";
- path_output_.WriteFile(out_, input_dep);
- }
- out_ << std::endl;
- }
+ for (const BundleFileRule& file_rule : target_->bundle_data().file_rules())
+ WriteCopyBundleFileRuleSteps(file_rule, output_files);
+}
+
+void NinjaCreateBundleTargetWriter::WriteCopyBundleFileRuleSteps(
+ const BundleFileRule& file_rule,
+ std::vector<OutputFile>* output_files) {
+ // Note that we don't write implicit deps for copy steps. "copy_bundle_data"
+ // steps as this is most likely implemented using hardlink in the common case.
+ // See NinjaCopyTargetWriter::WriteCopyRules() for a detailed explanation.
+ for (const SourceFile& source_file : file_rule.sources()) {
+ OutputFile output_file = file_rule.ApplyPatternToSourceAsOutputFile(
+ settings_, target_->bundle_data(), source_file);
+ output_files->push_back(output_file);
+
+ out_ << "build ";
+ path_output_.WriteFile(out_, output_file);
+ out_ << ": " << GetNinjaRulePrefixForToolchain(settings_)
+ << Toolchain::ToolTypeToName(Toolchain::TYPE_COPY_BUNDLE_DATA) << " ";
+ path_output_.WriteFile(out_, source_file);
+ out_ << std::endl;
}
}
-void NinjaCreateBundleTargetWriter::WriteCompileAssetsCatalogRule(
- const OutputFile& input_dep,
+void NinjaCreateBundleTargetWriter::WriteCompileAssetsCatalogStep(
std::vector<OutputFile>* output_files) {
- if (target_->bundle_data().asset_catalog_sources().empty())
+ if (target_->bundle_data().assets_catalog_sources().empty())
return;
+ OutputFile input_dep = WriteCompileAssetsCatalogInputDepsStamp(
+ target_->bundle_data().assets_catalog_deps());
+ DCHECK(!input_dep.value().empty());
+
OutputFile output_file(settings_->build_settings(),
target_->bundle_data().GetCompiledAssetCatalogPath());
output_files->push_back(output_file);
@@ -154,40 +155,53 @@ void NinjaCreateBundleTargetWriter::WriteCompileAssetsCatalogRule(
<< Toolchain::ToolTypeToName(Toolchain::TYPE_COMPILE_XCASSETS);
std::set<SourceFile> asset_catalog_bundles;
- for (const auto& source : target_->bundle_data().asset_catalog_sources()) {
- SourceFile asset_catalog_bundle;
- CHECK(IsSourceFileFromAssetCatalog(source, &asset_catalog_bundle));
- if (asset_catalog_bundles.find(asset_catalog_bundle) !=
- asset_catalog_bundles.end())
- continue;
+ for (const auto& source : target_->bundle_data().assets_catalog_sources()) {
out_ << " ";
- path_output_.WriteFile(out_, asset_catalog_bundle);
- asset_catalog_bundles.insert(asset_catalog_bundle);
+ path_output_.WriteFile(out_, source);
+ asset_catalog_bundles.insert(source);
}
- out_ << " |";
- for (const auto& source : target_->bundle_data().asset_catalog_sources()) {
- out_ << " ";
- path_output_.WriteFile(
- out_, OutputFile(settings_->build_settings(), source));
- }
+ out_ << " | ";
+ path_output_.WriteFile(out_, input_dep);
+ out_ << std::endl;
+}
- if (!input_dep.value().empty()) {
+OutputFile
+NinjaCreateBundleTargetWriter::WriteCompileAssetsCatalogInputDepsStamp(
+ const std::vector<const Target*>& dependencies) {
+ DCHECK(!dependencies.empty());
+ if (dependencies.size() == 1)
+ return dependencies[0]->dependency_output_file();
+
+ OutputFile xcassets_input_stamp_file =
+ OutputFile(RebasePath(GetTargetOutputDir(target_).value(),
+ settings_->build_settings()->build_dir(),
+ settings_->build_settings()->root_path_utf8()));
+ xcassets_input_stamp_file.value().append(target_->label().name());
+ xcassets_input_stamp_file.value().append(".xcassets.inputdeps.stamp");
+
+ out_ << "build ";
+ path_output_.WriteFile(out_, xcassets_input_stamp_file);
+ out_ << ": " << GetNinjaRulePrefixForToolchain(settings_)
+ << Toolchain::ToolTypeToName(Toolchain::TYPE_STAMP);
+
+ for (const Target* target : dependencies) {
out_ << " ";
- path_output_.WriteFile(out_, input_dep);
+ path_output_.WriteFile(out_, target->dependency_output_file());
}
out_ << std::endl;
+ return xcassets_input_stamp_file;
}
-void NinjaCreateBundleTargetWriter::WriteCodeSigningRules(
+void NinjaCreateBundleTargetWriter::WriteCodeSigningStep(
const std::string& code_signing_rule_name,
- const OutputFile& input_dep,
std::vector<OutputFile>* output_files) {
if (code_signing_rule_name.empty())
return;
OutputFile code_signing_input_stamp_file =
- WriteCodeSigningInputDepsStamp(input_dep, output_files);
+ WriteCodeSigningInputDepsStamp(output_files);
+ DCHECK(!code_signing_input_stamp_file.value().empty());
out_ << "build";
std::vector<OutputFile> code_signing_output_files;
@@ -197,19 +211,17 @@ void NinjaCreateBundleTargetWriter::WriteCodeSigningRules(
path_output_.WriteFiles(out_, code_signing_output_files);
// Since the code signature step depends on all the files from the bundle,
- // the create_bundle stamp can just depends on the output of the signature.
+ // the create_bundle stamp can just depends on the output of the signature
+ // script (dependencies are transitive).
output_files->swap(code_signing_output_files);
out_ << ": " << code_signing_rule_name;
- if (!code_signing_input_stamp_file.value().empty()) {
- out_ << " | ";
- path_output_.WriteFile(out_, code_signing_input_stamp_file);
- }
+ out_ << " | ";
+ path_output_.WriteFile(out_, code_signing_input_stamp_file);
out_ << std::endl;
}
OutputFile NinjaCreateBundleTargetWriter::WriteCodeSigningInputDepsStamp(
- const OutputFile& input_dep,
std::vector<OutputFile>* output_files) {
std::vector<SourceFile> code_signing_input_files;
code_signing_input_files.push_back(
@@ -222,15 +234,32 @@ OutputFile NinjaCreateBundleTargetWriter::WriteCodeSigningInputDepsStamp(
code_signing_input_files.push_back(
output_file.AsSourceFile(settings_->build_settings()));
}
- if (!input_dep.value().empty()) {
- code_signing_input_files.push_back(
- input_dep.AsSourceFile(settings_->build_settings()));
+
+ std::vector<const Target*> dependencies;
+ for (const auto& label_target_pair : target_->private_deps()) {
+ if (label_target_pair.ptr->output_type() == Target::BUNDLE_DATA)
+ continue;
+ dependencies.push_back(label_target_pair.ptr);
+ }
+ for (const auto& label_target_pair : target_->public_deps()) {
+ if (label_target_pair.ptr->output_type() == Target::BUNDLE_DATA)
+ continue;
+ dependencies.push_back(label_target_pair.ptr);
}
DCHECK(!code_signing_input_files.empty());
- if (code_signing_input_files.size() == 1)
+ if (code_signing_input_files.size() == 1 && dependencies.empty())
return OutputFile(settings_->build_settings(), code_signing_input_files[0]);
+ // Remove possible duplicates (if a target is listed in both deps and
+ // public_deps.
+ std::sort(dependencies.begin(), dependencies.end(),
+ [](const Target* lhs, const Target* rhs) -> bool {
+ return lhs->label() < rhs->label();
+ });
+ dependencies.erase(std::unique(dependencies.begin(), dependencies.end()),
+ dependencies.end());
+
OutputFile code_signing_input_stamp_file =
OutputFile(RebasePath(GetTargetOutputDir(target_).value(),
settings_->build_settings()->build_dir(),
@@ -247,6 +276,10 @@ OutputFile NinjaCreateBundleTargetWriter::WriteCodeSigningInputDepsStamp(
out_ << " ";
path_output_.WriteFile(out_, source);
}
+ for (const Target* target : dependencies) {
+ out_ << " ";
+ path_output_.WriteFile(out_, target->dependency_output_file());
+ }
out_ << std::endl;
return code_signing_input_stamp_file;
}
« no previous file with comments | « tools/gn/ninja_create_bundle_target_writer.h ('k') | tools/gn/ninja_create_bundle_target_writer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698