android.scm
| 1 | ;;; GNU Guix --- Functional package management for GNU |
| 2 | ;;; Copyright © 2012 Stefan Handschuh <handschuh.stefan@googlemail.com> |
| 3 | ;;; Copyright © 2015 Kai-Chung Yan <seamlikok@gmail.com> |
| 4 | ;;; Copyright © 2016 Marius Bakke <mbakke@fastmail.com> |
| 5 | ;;; Copyright © 2017 Julien Lepiller <julien@lepiller.eu> |
| 6 | ;;; |
| 7 | ;;; This file is part of GNU Guix. |
| 8 | ;;; |
| 9 | ;;; GNU Guix is free software; you can redistribute it and/or modify it |
| 10 | ;;; under the terms of the GNU General Public License as published by |
| 11 | ;;; the Free Software Foundation; either version 3 of the License, or (at |
| 12 | ;;; your option) any later version. |
| 13 | ;;; |
| 14 | ;;; GNU Guix is distributed in the hope that it will be useful, but |
| 15 | ;;; WITHOUT ANY WARRANTY; without even the implied warranty of |
| 16 | ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 17 | ;;; GNU General Public License for more details. |
| 18 | ;;; |
| 19 | ;;; You should have received a copy of the GNU General Public License |
| 20 | ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. |
| 21 | |
| 22 | (define-module (more packages android) |
| 23 | #:use-module (guix packages) |
| 24 | #:use-module (guix git-download) |
| 25 | #:use-module (guix build-system gnu) |
| 26 | #:use-module ((guix licenses) #:prefix license:) |
| 27 | #:use-module (gnu packages) |
| 28 | #:use-module (gnu packages tls)) |
| 29 | |
| 30 | ;; The Makefiles that we add are largely based on the Debian |
| 31 | ;; packages. They are licensed under GPL-2 and have copyright: |
| 32 | ;; 2012, Stefan Handschuh <handschuh.stefan@googlemail.com> |
| 33 | ;; 2015, Kai-Chung Yan <seamlikok@gmail.com> |
| 34 | ;; Big thanks to them for laying the groundwork. |
| 35 | |
| 36 | ;; The version tag is consistent between all repositories. |
| 37 | (define (android-platform-version) "7.1.2_r6") |
| 38 | |
| 39 | (define (android-platform-system-core version) |
| 40 | (origin |
| 41 | (method git-fetch) |
| 42 | (uri (git-reference |
| 43 | (url "https://android.googlesource.com/platform/system/core") |
| 44 | (commit (string-append "android-" version)))) |
| 45 | (file-name (string-append "android-platform-system-core-" |
| 46 | version "-checkout")) |
| 47 | (sha256 |
| 48 | (base32 |
| 49 | "0xc2n7jxrf1iw9cc278pijdfjix2fkiig5ws27f6rwp40zg5mrgg")))) |
| 50 | |
| 51 | (define liblog |
| 52 | (package |
| 53 | (name "liblog") |
| 54 | (version (android-platform-version)) |
| 55 | (source (android-platform-system-core version)) |
| 56 | (build-system gnu-build-system) |
| 57 | (arguments |
| 58 | `(#:tests? #f ; TODO. |
| 59 | #:make-flags '("CC=gcc") |
| 60 | #:phases |
| 61 | (modify-phases %standard-phases |
| 62 | (add-after 'unpack 'enter-source |
| 63 | (lambda _ (chdir "liblog") #t)) |
| 64 | (add-after 'enter-source 'create-Makefile |
| 65 | (lambda _ |
| 66 | ;; No useful makefile is shipped, so we create one. |
| 67 | (with-output-to-file "Makefile" |
| 68 | (lambda _ |
| 69 | (display |
| 70 | (string-append |
| 71 | "NAME = liblog\n" |
| 72 | "SOURCES = log_event_list.c log_event_write.c" |
| 73 | " logger_write.c config_write.c logger_name.c" |
| 74 | " logger_lock.c fake_log_device.c fake_writer.c" |
| 75 | " event_tag_map.c\n" |
| 76 | |
| 77 | "CFLAGS += -fvisibility=hidden -fPIC\n" |
| 78 | "CPPFLAGS += -I../include -DFAKE_LOG_DEVICE=1" |
| 79 | ;; Keep these two in sync with "liblog/Android.bp". |
| 80 | " -DLIBLOG_LOG_TAG=1005" |
| 81 | " -DSNET_EVENT_LOG_TAG=1397638484\n" |
| 82 | "LDFLAGS += -shared -Wl,-soname,$(NAME).so.0 -lpthread\n" |
| 83 | |
| 84 | "build: $(SOURCES)\n" |
| 85 | " $(CC) $^ -o $(NAME).so.0 $(CFLAGS) $(CPPFLAGS) $(LDFLAGS)\n")))))) |
| 86 | (delete 'configure) |
| 87 | (replace 'install |
| 88 | (lambda* (#:key outputs #:allow-other-keys) |
| 89 | (let* ((out (assoc-ref outputs "out")) |
| 90 | (lib (string-append out "/lib"))) |
| 91 | (install-file "liblog.so.0" lib) |
| 92 | (with-directory-excursion lib |
| 93 | (symlink "liblog.so.0" "liblog.so")) |
| 94 | #t)))))) |
| 95 | (home-page "https://developer.android.com/") |
| 96 | (synopsis "Logging library from the Android platform.") |
| 97 | (description "@code{liblog} represents an interface to the volatile Android |
| 98 | Logging system for NDK (Native) applications and libraries and contain |
| 99 | interfaces for either writing or reading logs. The log buffers are divided up |
| 100 | in Main, System, Radio and Events sub-logs.") |
| 101 | (license license:asl2.0))) |
| 102 | |
| 103 | (define libbase |
| 104 | (package |
| 105 | (name "libbase") |
| 106 | (version (android-platform-version)) |
| 107 | (source (origin |
| 108 | (inherit (android-platform-system-core version)) |
| 109 | (patches |
| 110 | (search-patches "libbase-use-own-logging.patch" |
| 111 | "libbase-fix-includes.patch")))) |
| 112 | (build-system gnu-build-system) |
| 113 | (arguments |
| 114 | `(#:tests? #f ; TODO. |
| 115 | #:phases |
| 116 | (modify-phases %standard-phases |
| 117 | (add-after 'unpack 'enter-source |
| 118 | (lambda _ (chdir "base") #t)) |
| 119 | (add-after 'enter-source 'create-Makefile |
| 120 | (lambda _ |
| 121 | ;; No useful makefile is shipped, so we create one. |
| 122 | (with-output-to-file "Makefile" |
| 123 | (lambda _ |
| 124 | (display |
| 125 | (string-append |
| 126 | "NAME = libbase\n" |
| 127 | "SOURCES = file.cpp logging.cpp parsenetaddress.cpp" |
| 128 | " stringprintf.cpp strings.cpp errors_unix.cpp\n" |
| 129 | |
| 130 | "CXXFLAGS += -std=gnu++11 -fPIC\n" |
| 131 | "CPPFLAGS += -Iinclude -I../include\n" |
| 132 | "LDFLAGS += -shared -Wl,-soname,$(NAME).so.0" |
| 133 | " -L.. -llog\n" |
| 134 | |
| 135 | "build: $(SOURCES)\n" |
| 136 | " $(CXX) $^ -o $(NAME).so.0 $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS)\n" |
| 137 | )))))) |
| 138 | (delete 'configure) |
| 139 | (replace 'install |
| 140 | (lambda* (#:key outputs #:allow-other-keys) |
| 141 | (let* ((out (assoc-ref outputs "out")) |
| 142 | (lib (string-append out "/lib"))) |
| 143 | (install-file "libbase.so.0" lib) |
| 144 | (with-directory-excursion lib |
| 145 | (symlink "libbase.so.0" "libbase.so")) |
| 146 | (copy-recursively "include" out) |
| 147 | #t)))))) |
| 148 | (inputs `(("liblog" ,liblog))) |
| 149 | (home-page "https://developer.android.com/") |
| 150 | (synopsis "Android platform base library") |
| 151 | (description "@code{libbase} is a library in common use by the |
| 152 | various Android core host applications.") |
| 153 | (license license:asl2.0))) |
| 154 | |
| 155 | (define libcutils |
| 156 | (package |
| 157 | (name "libcutils") |
| 158 | (version (android-platform-version)) |
| 159 | (source (android-platform-system-core version)) |
| 160 | (build-system gnu-build-system) |
| 161 | (arguments |
| 162 | `(#:tests? #f ; TODO. |
| 163 | #:phases |
| 164 | (modify-phases %standard-phases |
| 165 | (add-after 'unpack 'enter-source |
| 166 | (lambda _ (chdir "libcutils") #t)) |
| 167 | (add-after 'enter-source 'create-Makefile |
| 168 | (lambda _ |
| 169 | ;; No useful makefile is shipped, so we create one. |
| 170 | (with-output-to-file "Makefile" |
| 171 | (lambda _ |
| 172 | (display |
| 173 | (string-append |
| 174 | "NAME = libcutils\n" |
| 175 | "SOURCES = load_file.o socket_local_client_unix.o" |
| 176 | " socket_loopback_client_unix.o socket_network_client_unix.o" |
| 177 | " socket_loopback_server_unix.o socket_local_server_unix.o" |
| 178 | " sockets_unix.o socket_inaddr_any_server_unix.o" |
| 179 | " sockets.o\n" |
| 180 | "CC = gcc\n" |
| 181 | |
| 182 | "CFLAGS += -fPIC\n" |
| 183 | "CXXFLAGS += -std=gnu++11 -fPIC\n" |
| 184 | "CPPFLAGS += -Iinclude -I../include\n" |
| 185 | "LDFLAGS += -shared -Wl,-soname,$(NAME).so.0\n" |
| 186 | |
| 187 | "build: $(SOURCES)\n" |
| 188 | " $(CXX) $^ -o $(NAME).so.0 $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS)\n" |
| 189 | )))))) |
| 190 | (delete 'configure) |
| 191 | (replace 'install |
| 192 | (lambda* (#:key outputs #:allow-other-keys) |
| 193 | (let* ((out (assoc-ref outputs "out")) |
| 194 | (lib (string-append out "/lib"))) |
| 195 | (install-file "libcutils.so.0" lib) |
| 196 | (with-directory-excursion lib |
| 197 | (symlink "libcutils.so.0" "libcutils.so")) |
| 198 | #t)))))) |
| 199 | (home-page "https://developer.android.com/") |
| 200 | (synopsis "Android platform c utils library") |
| 201 | (description "@code{libcutils} is a library in common use by the |
| 202 | various Android core host applications.") |
| 203 | (license license:asl2.0))) |
| 204 | |
| 205 | (define-public adb |
| 206 | (package |
| 207 | (name "adb") |
| 208 | (version (android-platform-version)) |
| 209 | (source (origin |
| 210 | (inherit (android-platform-system-core version)) |
| 211 | (patches |
| 212 | (search-patches "libbase-use-own-logging.patch" |
| 213 | "libbase-fix-includes.patch")))) |
| 214 | (build-system gnu-build-system) |
| 215 | (arguments |
| 216 | `(#:phases |
| 217 | (modify-phases %standard-phases |
| 218 | (add-after 'unpack 'enter-source |
| 219 | (lambda _ (chdir "adb") #t)) |
| 220 | (add-before 'build 'fix-clang |
| 221 | (lambda _ |
| 222 | (substitute* "adb_client.h" |
| 223 | (("_Nonnull") "") |
| 224 | (("_Nullable") "")))) |
| 225 | (add-before 'build 'fix-main |
| 226 | (lambda _ |
| 227 | (copy-file "client/main.cpp" "adb_main.cpp"))) |
| 228 | (add-after 'enter-source 'create-Makefile |
| 229 | (lambda* (#:key outputs #:allow-other-keys) |
| 230 | ;; No useful makefile is shipped, so we create one. |
| 231 | (with-output-to-file "Makefile" |
| 232 | (lambda _ |
| 233 | (display |
| 234 | (string-append |
| 235 | ;; Common for all components. |
| 236 | "CXXFLAGS += -std=gnu++14 -fpermissive\n" |
| 237 | "CPPFLAGS += -I../include -I../base/include -I. -DADB_HOST=1 " |
| 238 | "-DADB_REVISION='\"" ,version "\"' -fPIC\n" |
| 239 | "LDFLAGS += -lcrypto -lpthread -lbase -lcutils -L. -ladb\n" |
| 240 | |
| 241 | ;; Libadb specifics. |
| 242 | "LIBADB_SOURCES = adb.cpp adb_auth.cpp adb_io.cpp " |
| 243 | "adb_listeners.cpp adb_trace.cpp adb_utils.cpp fdevent.cpp " |
| 244 | "sockets.cpp transport.cpp transport_local.cpp transport_usb.cpp " |
| 245 | "get_my_path_linux.cpp sysdeps_unix.cpp usb_linux.cpp " |
| 246 | "adb_auth_host.cpp diagnose_usb.cpp services.cpp " |
| 247 | "shell_service_protocol.cpp bugreport.cpp line_printer.cpp\n" |
| 248 | |
| 249 | "LIBADB_LDFLAGS += -shared -Wl,-soname,libadb.so.0 " |
| 250 | "-lcrypto -lpthread -lbase\n" |
| 251 | |
| 252 | ;; Adb specifics. |
| 253 | "ADB_SOURCES = adb_main.cpp console.cpp commandline.cpp " |
| 254 | "adb_client.cpp file_sync_client.cpp\n" |
| 255 | "ADB_LDFLAGS += -Wl,-rpath=" (assoc-ref outputs "out") "/lib\n" |
| 256 | |
| 257 | "build: libadb $(ADB_SOURCES)\n" |
| 258 | " $(CXX) $(ADB_SOURCES) -o adb $(CXXFLAGS) $(CPPFLAGS) " |
| 259 | "$(ADB_LDFLAGS) $(LDFLAGS)\n" |
| 260 | |
| 261 | "libadb: $(LIBADB_SOURCES)\n" |
| 262 | " $(CXX) $^ -o libadb.so.0 $(CXXFLAGS) $(CPPFLAGS) " |
| 263 | "$(LIBADB_LDFLAGS)\n" |
| 264 | " ln -sv libadb.so.0 libadb.so\n" |
| 265 | )))))) |
| 266 | (delete 'configure) |
| 267 | (replace 'install |
| 268 | (lambda* (#:key outputs #:allow-other-keys) |
| 269 | (let* ((out (assoc-ref outputs "out")) |
| 270 | (lib (string-append out "/lib")) |
| 271 | (bin (string-append out "/bin"))) |
| 272 | (install-file "libadb.so.0" lib) |
| 273 | (install-file "adb" bin) |
| 274 | (with-directory-excursion lib |
| 275 | (symlink "libadb.so.0" "libadb.so")) |
| 276 | #t)))) |
| 277 | ;; Test suite must be run with attached devices |
| 278 | #:tests? #f)) |
| 279 | (inputs |
| 280 | `(("libbase" ,libbase) |
| 281 | ("libcutils" ,libcutils) |
| 282 | ("openssl" ,openssl))) |
| 283 | (home-page "https://developer.android.com/studio/command-line/adb.html") |
| 284 | (synopsis "Android Debug Bridge") |
| 285 | (description |
| 286 | "@command{adb} is a versatile command line tool that lets you communicate |
| 287 | with an emulator instance or connected Android device. It facilitates a variety |
| 288 | of device actions, such as installing and debugging apps, and it provides access |
| 289 | to a Unix shell that can run commands on the connected device or emulator.") |
| 290 | (license license:asl2.0))) |
| 291 |