1{ lib, stdenv, fetchFromGitHub
2, callPackage
3, fetchpatch
4, cmake, pkg-config, dbus, makeWrapper
5, boost
6, elfutils # for libdw
7, git
8, glib
9, glm
10, gtest
11, libbfd
12, libcap
13, libdwarf
14, libGL
15, libglvnd
16, lxc
17, mesa
18, properties-cpp
19, protobuf
20, protobufc
21, python3
22, runtimeShell
23, SDL2
24, SDL2_image
25, systemd
26, writeText
27, writeShellScript
28, nixosTests
29}:
30
31let
32
33 dbus-service = writeText "org.anbox.service" ''
34 [D-BUS Service]
35 Name=org.anbox
36 Exec=@out@/libexec/anbox-session-manager
37 '';
38
39 anbox-application-manager = writeShellScript "anbox-application-manager" ''
40 exec @out@/bin/anbox launch --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity
41 '';
42
43in
44
45stdenv.mkDerivation rec {
46 pname = "anbox";
47 version = "unstable-2023-02-03";
48
49 src = fetchFromGitHub {
50 owner = pname;
51 repo = pname;
52 rev = "ddf4c57ebbe3a2e46099087570898ab5c1e1f279";
53 hash = "sha256-QXWhatewiUDQ93cH1UZsYgbjUxpgB1ajtGFYZnKmabc=";
54 fetchSubmodules = true;
55 };
56
57 nativeBuildInputs = [
58 cmake
59 pkg-config
60 makeWrapper
61 protobufc
62 ];
63
64 buildInputs = [
65 boost
66 dbus
67 elfutils # libdw
68 glib
69 glm
70 gtest
71 libbfd
72 libcap
73 libdwarf
74 libGL
75 lxc
76 mesa
77 properties-cpp
78 protobuf
79 python3
80 SDL2 SDL2_image
81 systemd
82 ];
83
84 env.CXXFLAGS = toString [ "-include cstdint" ];
85
86 env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.cc.isGNU (toString [
87 "-Wno-error=redundant-move"
88 # Flag needed by GCC 12 but unrecognized by GCC 9 (aarch64-linux default now)
89 (lib.optionalString (lib.versionAtLeast stdenv.cc.version "12") "-Wno-error=mismatched-new-delete")
90 ]);
91
92 prePatch = ''
93 patchShebangs scripts
94
95 cat >cmake/FindGMock.cmake <<'EOF'
96 add_library(gtest INTERFACE)
97 target_include_directories(gtest INTERFACE ${gtest.dev}/include)
98 target_link_libraries(gtest INTERFACE ${gtest}/lib/libgtest.so ''${CMAKE_THREAD_LIBS_INIT})
99 add_dependencies(gtest GMock)
100
101 add_library(gtest_main INTERFACE)
102 target_include_directories(gtest_main INTERFACE ${gtest.dev}/include)
103 target_link_libraries(gtest_main INTERFACE ${gtest}/lib/libgtest_main.so gtest)
104
105 add_library(gmock INTERFACE)
106 target_include_directories(gmock INTERFACE ${gtest.dev}/include)
107 target_link_libraries(gmock INTERFACE ${gtest}/lib/libgmock.so gtest)
108
109 add_library(gmock_main INTERFACE)
110 target_include_directories(gmock_main INTERFACE ${gtest.dev}/include)
111 target_link_libraries(gmock_main INTERFACE ${gtest}/lib/libgmock_main.so gmock gtest_main)
112
113 set(GTEST_LIBRARIES gtest)
114 set(GTEST_MAIN_LIBRARIES gtest_main)
115 set(GMOCK_LIBRARIES gmock gmock_main)
116 set(GTEST_BOTH_LIBRARIES ''${GTEST_LIBRARIES} ''${GTEST_MAIN_LIBRARIES})
117 EOF
118 '';
119
120 patches = [
121 # Fixes compatibility with lxc 4
122 (fetchpatch {
123 url = "https://git.alpinelinux.org/aports/plain/community/anbox/lxc4.patch?id=64243590a16aee8d4e72061886fc1b15256492c3";
124 sha256 = "1da5xyzyjza1g2q9nbxb4p3njj2sf3q71vkpvmmdphia5qnb0gk5";
125 })
126 # Wait 10× more time when starting
127 # Not *strictly* needed, but helps a lot on slower hardware
128 (fetchpatch {
129 url = "https://git.alpinelinux.org/aports/plain/community/anbox/give-more-time-to-start.patch?id=058b56d4b332ef3379551b343bf31e0f2004321a";
130 sha256 = "0iiz3c7fgfgl0dvx8sf5hv7a961xqnihwpz6j8r0ib9v8piwxh9a";
131 })
132 # Ensures generated desktop files work on store path change
133 ./0001-NixOS-Use-anbox-from-PATH-in-desktop-files.patch
134 # Allows android-emugl to build with gtest 1.13+
135 ./0002-NixOS-Build-android-emugl-with-cpp-14.patch
136 # Provide window icons
137 (fetchpatch {
138 url = "https://github.com/samueldr/anbox/commit/2387f4fcffc0e19e52e58fb6f8264fbe87aafe4d.patch";
139 sha256 = "12lmr0kxw1n68g3abh1ak5awmpczfh75c26f53jc8qpvdvv1ywha";
140 })
141 ];
142
143 postInstall = ''
144 wrapProgram $out/bin/anbox \
145 --set SDL_VIDEO_X11_WMCLASS "anbox" \
146 --prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath [libGL libglvnd]} \
147 --prefix PATH : ${git}/bin
148
149 mkdir -p $out/share/dbus-1/services
150 substitute ${dbus-service} $out/share/dbus-1/services/org.anbox.service \
151 --subst-var out
152
153 mkdir $out/libexec
154 makeWrapper $out/bin/anbox $out/libexec/anbox-session-manager \
155 --add-flags session-manager
156
157 substitute ${anbox-application-manager} $out/bin/anbox-application-manager \
158 --subst-var out
159 chmod +x $out/bin/anbox-application-manager
160 '';
161
162 passthru.tests = { inherit (nixosTests) anbox; };
163 passthru.image = callPackage ./postmarketos-image.nix { };
164
165 meta = with lib; {
166 homepage = "https://anbox.io";
167 description = "Android in a box";
168 license = licenses.gpl2Only;
169 maintainers = with maintainers; [ edwtjo ];
170 platforms = [ "armv7l-linux" "aarch64-linux" "x86_64-linux" ];
171 };
172
173}