]> git.tdb.fi Git - builder.git/blob - source/androidapplicationcomponent.cpp
1aab7355009444a8e98c6c136b9232e633a9c90c
[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 AndroidApplicationComponent::AndroidApplicationComponent(SourcePackage &p, const string &n):
18         Component(p, n)
19 { }
20
21 void AndroidApplicationComponent::create_targets() const
22 {
23         Builder &builder = package.get_builder();
24         BuildGraph &build_graph = builder.get_build_graph();
25
26         vector<Target *> contents;
27         for(const auto &kvp: build_graph.get_targets())
28                 if(kvp.second->get_package()==&package)
29                         if(InstalledFile *inst = dynamic_cast<InstalledFile *>(kvp.second))
30                                 contents.push_back(inst->get_real_target());
31
32         AndroidManifestFile *manifest = new AndroidManifestFile(builder, *this);
33         manifest->set_orientation(orientation);
34         for(const string &p: permissions)
35                 manifest->add_permission(p);
36
37         vector<Target *> resource_sources;
38         resource_sources.push_back(manifest);
39
40         const Toolchain &toolchain = builder.get_toolchain();
41         Tool &copy = toolchain.get_tool("CP");
42         for(const FS::Path &s: collect_source_files())
43         {
44                 Target *tgt = new AndroidResourceFile(builder, *this, s);
45                 resource_sources.push_back(copy.create_target(*tgt, "//"));
46         }
47
48         Tool &aapt = toolchain.get_tool("AAPT");
49         Target *resource_bundle = aapt.create_target(resource_sources);
50
51         vector<Target *> apk_sources;
52         apk_sources.reserve(1+contents.size());
53         apk_sources.push_back(resource_bundle);
54
55         const Architecture &arch = package.get_builder().get_current_arch();
56         string lib_dir = format("//%s/lib/", name);
57         if(arch.get_type()=="arm")
58         {
59                 lib_dir += "armeabi";
60                 if(arch.get_cpu()=="armv7a")
61                         lib_dir += "-v7a";
62         }
63         else
64                 lib_dir += arch.get_type();
65
66         string assets_dir = format("//%s/assets", name);
67         for(Target *t: contents)
68         {
69                 Target *staged = 0;
70                 if(SharedLibrary *shlib = dynamic_cast<SharedLibrary *>(t))
71                 {
72                         manifest->set_native_library(shlib);
73                         staged = copy.create_target(*t, lib_dir);
74                 }
75                 else
76                         staged = copy.create_target(*t, assets_dir);
77                 apk_sources.push_back(staged);
78         }
79
80         Tool &apk_builder = toolchain.get_tool("APK");
81         Target *apk = apk_builder.create_target(apk_sources);
82         builder.get_build_graph().add_primary_target(*apk);
83 }
84
85
86 AndroidApplicationComponent::Loader::Loader(AndroidApplicationComponent &c):
87         DataFile::DerivedObjectLoader<AndroidApplicationComponent, Component::Loader>(c)
88 {
89         add("orientation", &AndroidApplicationComponent::orientation);
90         add("permission", &Loader::permission);
91 }
92
93 void AndroidApplicationComponent::Loader::permission(const string &perm)
94 {
95         if(!any_equals(obj.permissions, perm))
96                 obj.permissions.push_back(perm);
97 }