]> git.tdb.fi Git - builder.git/blob - source/androidapplicationcomponent.cpp
Inline simple constructors
[builder.git] / source / androidapplicationcomponent.cpp
1 #include <msp/core/algorithm.h>
2 #include <msp/fs/utils.h>
3 #include <msp/strings/format.h>
4 #include "androidapplicationcomponent.h"
5 #include "androidmanifestfile.h"
6 #include "androidresourcefile.h"
7 #include "builder.h"
8 #include "installedfile.h"
9 #include "sharedlibrary.h"
10 #include "sourcepackage.h"
11 #include "tool.h"
12 #include "toolchain.h"
13
14 using namespace std;
15 using namespace Msp;
16
17 void AndroidApplicationComponent::create_targets() const
18 {
19         Builder &builder = package.get_builder();
20         BuildGraph &build_graph = builder.get_build_graph();
21
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());
27
28         AndroidManifestFile *manifest = new AndroidManifestFile(builder, *this);
29         manifest->set_orientation(orientation);
30         for(const string &p: permissions)
31                 manifest->add_permission(p);
32
33         vector<Target *> resource_sources;
34         resource_sources.push_back(manifest);
35
36         const Toolchain &toolchain = builder.get_toolchain();
37         Tool &copy = toolchain.get_tool("CP");
38         for(const FS::Path &s: collect_source_files())
39         {
40                 Target *tgt = new AndroidResourceFile(builder, *this, s);
41                 resource_sources.push_back(copy.create_target(*tgt, "//"));
42         }
43
44         Tool &aapt = toolchain.get_tool("AAPT");
45         Target *resource_bundle = aapt.create_target(resource_sources);
46
47         vector<Target *> apk_sources;
48         apk_sources.reserve(1+contents.size());
49         apk_sources.push_back(resource_bundle);
50
51         const Architecture &arch = package.get_builder().get_current_arch();
52         string lib_dir = format("//%s/lib/", name);
53         if(arch.get_type()=="arm")
54         {
55                 lib_dir += "armeabi";
56                 if(arch.get_cpu()=="armv7a")
57                         lib_dir += "-v7a";
58         }
59         else
60                 lib_dir += arch.get_type();
61
62         string assets_dir = format("//%s/assets", name);
63         for(Target *t: contents)
64         {
65                 Target *staged = 0;
66                 if(SharedLibrary *shlib = dynamic_cast<SharedLibrary *>(t))
67                 {
68                         manifest->set_native_library(shlib);
69                         staged = copy.create_target(*t, lib_dir);
70                 }
71                 else
72                         staged = copy.create_target(*t, assets_dir);
73                 apk_sources.push_back(staged);
74         }
75
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);
79 }
80
81
82 AndroidApplicationComponent::Loader::Loader(AndroidApplicationComponent &c):
83         DataFile::DerivedObjectLoader<AndroidApplicationComponent, Component::Loader>(c)
84 {
85         add("orientation", &AndroidApplicationComponent::orientation);
86         add("permission", &Loader::permission);
87 }
88
89 void AndroidApplicationComponent::Loader::permission(const string &perm)
90 {
91         if(!any_equals(obj.permissions, perm))
92                 obj.permissions.push_back(perm);
93 }