1 #include <msp/builder/builder.h>
2 #include <msp/builder/installedfile.h>
3 #include <msp/builder/sharedlibrary.h>
4 #include <msp/builder/sourcepackage.h>
5 #include <msp/builder/tool.h>
6 #include <msp/builder/toolchain.h>
7 #include <msp/core/algorithm.h>
8 #include <msp/fs/utils.h>
9 #include <msp/strings/format.h>
10 #include "androidapplicationcomponent.h"
11 #include "androidmanifestfile.h"
12 #include "androidresourcefile.h"
17 void AndroidApplicationComponent::create_targets() const
19 Builder &builder = package.get_builder();
20 BuildGraph &build_graph = builder.get_build_graph();
22 vector<Target *> contents;
23 for(const auto &kvp: build_graph.get_targets())
24 if(kvp.second->get_package()==&package)
25 if(InstalledFile *inst = dynamic_cast<InstalledFile *>(kvp.second))
26 contents.push_back(inst->get_real_target());
28 AndroidManifestFile *manifest = new AndroidManifestFile(builder, *this);
29 manifest->set_orientation(orientation);
30 for(const string &p: permissions)
31 manifest->add_permission(p);
33 vector<Target *> resource_sources;
34 resource_sources.push_back(manifest);
36 const Toolchain &toolchain = builder.get_toolchain();
37 Tool © = toolchain.get_tool("CP");
38 for(const FS::Path &s: collect_source_files())
40 Target *tgt = new AndroidResourceFile(builder, *this, s);
41 resource_sources.push_back(copy.create_target(*tgt, "//"));
44 Tool &aapt = toolchain.get_tool("AAPT");
45 Target *resource_bundle = aapt.create_target(resource_sources);
47 vector<Target *> apk_sources;
48 apk_sources.reserve(1+contents.size());
49 apk_sources.push_back(resource_bundle);
51 const Architecture &arch = package.get_builder().get_current_arch();
52 string lib_dir = format("//%s/lib/", name);
53 if(arch.get_type()=="arm")
56 if(arch.get_cpu()=="armv7a")
60 lib_dir += arch.get_type();
62 string assets_dir = format("//%s/assets", name);
63 for(Target *t: contents)
66 if(SharedLibrary *shlib = dynamic_cast<SharedLibrary *>(t))
68 manifest->set_native_library(shlib);
69 staged = copy.create_target(*t, lib_dir);
72 staged = copy.create_target(*t, assets_dir);
73 apk_sources.push_back(staged);
76 Tool &apk_builder = toolchain.get_tool("APK");
77 Target *apk = apk_builder.create_target(apk_sources);
78 builder.get_build_graph().add_primary_target(*apk);
82 AndroidApplicationComponent::Loader::Loader(AndroidApplicationComponent &c):
83 DataFile::DerivedObjectLoader<AndroidApplicationComponent, Component::Loader>(c)
85 add("orientation", &AndroidApplicationComponent::orientation);
86 add("permission", &Loader::permission);
89 void AndroidApplicationComponent::Loader::permission(const string &perm)
91 if(!any_equals(obj.permissions, perm))
92 obj.permissions.push_back(perm);