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