Index: tools/gn/bundle_data.cc |
diff --git a/tools/gn/bundle_data.cc b/tools/gn/bundle_data.cc |
index 4218a150e1c9f6ff70ce1f31c0575cf79aa42ac4..2908ddf4d43562b7a16d4f2478891a137d467059 100644 |
--- a/tools/gn/bundle_data.cc |
+++ b/tools/gn/bundle_data.cc |
@@ -14,33 +14,38 @@ |
namespace { |
// Return directory of |path| without the trailing directory separator. |
-base::StringPiece FindDirNoTrailingSeparator(const base::StringPiece& path) { |
+base::StringPiece FindDirNoTrailingSeparator(base::StringPiece path) { |
base::StringPiece::size_type pos = path.find_last_of("/\\"); |
if (pos == base::StringPiece::npos) |
return base::StringPiece(); |
return base::StringPiece(path.data(), pos); |
} |
-} // namespace |
- |
-bool IsSourceFileFromAssetCatalog(const SourceFile& source, |
- SourceFile* asset_catalog) { |
- // Check that the file matches the following pattern: |
+bool IsSourceFileFromAssetsCatalog(base::StringPiece source, |
+ SourceFile* asset_catalog) { |
+ // Check whether |source| matches one of the following pattern: |
+ // .*\.xcassets/Contents.json |
+ // .*\.xcassets/[^/]*\.appiconset/[^/]* |
// .*\.xcassets/[^/]*\.imageset/[^/]* |
- base::StringPiece dir; |
- dir = FindDirNoTrailingSeparator(source.value()); |
- if (!dir.ends_with(".imageset")) |
- return false; |
- dir = FindDirNoTrailingSeparator(dir); |
- if (!dir.ends_with(".xcassets")) |
- return false; |
- if (asset_catalog) { |
+ // .*\.xcassets/[^/]*\.launchimage/[^/]* |
+ bool is_file_from_asset_catalog = false; |
+ base::StringPiece dir = FindDirNoTrailingSeparator(source); |
+ if (source.ends_with("/Contents.json") && dir.ends_with(".xcassets")) { |
+ is_file_from_asset_catalog = true; |
+ } else if (dir.ends_with(".appiconset") || dir.ends_with(".imageset") || |
+ dir.ends_with(".launchimage")) { |
+ dir = FindDirNoTrailingSeparator(dir); |
+ is_file_from_asset_catalog = dir.ends_with(".xcassets"); |
+ } |
+ if (is_file_from_asset_catalog && asset_catalog) { |
std::string asset_catalog_path = dir.as_string(); |
*asset_catalog = SourceFile(SourceFile::SWAP_IN, &asset_catalog_path); |
} |
- return true; |
+ return is_file_from_asset_catalog; |
} |
+} // namespace |
+ |
BundleData::BundleData() {} |
BundleData::~BundleData() {} |
@@ -51,16 +56,21 @@ void BundleData::AddBundleData(const Target* target) { |
} |
void BundleData::OnTargetResolved(Target* owning_target) { |
- // Only initialize file_rules_ and asset_catalog_sources for "create_bundle" |
+ // Only initialize file_rules_ and assets_catalog_sources for "create_bundle" |
// target (properties are only used by those targets). |
if (owning_target->output_type() != Target::CREATE_BUNDLE) |
return; |
+ UniqueVector<const Target*> assets_catalog_deps; |
+ UniqueVector<SourceFile> assets_catalog_sources; |
+ |
for (const Target* target : bundle_deps_) { |
SourceFiles file_rule_sources; |
for (const SourceFile& source_file : target->sources()) { |
- if (IsSourceFileFromAssetCatalog(source_file, nullptr)) { |
- asset_catalog_sources_.push_back(source_file); |
+ SourceFile assets_catalog; |
+ if (IsSourceFileFromAssetsCatalog(source_file.value(), &assets_catalog)) { |
+ assets_catalog_sources.push_back(assets_catalog); |
+ assets_catalog_deps.push_back(target); |
} else { |
file_rule_sources.push_back(source_file); |
} |
@@ -68,11 +78,19 @@ void BundleData::OnTargetResolved(Target* owning_target) { |
if (!file_rule_sources.empty()) { |
DCHECK_EQ(target->action_values().outputs().list().size(), 1u); |
- file_rules_.push_back(BundleFileRule( |
- file_rule_sources, target->action_values().outputs().list()[0])); |
+ file_rules_.push_back( |
+ BundleFileRule(target, file_rule_sources, |
+ target->action_values().outputs().list()[0])); |
} |
} |
+ assets_catalog_deps_.insert(assets_catalog_deps_.end(), |
+ assets_catalog_deps.begin(), |
+ assets_catalog_deps.end()); |
+ assets_catalog_sources_.insert(assets_catalog_sources_.end(), |
+ assets_catalog_sources.begin(), |
+ assets_catalog_sources.end()); |
+ |
GetSourceFiles(&owning_target->sources()); |
} |
@@ -81,8 +99,8 @@ void BundleData::GetSourceFiles(SourceFiles* sources) const { |
sources->insert(sources->end(), file_rule.sources().begin(), |
file_rule.sources().end()); |
} |
- sources->insert(sources->end(), asset_catalog_sources_.begin(), |
- asset_catalog_sources_.end()); |
+ sources->insert(sources->end(), assets_catalog_sources_.begin(), |
+ assets_catalog_sources_.end()); |
if (!code_signing_script_.is_null()) { |
sources->insert(sources->end(), code_signing_sources_.begin(), |
code_signing_sources_.end()); |
@@ -107,7 +125,7 @@ void BundleData::GetOutputsAsSourceFiles( |
} |
} |
- if (!asset_catalog_sources_.empty()) |
+ if (!assets_catalog_sources_.empty()) |
outputs_as_source->push_back(GetCompiledAssetCatalogPath()); |
if (!code_signing_script_.is_null()) { |
@@ -124,7 +142,7 @@ void BundleData::GetOutputsAsSourceFiles( |
} |
SourceFile BundleData::GetCompiledAssetCatalogPath() const { |
- DCHECK(!asset_catalog_sources_.empty()); |
+ DCHECK(!assets_catalog_sources_.empty()); |
std::string assets_car_path = resources_dir_.value() + "/Assets.car"; |
return SourceFile(SourceFile::SWAP_IN, &assets_car_path); |
} |