]> git.tdb.fi Git - builder.git/blob - source/androidapplicationcomponent.cpp
A bunch of new tools and targets to build Android packages
[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         const BuildGraph::TargetMap &targets = build_graph.get_targets();
25         list<Target *> contents;
26         for(BuildGraph::TargetMap::const_iterator i=targets.begin(); i!=targets.end(); ++i)
27                 if(i->second->get_package()==&package)
28                         if(InstalledFile *inst = dynamic_cast<InstalledFile *>(i->second))
29                                 contents.push_back(inst->get_real_target());
30
31         AndroidManifestFile *manifest = new AndroidManifestFile(builder, *this);
32
33         list<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         SourceList source_filenames = collect_source_files();
39         for(SourceList::const_iterator i=source_filenames.begin(); i!=source_filenames.end(); ++i)
40         {
41                 Target *tgt = new AndroidResourceFile(builder, *this, *i);
42                 resource_sources.push_back(copy.create_target(*tgt, "//"));
43         }
44
45         Tool &aapt = toolchain.get_tool("AAPT");
46         Target *resource_bundle = aapt.create_target(resource_sources);
47
48         list<Target *> apk_sources;
49         apk_sources.push_back(resource_bundle);
50
51         const Architecture &arch = package.get_builder().get_current_arch();
52         string lib_dir = "//"+name+"/lib/";
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 = "//"+name+"/assets";
63         for(list<Target *>::const_iterator i=contents.begin(); i!=contents.end(); ++i)
64         {
65                 Target *staged = 0;
66                 if(SharedLibrary *shlib = dynamic_cast<SharedLibrary *>(*i))
67                 {
68                         manifest->set_native_library(shlib);
69                         staged = copy.create_target(**i, lib_dir);
70                 }
71                 else
72                         staged = copy.create_target(**i, 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 }