Index: tools/gn/create_bundle_target_generator.cc |
diff --git a/tools/gn/create_bundle_target_generator.cc b/tools/gn/create_bundle_target_generator.cc |
index 83749983e6d00383666f6f7628287ecbbb5a9926..99bc4644ff0e2190552b8e02a548cdc77119c631 100644 |
--- a/tools/gn/create_bundle_target_generator.cc |
+++ b/tools/gn/create_bundle_target_generator.cc |
@@ -4,12 +4,14 @@ |
#include "tools/gn/create_bundle_target_generator.h" |
+#include "base/logging.h" |
#include "tools/gn/filesystem_utils.h" |
#include "tools/gn/parse_tree.h" |
#include "tools/gn/scope.h" |
#include "tools/gn/substitution_type.h" |
#include "tools/gn/target.h" |
#include "tools/gn/value.h" |
+#include "tools/gn/value_extractors.h" |
#include "tools/gn/variables.h" |
CreateBundleTargetGenerator::CreateBundleTargetGenerator( |
@@ -25,33 +27,36 @@ void CreateBundleTargetGenerator::DoRun() { |
target_->set_output_type(Target::CREATE_BUNDLE); |
BundleData& bundle_data = target_->bundle_data(); |
- if (!GetBundleDir(SourceDir(), |
- variables::kBundleRootDir, |
- &bundle_data.root_dir())) |
+ if (!FillBundleDir(SourceDir(), variables::kBundleRootDir, |
+ &bundle_data.root_dir())) |
return; |
- if (!GetBundleDir(bundle_data.root_dir(), |
- variables::kBundleResourcesDir, |
- &bundle_data.resources_dir())) |
+ if (!FillBundleDir(bundle_data.root_dir(), variables::kBundleResourcesDir, |
+ &bundle_data.resources_dir())) |
return; |
- if (!GetBundleDir(bundle_data.root_dir(), |
- variables::kBundleExecutableDir, |
- &bundle_data.executable_dir())) |
+ if (!FillBundleDir(bundle_data.root_dir(), variables::kBundleExecutableDir, |
+ &bundle_data.executable_dir())) |
return; |
- if (!GetBundleDir(bundle_data.root_dir(), |
- variables::kBundlePlugInsDir, |
- &bundle_data.plugins_dir())) |
+ if (!FillBundleDir(bundle_data.root_dir(), variables::kBundlePlugInsDir, |
+ &bundle_data.plugins_dir())) |
return; |
- const Value* value = scope_->GetValue(variables::kProductType, true); |
- if (value) { |
- if (!value->VerifyTypeIs(Value::STRING, err_)) |
- return; |
+ if (!FillProductType()) |
+ return; |
- bundle_data.product_type().assign(value->string_value()); |
- } |
+ if (!FillCodeSigningScript()) |
+ return; |
+ |
+ if (!FillCodeSigningSources()) |
+ return; |
+ |
+ if (!FillCodeSigningOutputs()) |
+ return; |
+ |
+ if (!FillCodeSigningArgs()) |
+ return; |
} |
-bool CreateBundleTargetGenerator::GetBundleDir( |
+bool CreateBundleTargetGenerator::FillBundleDir( |
const SourceDir& bundle_root_dir, |
const base::StringPiece& name, |
SourceDir* bundle_dir) { |
@@ -77,3 +82,114 @@ bool CreateBundleTargetGenerator::GetBundleDir( |
bundle_dir->SwapValue(&str); |
return true; |
} |
+ |
+bool CreateBundleTargetGenerator::FillProductType() { |
+ const Value* value = scope_->GetValue(variables::kProductType, true); |
+ if (!value) |
+ return true; |
+ |
+ if (!value->VerifyTypeIs(Value::STRING, err_)) |
+ return false; |
+ |
+ target_->bundle_data().product_type().assign(value->string_value()); |
+ return true; |
+} |
+ |
+bool CreateBundleTargetGenerator::FillCodeSigningScript() { |
+ const Value* value = scope_->GetValue(variables::kCodeSigningScript, true); |
+ if (!value) |
+ return true; |
+ |
+ if (!value->VerifyTypeIs(Value::STRING, err_)) |
+ return false; |
+ |
+ SourceFile script_file = scope_->GetSourceDir().ResolveRelativeFile( |
+ *value, err_, scope_->settings()->build_settings()->root_path_utf8()); |
+ if (err_->has_error()) |
+ return false; |
+ |
+ target_->bundle_data().set_code_signing_script(script_file); |
+ return true; |
+} |
+ |
+bool CreateBundleTargetGenerator::FillCodeSigningSources() { |
+ const Value* value = scope_->GetValue(variables::kCodeSigningSources, true); |
+ if (!value) |
+ return true; |
+ |
+ if (target_->bundle_data().code_signing_script().is_null()) { |
+ *err_ = Err( |
+ function_call_, |
+ "No code signing script." |
+ "You must define code_signing_script if you use code_signing_sources."); |
+ return false; |
+ } |
+ |
+ Target::FileList script_sources; |
+ if (!ExtractListOfRelativeFiles(scope_->settings()->build_settings(), *value, |
+ scope_->GetSourceDir(), &script_sources, |
+ err_)) |
+ return false; |
+ |
+ target_->bundle_data().code_signing_sources().swap(script_sources); |
+ return true; |
+} |
+ |
+bool CreateBundleTargetGenerator::FillCodeSigningOutputs() { |
+ const Value* value = scope_->GetValue(variables::kCodeSigningOutputs, true); |
+ if (!value) |
+ return true; |
+ |
+ if (target_->bundle_data().code_signing_script().is_null()) { |
+ *err_ = Err( |
+ function_call_, |
+ "No code signing script." |
+ "You must define code_signing_script if you use code_signing_outputs."); |
+ return false; |
+ } |
+ |
+ if (!value->VerifyTypeIs(Value::LIST, err_)) |
+ return false; |
+ |
+ SubstitutionList& outputs = target_->bundle_data().code_signing_outputs(); |
+ if (!outputs.Parse(*value, err_)) |
+ return false; |
+ |
+ if (outputs.list().empty()) { |
+ *err_ = |
+ Err(function_call_, |
+ "Code signing script has no output." |
+ "If you have no outputs, the build system can not tell when your\n" |
+ "code signing script needs to be run."); |
+ return false; |
+ } |
+ |
+ // Validate that outputs are in the output dir. |
+ CHECK_EQ(value->list_value().size(), outputs.list().size()); |
+ for (size_t i = 0; i < value->list_value().size(); ++i) { |
+ if (!EnsureSubstitutionIsInOutputDir(outputs.list()[i], |
+ value->list_value()[i])) |
+ return false; |
+ } |
+ |
+ return true; |
+} |
+ |
+bool CreateBundleTargetGenerator::FillCodeSigningArgs() { |
+ const Value* value = scope_->GetValue(variables::kCodeSigningArgs, true); |
+ if (!value) |
+ return true; |
+ |
+ if (target_->bundle_data().code_signing_script().is_null()) { |
+ *err_ = Err( |
+ function_call_, |
+ "No code signing script." |
+ "You must define code_signing_script if you use code_signing_args."); |
+ return false; |
+ } |
+ |
+ if (!value->VerifyTypeIs(Value::LIST, err_)) |
+ return false; |
+ |
+ return target_->bundle_data().code_signing_args().Parse(*value, err_); |
+} |