| // Copyright 2016 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "gn/ninja_create_bundle_target_writer.h" | |
| #include <algorithm> | |
| #include <memory> | |
| #include <sstream> | |
| #include "gn/target.h" | |
| #include "gn/test_with_scope.h" | |
| #include "util/test/test.h" | |
| namespace { | |
| void SetupBundleDataDir(BundleData* bundle_data, const std::string& root_dir) { | |
| std::string bundle_root_dir = root_dir + "/bar.bundle"; | |
| bundle_data->root_dir() = SourceDir(bundle_root_dir); | |
| bundle_data->contents_dir() = SourceDir(bundle_root_dir + "/Contents"); | |
| bundle_data->resources_dir() = | |
| SourceDir(bundle_data->contents_dir().value() + "/Resources"); | |
| bundle_data->executable_dir() = | |
| SourceDir(bundle_data->contents_dir().value() + "/MacOS"); | |
| } | |
| std::unique_ptr<Target> NewAction(const TestWithScope& setup) { | |
| Err err; | |
| auto action = std::make_unique<Target>(setup.settings(), | |
| Label(SourceDir("//foo/"), "bar")); | |
| action->set_output_type(Target::ACTION); | |
| action->visibility().SetPublic(); | |
| action->action_values().set_script(SourceFile("//foo/script.py")); | |
| action->action_values().outputs() = | |
| SubstitutionList::MakeForTest("//out/Debug/foo.out"); | |
| action->SetToolchain(setup.toolchain()); | |
| return action; | |
| } | |
| } // namespace | |
| // Tests multiple files with an output pattern. | |
| TEST(NinjaCreateBundleTargetWriter, Run) { | |
| Err err; | |
| TestWithScope setup; | |
| std::unique_ptr<Target> action = NewAction(setup); | |
| ASSERT_TRUE(action->OnResolved(&err)) << err.message(); | |
| Target bundle_data(setup.settings(), Label(SourceDir("//foo/"), "data")); | |
| bundle_data.set_output_type(Target::BUNDLE_DATA); | |
| bundle_data.sources().push_back(SourceFile("//foo/input1.txt")); | |
| bundle_data.sources().push_back(SourceFile("//foo/input2.txt")); | |
| bundle_data.action_values().outputs() = SubstitutionList::MakeForTest( | |
| "{{bundle_resources_dir}}/{{source_file_part}}"); | |
| bundle_data.SetToolchain(setup.toolchain()); | |
| bundle_data.visibility().SetPublic(); | |
| ASSERT_TRUE(bundle_data.OnResolved(&err)); | |
| Target create_bundle( | |
| setup.settings(), | |
| Label(SourceDir("//baz/"), "bar", setup.toolchain()->label().dir(), | |
| setup.toolchain()->label().name())); | |
| SetupBundleDataDir(&create_bundle.bundle_data(), "//out/Debug"); | |
| create_bundle.set_output_type(Target::CREATE_BUNDLE); | |
| create_bundle.private_deps().push_back(LabelTargetPair(&bundle_data)); | |
| create_bundle.private_deps().push_back(LabelTargetPair(action.get())); | |
| create_bundle.SetToolchain(setup.toolchain()); | |
| ASSERT_TRUE(create_bundle.OnResolved(&err)); | |
| std::ostringstream out; | |
| NinjaCreateBundleTargetWriter writer(&create_bundle, out); | |
| writer.Run(); | |
| const char expected[] = | |
| "build phony/baz/bar.inputdeps: phony || phony/foo/bar " | |
| "phony/foo/data\n" | |
| "build bar.bundle/Contents/Resources/input1.txt: copy_bundle_data " | |
| "../../foo/input1.txt | phony/baz/bar.inputdeps\n" | |
| "build bar.bundle/Contents/Resources/input2.txt: copy_bundle_data " | |
| "../../foo/input2.txt | phony/baz/bar.inputdeps\n" | |
| "build phony/baz/bar: phony " | |
| "bar.bundle/Contents/Resources/input1.txt " | |
| "bar.bundle/Contents/Resources/input2.txt\n" | |
| "build bar.bundle: phony phony/baz/bar\n"; | |
| std::string out_str = out.str(); | |
| EXPECT_EQ(expected, out_str); | |
| } | |
| // Tests creating a bundle in a sub-directory of $root_out_dir. | |
| TEST(NinjaCreateBundleTargetWriter, InSubDirectory) { | |
| Err err; | |
| TestWithScope setup; | |
| std::unique_ptr<Target> action = NewAction(setup); | |
| ASSERT_TRUE(action->OnResolved(&err)) << err.message(); | |
| Target bundle_data(setup.settings(), Label(SourceDir("//foo/"), "data")); | |
| bundle_data.set_output_type(Target::BUNDLE_DATA); | |
| bundle_data.sources().push_back(SourceFile("//foo/input1.txt")); | |
| bundle_data.sources().push_back(SourceFile("//foo/input2.txt")); | |
| bundle_data.action_values().outputs() = SubstitutionList::MakeForTest( | |
| "{{bundle_resources_dir}}/{{source_file_part}}"); | |
| bundle_data.SetToolchain(setup.toolchain()); | |
| bundle_data.visibility().SetPublic(); | |
| ASSERT_TRUE(bundle_data.OnResolved(&err)); | |
| Target create_bundle( | |
| setup.settings(), | |
| Label(SourceDir("//baz/"), "bar", setup.toolchain()->label().dir(), | |
| setup.toolchain()->label().name())); | |
| SetupBundleDataDir(&create_bundle.bundle_data(), "//out/Debug/gen"); | |
| create_bundle.set_output_type(Target::CREATE_BUNDLE); | |
| create_bundle.private_deps().push_back(LabelTargetPair(&bundle_data)); | |
| create_bundle.private_deps().push_back(LabelTargetPair(action.get())); | |
| create_bundle.SetToolchain(setup.toolchain()); | |
| ASSERT_TRUE(create_bundle.OnResolved(&err)); | |
| std::ostringstream out; | |
| NinjaCreateBundleTargetWriter writer(&create_bundle, out); | |
| writer.Run(); | |
| const char expected[] = | |
| "build phony/baz/bar.inputdeps: phony || phony/foo/bar " | |
| "phony/foo/data\n" | |
| "build gen/bar.bundle/Contents/Resources/input1.txt: copy_bundle_data " | |
| "../../foo/input1.txt | phony/baz/bar.inputdeps\n" | |
| "build gen/bar.bundle/Contents/Resources/input2.txt: copy_bundle_data " | |
| "../../foo/input2.txt | phony/baz/bar.inputdeps\n" | |
| "build phony/baz/bar: phony " | |
| "gen/bar.bundle/Contents/Resources/input1.txt " | |
| "gen/bar.bundle/Contents/Resources/input2.txt\n" | |
| "build gen/bar.bundle: phony phony/baz/bar\n"; | |
| std::string out_str = out.str(); | |
| EXPECT_EQ(expected, out_str); | |
| } | |
| // Tests empty asset catalog with partial_info_plist property defined. | |
| TEST(NinjaCreateBundleTargetWriter, JustPartialInfoPlist) { | |
| Err err; | |
| TestWithScope setup; | |
| std::unique_ptr<Target> action = NewAction(setup); | |
| ASSERT_TRUE(action->OnResolved(&err)) << err.message(); | |
| Target create_bundle( | |
| setup.settings(), | |
| Label(SourceDir("//baz/"), "bar", setup.toolchain()->label().dir(), | |
| setup.toolchain()->label().name())); | |
| SetupBundleDataDir(&create_bundle.bundle_data(), "//out/Debug"); | |
| create_bundle.set_output_type(Target::CREATE_BUNDLE); | |
| create_bundle.private_deps().push_back(LabelTargetPair(action.get())); | |
| create_bundle.bundle_data().product_type().assign("com.apple.product-type"); | |
| create_bundle.bundle_data().set_partial_info_plist( | |
| SourceFile("//out/Debug/baz/bar/bar_partial_info.plist")); | |
| create_bundle.SetToolchain(setup.toolchain()); | |
| ASSERT_TRUE(create_bundle.OnResolved(&err)); | |
| std::ostringstream out; | |
| NinjaCreateBundleTargetWriter writer(&create_bundle, out); | |
| writer.Run(); | |
| const char expected[] = | |
| "build baz/bar/bar_partial_info.plist: stamp || phony/foo/bar\n" | |
| "build phony/baz/bar: phony " | |
| "baz/bar/bar_partial_info.plist || phony/foo/bar\n" | |
| "build bar.bundle: phony phony/baz/bar\n"; | |
| std::string out_str = out.str(); | |
| EXPECT_EQ(expected, out_str); | |
| } | |
| // Tests multiple files from asset catalog. | |
| TEST(NinjaCreateBundleTargetWriter, AssetCatalog) { | |
| Err err; | |
| TestWithScope setup; | |
| std::unique_ptr<Target> action = NewAction(setup); | |
| ASSERT_TRUE(action->OnResolved(&err)) << err.message(); | |
| Target bundle_data(setup.settings(), Label(SourceDir("//foo/"), "data")); | |
| bundle_data.set_output_type(Target::BUNDLE_DATA); | |
| bundle_data.sources().push_back( | |
| SourceFile("//foo/Foo.xcassets/Contents.json")); | |
| bundle_data.sources().push_back( | |
| SourceFile("//foo/Foo.xcassets/foo.colorset/Contents.json")); | |
| bundle_data.sources().push_back( | |
| SourceFile("//foo/Foo.xcassets/foo.imageset/Contents.json")); | |
| bundle_data.sources().push_back( | |
| SourceFile("//foo/Foo.xcassets/foo.imageset/FooIcon-29.png")); | |
| bundle_data.sources().push_back( | |
| SourceFile("//foo/Foo.xcassets/foo.imageset/FooIcon-29@2x.png")); | |
| bundle_data.sources().push_back( | |
| SourceFile("//foo/Foo.xcassets/foo.imageset/FooIcon-29@3x.png")); | |
| bundle_data.sources().push_back( | |
| SourceFile("//foo/Foo.xcassets/foo.dataset/Contents.json")); | |
| bundle_data.sources().push_back( | |
| SourceFile("//foo/Foo.xcassets/foo.dataset/FooScript.js")); | |
| bundle_data.sources().push_back( | |
| SourceFile("//foo/Foo.xcassets/file/with/no/known/pattern")); | |
| bundle_data.sources().push_back( | |
| SourceFile("//foo/Foo.xcassets/nested/bar.xcassets/my/file")); | |
| bundle_data.action_values().outputs() = SubstitutionList::MakeForTest( | |
| "{{bundle_resources_dir}}/{{source_file_part}}"); | |
| bundle_data.SetToolchain(setup.toolchain()); | |
| bundle_data.visibility().SetPublic(); | |
| ASSERT_TRUE(bundle_data.OnResolved(&err)); | |
| Target create_bundle( | |
| setup.settings(), | |
| Label(SourceDir("//baz/"), "bar", setup.toolchain()->label().dir(), | |
| setup.toolchain()->label().name())); | |
| SetupBundleDataDir(&create_bundle.bundle_data(), "//out/Debug"); | |
| create_bundle.set_output_type(Target::CREATE_BUNDLE); | |
| create_bundle.private_deps().push_back(LabelTargetPair(&bundle_data)); | |
| create_bundle.private_deps().push_back(LabelTargetPair(action.get())); | |
| create_bundle.bundle_data().product_type().assign("com.apple.product-type"); | |
| create_bundle.bundle_data().xcasset_compiler_flags() = | |
| SubstitutionList::MakeForTest("--app-icon", "foo"); | |
| create_bundle.SetToolchain(setup.toolchain()); | |
| ASSERT_TRUE(create_bundle.OnResolved(&err)); | |
| std::ostringstream out; | |
| NinjaCreateBundleTargetWriter writer(&create_bundle, out); | |
| writer.Run(); | |
| const char expected[] = | |
| "build phony/baz/bar.inputdeps: phony || phony/foo/bar " | |
| "phony/foo/data\n" | |
| "build bar.bundle/Contents/Resources/Assets.car: compile_xcassets " | |
| "../../foo/Foo.xcassets | phony/foo/data phony/baz/bar.inputdeps\n" | |
| " product_type = com.apple.product-type\n" | |
| " xcasset_compiler_flags = --app-icon foo\n" | |
| "build phony/baz/bar: phony " | |
| "bar.bundle/Contents/Resources/Assets.car\n" | |
| "build bar.bundle: phony phony/baz/bar\n"; | |
| std::string out_str = out.str(); | |
| EXPECT_EQ(expected, out_str); | |
| } | |
| // Tests that the phony target for the top-level bundle directory is generated | |
| // correctly. | |
| TEST(NinjaCreateBundleTargetWriter, PhonyTarget) { | |
| Err err; | |
| TestWithScope setup; | |
| // An action for our library to depend on. | |
| Target action(setup.settings(), Label(SourceDir("//foo/"), "action")); | |
| action.set_output_type(Target::ACTION_FOREACH); | |
| action.visibility().SetPublic(); | |
| action.SetToolchain(setup.toolchain()); | |
| ASSERT_TRUE(action.OnResolved(&err)); | |
| Target create_bundle( | |
| setup.settings(), | |
| Label(SourceDir("//baz/"), "bar", setup.toolchain()->label().dir(), | |
| setup.toolchain()->label().name())); | |
| SetupBundleDataDir(&create_bundle.bundle_data(), "//out/Debug"); | |
| create_bundle.set_output_type(Target::CREATE_BUNDLE); | |
| create_bundle.private_deps().push_back(LabelTargetPair(&action)); | |
| create_bundle.SetToolchain(setup.toolchain()); | |
| ASSERT_TRUE(create_bundle.OnResolved(&err)); | |
| std::ostringstream out; | |
| NinjaCreateBundleTargetWriter writer(&create_bundle, out); | |
| writer.Run(); | |
| const char expected[] = | |
| "build phony/baz/bar: phony || phony/foo/action\n" | |
| "build bar.bundle: phony phony/baz/bar\n"; | |
| std::string out_str = out.str(); | |
| EXPECT_EQ(expected, out_str); | |
| } | |
| // Tests complex target with multiple bundle_data sources, including | |
| // some asset catalog. | |
| TEST(NinjaCreateBundleTargetWriter, Complex) { | |
| Err err; | |
| TestWithScope setup; | |
| std::unique_ptr<Target> action = NewAction(setup); | |
| ASSERT_TRUE(action->OnResolved(&err)) << err.message(); | |
| Target bundle_data0(setup.settings(), | |
| Label(SourceDir("//qux/"), "info_plist")); | |
| bundle_data0.set_output_type(Target::BUNDLE_DATA); | |
| bundle_data0.sources().push_back(SourceFile("//qux/qux-Info.plist")); | |
| bundle_data0.action_values().outputs() = | |
| SubstitutionList::MakeForTest("{{bundle_contents_dir}}/Info.plist"); | |
| bundle_data0.SetToolchain(setup.toolchain()); | |
| bundle_data0.visibility().SetPublic(); | |
| ASSERT_TRUE(bundle_data0.OnResolved(&err)); | |
| Target bundle_data1(setup.settings(), Label(SourceDir("//foo/"), "data")); | |
| bundle_data1.set_output_type(Target::BUNDLE_DATA); | |
| bundle_data1.sources().push_back(SourceFile("//foo/input1.txt")); | |
| bundle_data1.sources().push_back(SourceFile("//foo/input2.txt")); | |
| bundle_data1.action_values().outputs() = SubstitutionList::MakeForTest( | |
| "{{bundle_resources_dir}}/{{source_file_part}}"); | |
| bundle_data1.SetToolchain(setup.toolchain()); | |
| bundle_data1.visibility().SetPublic(); | |
| ASSERT_TRUE(bundle_data1.OnResolved(&err)); | |
| Target bundle_data2(setup.settings(), Label(SourceDir("//foo/"), "assets")); | |
| bundle_data2.set_output_type(Target::BUNDLE_DATA); | |
| bundle_data2.sources().push_back( | |
| SourceFile("//foo/Foo.xcassets/Contents.json")); | |
| bundle_data2.sources().push_back( | |
| SourceFile("//foo/Foo.xcassets/foo.colorset/Contents.json")); | |
| bundle_data2.sources().push_back( | |
| SourceFile("//foo/Foo.xcassets/foo.imageset/Contents.json")); | |
| bundle_data2.sources().push_back( | |
| SourceFile("//foo/Foo.xcassets/foo.imageset/FooIcon-29.png")); | |
| bundle_data2.sources().push_back( | |
| SourceFile("//foo/Foo.xcassets/foo.imageset/FooIcon-29@2x.png")); | |
| bundle_data2.sources().push_back( | |
| SourceFile("//foo/Foo.xcassets/foo.imageset/FooIcon-29@3x.png")); | |
| bundle_data2.sources().push_back( | |
| SourceFile("//foo/Foo.xcassets/foo.dataset/Contents.json")); | |
| bundle_data2.sources().push_back( | |
| SourceFile("//foo/Foo.xcassets/foo.dataset/FooScript.js")); | |
| bundle_data2.sources().push_back( | |
| SourceFile("//foo/Foo.xcassets/file/with/no/known/pattern")); | |
| bundle_data2.sources().push_back( | |
| SourceFile("//foo/Foo.xcassets/nested/bar.xcassets/my/file")); | |
| bundle_data2.action_values().outputs() = SubstitutionList::MakeForTest( | |
| "{{bundle_resources_dir}}/{{source_file_part}}"); | |
| bundle_data2.SetToolchain(setup.toolchain()); | |
| bundle_data2.visibility().SetPublic(); | |
| ASSERT_TRUE(bundle_data2.OnResolved(&err)); | |
| Target bundle_data3(setup.settings(), Label(SourceDir("//quz/"), "assets")); | |
| bundle_data3.set_output_type(Target::BUNDLE_DATA); | |
| bundle_data3.sources().push_back( | |
| SourceFile("//quz/Quz.xcassets/Contents.json")); | |
| bundle_data3.sources().push_back( | |
| SourceFile("//quz/Quz.xcassets/quz.imageset/Contents.json")); | |
| bundle_data3.sources().push_back( | |
| SourceFile("//quz/Quz.xcassets/quz.imageset/QuzIcon-29.png")); | |
| bundle_data3.sources().push_back( | |
| SourceFile("//quz/Quz.xcassets/quz.imageset/QuzIcon-29@2x.png")); | |
| bundle_data3.sources().push_back( | |
| SourceFile("//quz/Quz.xcassets/quz.imageset/QuzIcon-29@3x.png")); | |
| bundle_data3.sources().push_back( | |
| SourceFile("//quz/Quz.xcassets/quz.dataset/Contents.json")); | |
| bundle_data3.sources().push_back( | |
| SourceFile("//quz/Quz.xcassets/quz.dataset/QuzScript.js")); | |
| bundle_data3.action_values().outputs() = SubstitutionList::MakeForTest( | |
| "{{bundle_resources_dir}}/{{source_file_part}}"); | |
| bundle_data3.SetToolchain(setup.toolchain()); | |
| bundle_data3.visibility().SetPublic(); | |
| ASSERT_TRUE(bundle_data3.OnResolved(&err)); | |
| Target bundle_data4(setup.settings(), Label(SourceDir("//biz/"), "assets")); | |
| bundle_data4.set_output_type(Target::BUNDLE_DATA); | |
| bundle_data4.sources().push_back( | |
| SourceFile("//biz/Biz.xcassets/Contents.json")); | |
| bundle_data4.sources().push_back( | |
| SourceFile("//biz/Biz.xcassets/biz.colorset/Contents.json")); | |
| bundle_data4.action_values().outputs() = SubstitutionList::MakeForTest( | |
| "{{bundle_resources_dir}}/{{source_file_part}}"); | |
| bundle_data4.SetToolchain(setup.toolchain()); | |
| bundle_data4.visibility().SetPublic(); | |
| ASSERT_TRUE(bundle_data4.OnResolved(&err)); | |
| Target create_bundle( | |
| setup.settings(), | |
| Label(SourceDir("//baz/"), "bar", setup.toolchain()->label().dir(), | |
| setup.toolchain()->label().name())); | |
| SetupBundleDataDir(&create_bundle.bundle_data(), "//out/Debug"); | |
| create_bundle.set_output_type(Target::CREATE_BUNDLE); | |
| create_bundle.private_deps().push_back(LabelTargetPair(&bundle_data0)); | |
| create_bundle.private_deps().push_back(LabelTargetPair(&bundle_data1)); | |
| create_bundle.private_deps().push_back(LabelTargetPair(&bundle_data2)); | |
| create_bundle.private_deps().push_back(LabelTargetPair(&bundle_data3)); | |
| create_bundle.private_deps().push_back(LabelTargetPair(&bundle_data4)); | |
| create_bundle.private_deps().push_back(LabelTargetPair(action.get())); | |
| create_bundle.bundle_data().product_type().assign("com.apple.product-type"); | |
| create_bundle.bundle_data().set_partial_info_plist( | |
| SourceFile("//out/Debug/baz/bar/bar_partial_info.plist")); | |
| create_bundle.SetToolchain(setup.toolchain()); | |
| ASSERT_TRUE(create_bundle.OnResolved(&err)); | |
| std::ostringstream out; | |
| NinjaCreateBundleTargetWriter writer(&create_bundle, out); | |
| writer.Run(); | |
| const char expected[] = | |
| "build phony/baz/bar.inputdeps: phony || phony/biz/assets " | |
| "phony/foo/assets phony/foo/bar phony/foo/data " | |
| "phony/qux/info_plist phony/quz/assets\n" | |
| "build bar.bundle/Contents/Info.plist: copy_bundle_data " | |
| "../../qux/qux-Info.plist | phony/baz/bar.inputdeps\n" | |
| "build bar.bundle/Contents/Resources/input1.txt: copy_bundle_data " | |
| "../../foo/input1.txt | phony/baz/bar.inputdeps\n" | |
| "build bar.bundle/Contents/Resources/input2.txt: copy_bundle_data " | |
| "../../foo/input2.txt | phony/baz/bar.inputdeps\n" | |
| "build phony/baz/bar.xcassets.inputdeps: phony " | |
| "phony/foo/assets " | |
| "phony/quz/assets phony/biz/assets\n" | |
| "build bar.bundle/Contents/Resources/Assets.car | " | |
| "baz/bar/bar_partial_info.plist: compile_xcassets " | |
| "../../foo/Foo.xcassets ../../quz/Quz.xcassets " | |
| "../../biz/Biz.xcassets | phony/baz/bar.xcassets.inputdeps " | |
| "phony/baz/bar.inputdeps\n" | |
| " product_type = com.apple.product-type\n" | |
| " partial_info_plist = baz/bar/bar_partial_info.plist\n" | |
| "build phony/baz/bar: phony " | |
| "bar.bundle/Contents/Info.plist " | |
| "bar.bundle/Contents/Resources/input1.txt " | |
| "bar.bundle/Contents/Resources/input2.txt " | |
| "bar.bundle/Contents/Resources/Assets.car " | |
| "baz/bar/bar_partial_info.plist\n" | |
| "build bar.bundle: phony phony/baz/bar\n"; | |
| std::string out_str = out.str(); | |
| EXPECT_EQ(expected, out_str); | |
| } | |
| // Tests post-processing step. | |
| TEST(NinjaCreateBundleTargetWriter, PostProcessing) { | |
| Err err; | |
| TestWithScope setup; | |
| std::unique_ptr<Target> action = NewAction(setup); | |
| ASSERT_TRUE(action->OnResolved(&err)) << err.message(); | |
| Target executable(setup.settings(), Label(SourceDir("//baz/"), "quz")); | |
| executable.set_output_type(Target::EXECUTABLE); | |
| executable.sources().push_back(SourceFile("//baz/quz.c")); | |
| executable.SetToolchain(setup.toolchain()); | |
| executable.visibility().SetPublic(); | |
| ASSERT_TRUE(executable.OnResolved(&err)); | |
| Target bundle_data(setup.settings(), Label(SourceDir("//foo/"), "data")); | |
| bundle_data.set_output_type(Target::BUNDLE_DATA); | |
| bundle_data.sources().push_back(SourceFile("//foo/input1.txt")); | |
| bundle_data.sources().push_back(SourceFile("//foo/input2.txt")); | |
| bundle_data.action_values().outputs() = SubstitutionList::MakeForTest( | |
| "{{bundle_resources_dir}}/{{source_file_part}}"); | |
| bundle_data.SetToolchain(setup.toolchain()); | |
| bundle_data.visibility().SetPublic(); | |
| ASSERT_TRUE(bundle_data.OnResolved(&err)); | |
| Target create_bundle( | |
| setup.settings(), | |
| Label(SourceDir("//baz/"), "bar", setup.toolchain()->label().dir(), | |
| setup.toolchain()->label().name())); | |
| SetupBundleDataDir(&create_bundle.bundle_data(), "//out/Debug"); | |
| create_bundle.set_output_type(Target::CREATE_BUNDLE); | |
| create_bundle.bundle_data().set_post_processing_script( | |
| SourceFile("//build/codesign.py")); | |
| create_bundle.bundle_data().post_processing_sources().push_back( | |
| SourceFile("//out/Debug/quz")); | |
| create_bundle.bundle_data().post_processing_outputs() = | |
| SubstitutionList::MakeForTest( | |
| "//out/Debug/bar.bundle/Contents/quz", | |
| "//out/Debug/bar.bundle/_CodeSignature/CodeResources"); | |
| create_bundle.bundle_data().post_processing_args() = | |
| SubstitutionList::MakeForTest("-b=quz", "bar.bundle"); | |
| create_bundle.public_deps().push_back(LabelTargetPair(&executable)); | |
| create_bundle.private_deps().push_back(LabelTargetPair(&bundle_data)); | |
| create_bundle.private_deps().push_back(LabelTargetPair(action.get())); | |
| create_bundle.SetToolchain(setup.toolchain()); | |
| ASSERT_TRUE(create_bundle.OnResolved(&err)); | |
| std::ostringstream out; | |
| NinjaCreateBundleTargetWriter writer(&create_bundle, out); | |
| writer.Run(); | |
| const char expected[] = | |
| "build phony/baz/bar.inputdeps: phony || ./quz phony/foo/bar " | |
| "phony/foo/data\n" | |
| "rule __baz_bar___toolchain_default__post_processing_rule\n" | |
| " command = ../../build/codesign.py -b=quz bar.bundle\n" | |
| " description = POST PROCESSING //baz:bar(//toolchain:default)\n" | |
| " restat = 1\n" | |
| "\n" | |
| "build bar.bundle/Contents/Resources/input1.txt: copy_bundle_data " | |
| "../../foo/input1.txt | phony/baz/bar.inputdeps\n" | |
| "build bar.bundle/Contents/Resources/input2.txt: copy_bundle_data " | |
| "../../foo/input2.txt | phony/baz/bar.inputdeps\n" | |
| "build phony/baz/bar.postprocessing.inputdeps: phony " | |
| "../../build/codesign.py " | |
| "quz " | |
| "bar.bundle/Contents/Resources/input1.txt " | |
| "bar.bundle/Contents/Resources/input2.txt | " | |
| "phony/baz/bar.inputdeps\n" | |
| "build bar.bundle/Contents/quz bar.bundle/_CodeSignature/CodeResources: " | |
| "__baz_bar___toolchain_default__post_processing_rule " | |
| "| phony/baz/bar.postprocessing.inputdeps\n" | |
| "build phony/baz/bar: phony " | |
| "bar.bundle/Contents/quz " | |
| "bar.bundle/_CodeSignature/CodeResources ./quz\n" | |
| "build bar.bundle: phony phony/baz/bar\n"; | |
| std::string out_str = out.str(); | |
| EXPECT_EQ(expected, out_str); | |
| } | |
| TEST(NinjaCreateBundleTargetWriter, PostProcessingNoStampFilesCustomToolchain) { | |
| Err err; | |
| TestWithScope setup; | |
| setup.build_settings()->set_no_stamp_files(true); | |
| Label other_toolchain_label(SourceDir("//other/"), "toolchain"); | |
| setup.settings()->set_toolchain_label(other_toolchain_label); | |
| std::unique_ptr<Target> action = NewAction(setup); | |
| ASSERT_TRUE(action->OnResolved(&err)) << err.message(); | |
| Target executable(setup.settings(), Label(SourceDir("//baz/"), "quz")); | |
| executable.set_output_type(Target::EXECUTABLE); | |
| executable.sources().push_back(SourceFile("//baz/quz.c")); | |
| executable.SetToolchain(setup.toolchain()); | |
| executable.visibility().SetPublic(); | |
| ASSERT_TRUE(executable.OnResolved(&err)); | |
| Target bundle_data(setup.settings(), Label(SourceDir("//foo/"), "data")); | |
| bundle_data.set_output_type(Target::BUNDLE_DATA); | |
| bundle_data.sources().push_back(SourceFile("//foo/input1.txt")); | |
| bundle_data.sources().push_back(SourceFile("//foo/input2.txt")); | |
| bundle_data.action_values().outputs() = SubstitutionList::MakeForTest( | |
| "{{bundle_resources_dir}}/{{source_file_part}}"); | |
| bundle_data.SetToolchain(setup.toolchain()); | |
| bundle_data.visibility().SetPublic(); | |
| ASSERT_TRUE(bundle_data.OnResolved(&err)); | |
| Target create_bundle( | |
| setup.settings(), | |
| Label(SourceDir("//baz/"), "bar", setup.toolchain()->label().dir(), | |
| setup.toolchain()->label().name())); | |
| SetupBundleDataDir(&create_bundle.bundle_data(), "//out/Debug"); | |
| create_bundle.set_output_type(Target::CREATE_BUNDLE); | |
| create_bundle.bundle_data().set_post_processing_script( | |
| SourceFile("//build/codesign.py")); | |
| create_bundle.bundle_data().post_processing_sources().push_back( | |
| SourceFile("//out/Debug/quz")); | |
| create_bundle.bundle_data().post_processing_outputs() = | |
| SubstitutionList::MakeForTest( | |
| "//out/Debug/bar.bundle/Contents/quz", | |
| "//out/Debug/bar.bundle/_CodeSignature/CodeResources"); | |
| create_bundle.bundle_data().post_processing_args() = | |
| SubstitutionList::MakeForTest("-b=quz", "bar.bundle"); | |
| create_bundle.public_deps().push_back(LabelTargetPair(&executable)); | |
| create_bundle.private_deps().push_back(LabelTargetPair(&bundle_data)); | |
| create_bundle.private_deps().push_back(LabelTargetPair(action.get())); | |
| create_bundle.SetToolchain(setup.toolchain()); | |
| ASSERT_TRUE(create_bundle.OnResolved(&err)); | |
| std::ostringstream out; | |
| NinjaCreateBundleTargetWriter writer(&create_bundle, out); | |
| writer.Run(); | |
| const char expected[] = | |
| "build toolchain/phony/baz/bar.inputdeps: phony || ./quz " | |
| "toolchain/phony/foo/bar " | |
| "toolchain/phony/foo/data\n" | |
| "rule __baz_bar___toolchain_default__post_processing_rule\n" | |
| " command = ../../build/codesign.py -b=quz bar.bundle\n" | |
| " description = POST PROCESSING //baz:bar(//toolchain:default)\n" | |
| " restat = 1\n" | |
| "\n" | |
| "build bar.bundle/Contents/Resources/input1.txt: " | |
| "toolchain_copy_bundle_data " | |
| "../../foo/input1.txt | toolchain/phony/baz/bar.inputdeps\n" | |
| "build bar.bundle/Contents/Resources/input2.txt: " | |
| "toolchain_copy_bundle_data " | |
| "../../foo/input2.txt | toolchain/phony/baz/bar.inputdeps\n" | |
| "build toolchain/phony/baz/bar.postprocessing.inputdeps: phony " | |
| "../../build/codesign.py " | |
| "quz " | |
| "bar.bundle/Contents/Resources/input1.txt " | |
| "bar.bundle/Contents/Resources/input2.txt | " | |
| "toolchain/phony/baz/bar.inputdeps\n" | |
| "build bar.bundle/Contents/quz bar.bundle/_CodeSignature/CodeResources: " | |
| "__baz_bar___toolchain_default__post_processing_rule " | |
| "| toolchain/phony/baz/bar.postprocessing.inputdeps\n" | |
| "build toolchain/phony/baz/bar: phony " | |
| "bar.bundle/Contents/quz " | |
| "bar.bundle/_CodeSignature/CodeResources ./quz\n" | |
| "build bar.bundle: phony toolchain/phony/baz/bar\n"; | |
| std::string out_str = out.str(); | |
| EXPECT_EQ(expected, out_str); | |
| } |