1{ lib, stdenv, fetchFromGitHub, fetchurl
2, cmake, pkg-config, dbus, makeWrapper
3, boost
4, elfutils # for libdw
5, git
6, glib
7, glm
8, gtest
9, libbfd
10, libcap
11, libdwarf
12, libGL
13, libglvnd
14, lxc
15, mesa
16, properties-cpp
17, protobuf
18, protobufc
19, python3
20, runtimeShell
21, SDL2
22, SDL2_image
23, systemd
24, writeText
25, writeScript
26}:
27
28let
29
30 dbus-service = writeText "org.anbox.service" ''
31 [D-BUS Service]
32 Name=org.anbox
33 Exec=@out@/libexec/anbox-session-manager
34 '';
35
36 anbox-application-manager = writeScript "anbox-application-manager" ''
37 #!${runtimeShell}
38
39 ${systemd}/bin/busctl --user call \
40 org.freedesktop.DBus \
41 /org/freedesktop/DBus \
42 org.freedesktop.DBus \
43 StartServiceByName "su" org.anbox 0
44
45 @out@/bin/anbox launch --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity
46 '';
47
48in
49
50stdenv.mkDerivation rec {
51 pname = "anbox";
52 version = "unstable-2020-11-29";
53
54 src = fetchFromGitHub {
55 owner = pname;
56 repo = pname;
57 rev = "6c10125a7f13908d2cbe56d2d9ab09872755f265";
58 sha256 = "00bqssh4zcs0jj6w07b91719xkrpdw75vpcplwrvlhwsvl55f901";
59 fetchSubmodules = true;
60 };
61
62 nativeBuildInputs = [
63 cmake
64 pkg-config
65 makeWrapper
66 ];
67
68 buildInputs = [
69 boost
70 dbus
71 elfutils # libdw
72 glib
73 glm
74 gtest
75 libbfd
76 libcap
77 libdwarf
78 libGL
79 lxc
80 mesa
81 properties-cpp
82 protobuf protobufc
83 python3
84 SDL2 SDL2_image
85 systemd
86 ];
87
88 patchPhase = ''
89 patchShebangs scripts
90
91 cat >cmake/FindGMock.cmake <<'EOF'
92 add_library(gtest INTERFACE)
93 target_include_directories(gtest INTERFACE ${gtest.dev}/include)
94 target_link_libraries(gtest INTERFACE ${gtest}/lib/libgtest.so ''${CMAKE_THREAD_LIBS_INIT})
95 add_dependencies(gtest GMock)
96
97 add_library(gtest_main INTERFACE)
98 target_include_directories(gtest_main INTERFACE ${gtest.dev}/include)
99 target_link_libraries(gtest_main INTERFACE ${gtest}/lib/libgtest_main.so gtest)
100
101 add_library(gmock INTERFACE)
102 target_include_directories(gmock INTERFACE ${gtest.dev}/include)
103 target_link_libraries(gmock INTERFACE ${gtest}/lib/libgmock.so gtest)
104
105 add_library(gmock_main INTERFACE)
106 target_include_directories(gmock_main INTERFACE ${gtest.dev}/include)
107 target_link_libraries(gmock_main INTERFACE ${gtest}/lib/libgmock_main.so gmock gtest_main)
108
109 set(GTEST_LIBRARIES gtest)
110 set(GTEST_MAIN_LIBRARIES gtest_main)
111 set(GMOCK_LIBRARIES gmock gmock_main)
112 set(GTEST_BOTH_LIBRARIES ''${GTEST_LIBRARIES} ''${GTEST_MAIN_LIBRARIES})
113 EOF
114 '';
115
116 postInstall = ''
117 wrapProgram $out/bin/anbox \
118 --prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath [libGL libglvnd]} \
119 --prefix PATH : ${git}/bin
120
121 mkdir -p $out/share/dbus-1/services
122 substitute ${dbus-service} $out/share/dbus-1/services/org.anbox.service \
123 --subst-var out
124
125 mkdir $out/libexec
126 makeWrapper $out/bin/anbox $out/libexec/anbox-session-manager \
127 --add-flags session-manager
128
129 substitute ${anbox-application-manager} $out/bin/anbox-application-manager \
130 --subst-var out
131 '';
132
133 passthru.image = let
134 imgroot = "https://build.anbox.io/android-images";
135 in
136 {
137 armv7l-linux = fetchurl {
138 url = imgroot + "/2017/06/12/android_1_armhf.img";
139 sha256 = "1za4q6vnj8wgphcqpvyq1r8jg6khz7v6b7h6ws1qkd5ljangf1w5";
140 };
141 aarch64-linux = fetchurl {
142 url = imgroot + "/2017/08/04/android_1_arm64.img";
143 sha256 = "02yvgpx7n0w0ya64y5c7bdxilaiqj9z3s682l5s54vzfnm5a2bg5";
144 };
145 x86_64-linux = fetchurl {
146 url = imgroot + "/2018/07/19/android_amd64.img";
147 sha256 = "1jlcda4q20w30cm9ikm6bjq01p547nigik1dz7m4v0aps4rws13b";
148 };
149 }.${stdenv.system} or null;
150
151 meta = with lib; {
152 homepage = "https://anbox.io";
153 description = "Android in a box";
154 license = licenses.gpl2;
155 maintainers = with maintainers; [ edwtjo ];
156 platforms = [ "armv7l-linux" "aarch64-linux" "x86_64-linux" ];
157 };
158
159}