;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2012 Stefan Handschuh ;;; Copyright © 2015 Kai-Chung Yan ;;; Copyright © 2016 Marius Bakke ;;; Copyright © 2017 Julien Lepiller ;;; Copyright © 2017 Hartmut Goebel ;;; Copyright © 2017 Maxim Cournoyer ;;; Copyright © 2018 Tobias Geerinckx-Rice ;;; ;;; This file is part of GNU Guix. ;;; ;;; GNU Guix is free software; you can redistribute it and/or modify it ;;; under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 3 of the License, or (at ;;; your option) any later version. ;;; ;;; GNU Guix is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with GNU Guix. If not, see . (define-module (gnu packages android) #:use-module (guix packages) #:use-module (guix download) #:use-module (guix git-download) #:use-module (guix build-system gnu) #:use-module (guix build-system android-ndk) #:use-module (guix build-system python) #:use-module (guix build-system trivial) #:use-module ((guix licenses) #:prefix license:) #:use-module (gnu packages) #:use-module (gnu packages check) #:use-module (gnu packages compression) #:use-module (gnu packages gnupg) #:use-module (gnu packages pcre) #:use-module (gnu packages python) #:use-module (gnu packages selinux) #:use-module (gnu packages ssh) #:use-module (gnu packages version-control) #:use-module (gnu packages tls) #:use-module (gnu packages linux)) (define-public android-make-stub (package (name "android-make-stub") (version "0.4") (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/daym/android-make-stub.git") (commit (string-append "v" version)))) (file-name (string-append "android-make-stub-" version "-checkout")) (sha256 (base32 "069bcldva63qbda7c8j6kyf9z28qnygszqfkgzq48hmkfmjrhbqg")))) (build-system gnu-build-system) (arguments `(#:tests? #f ; None exist. #:phases (modify-phases %standard-phases (delete 'configure) (delete 'build) (replace 'install (lambda* (#:key outputs #:allow-other-keys) (let* ((out (assoc-ref outputs "out"))) (invoke "make" (string-append "prefix=" out) "install") #t)))))) (home-page "https://github.com/daym/android-make-stub") (synopsis "Stubs for the @command{make} system of the Android platform") (description "@code{android-make-stub} provides stubs for the @command{make} system of the Android platform. This allows us to use their packages mostly unmodified in our Android NDK build system.") (license license:asl2.0))) ;; The Makefiles that we add are largely based on the Debian ;; packages. They are licensed under GPL-2 and have copyright: ;; 2012, Stefan Handschuh ;; 2015, Kai-Chung Yan ;; Big thanks to them for laying the groundwork. ;; The version tag is consistent between all repositories. (define (android-platform-version) "7.1.2_r6") (define (android-platform-system-core version) (origin (method git-fetch) (uri (git-reference (url "https://android.googlesource.com/platform/system/core") (commit (string-append "android-" version)))) (file-name (string-append "android-platform-system-core-" version "-checkout")) (sha256 (base32 "0xc2n7jxrf1iw9cc278pijdfjix2fkiig5ws27f6rwp40zg5mrgg")) (patches (search-patches "libbase-use-own-logging.patch" "libbase-fix-includes.patch" "libutils-remove-damaging-includes.patch" "libutils-add-includes.patch" "adb-add-libraries.patch" "libziparchive-add-includes.patch")))) (define (android-platform-system-extras version) (origin (method git-fetch) (uri (git-reference (url "https://android.googlesource.com/platform/system/extras") (commit (string-append "android-" version)))) (file-name (string-append "android-platform-system-extras-" version "-checkout")) (sha256 (base32 "18130c23ybqcpgjc5v6f8kdbv2xn39hyiaj17dzldjb9rlwzcyy9")))) (define (android-platform-bionic version) (origin (method git-fetch) (uri (git-reference (url "https://android.googlesource.com/platform/bionic") (commit (string-append "android-" version)))) (file-name (string-append "android-platform-bionic-" version "-checkout")) (sha256 (base32 "0n9wkz3ynqw39if1ss9n32m66iga14nndf29hpm7g1aqn4wvvgzk")))) (define (android-platform-external version subdirectory checksum) (origin (method git-fetch) (uri (git-reference (url (string-append "https://android.googlesource.com/platform/external/" subdirectory)) (commit (string-append "android-" version)))) (file-name (string-append "android-platform-system-external-" subdirectory "-" version "-checkout")) (sha256 (base32 checksum)))) (define liblog (package (name "liblog") (version (android-platform-version)) (source (android-platform-system-core version)) (build-system android-ndk-build-system) (arguments `(#:tests? #f ; TODO. #:make-flags '("CC=gcc") #:phases (modify-phases %standard-phases (add-after 'unpack 'enter-source (lambda _ (chdir "liblog") #t))))) (home-page "https://developer.android.com/") (synopsis "Logging library from the Android platform.") (description "@code{liblog} represents an interface to the volatile Android Logging system for NDK (Native) applications and libraries and contain interfaces for either writing or reading logs. The log buffers are divided up in Main, System, Radio and Events sub-logs.") (license license:asl2.0))) (define libbase (package (name "libbase") (version (android-platform-version)) (source (android-platform-system-core version)) (build-system android-ndk-build-system) (arguments `(#:tests? #f ; TODO. #:make-flags '("CXXFLAGS=-std=gnu++11") #:phases (modify-phases %standard-phases (add-after 'unpack 'enter-source (lambda _ (chdir "base") #t))))) (inputs `(("liblog" ,liblog))) (home-page "https://developer.android.com/") (synopsis "Android platform base library") (description "@code{libbase} is a library in common use by the various Android core host applications.") (license license:asl2.0))) (define libcutils (package (name "libcutils") (version (android-platform-version)) (source (android-platform-system-core version)) (build-system gnu-build-system) (arguments `(#:tests? #f ; TODO. #:phases (modify-phases %standard-phases (add-after 'unpack 'enter-source (lambda _ (chdir "libcutils") #t)) (add-after 'enter-source 'create-Makefile (lambda _ ;; No useful makefile is shipped, so we create one. (with-output-to-file "Makefile" (lambda _ (display (string-append "NAME = libcutils\n" "SOURCES = load_file.o socket_local_client_unix.o" " socket_loopback_client_unix.o socket_network_client_unix.o" " socket_loopback_server_unix.o socket_local_server_unix.o" " sockets_unix.o socket_inaddr_any_server_unix.o" " sockets.o\n" "CC = gcc\n" "CFLAGS += -fPIC\n" "CXXFLAGS += -std=gnu++11 -fPIC\n" "CPPFLAGS += -Iinclude -I../include\n" "LDFLAGS += -shared -Wl,-soname,$(NAME).so.0\n" "build: $(SOURCES)\n" " $(CXX) $^ -o $(NAME).so.0 $(CXXFLAGS) $(CPPFLAGS)" " $(LDFLAGS)\n")) #t)))) (delete 'configure) (replace 'install (lambda* (#:key outputs #:allow-other-keys) (let* ((out (assoc-ref outputs "out")) (lib (string-append out "/lib")) (include (string-append out "/include"))) (install-file "libcutils.so.0" lib) (with-directory-excursion lib (symlink "libcutils.so.0" "libcutils.so")) (copy-recursively "../include/cutils" (string-append include "/cutils")) #t)))))) (home-page "https://developer.android.com/") (synopsis "Android platform c utils library") (description "@code{libcutils} is a library in common use by the various Android core host applications.") (license license:asl2.0))) (define-public android-libsparse (package (name "android-libsparse") (version (android-platform-version)) (source (android-platform-system-core version)) (build-system android-ndk-build-system) (arguments `(#:tests? #f ; TODO. #:make-flags '("CFLAGS=-Wno-error" "CXXFLAGS=-fpermissive -Wno-error") #:phases (modify-phases %standard-phases (add-after 'unpack 'enter-source (lambda _ (chdir "libsparse") #t))))) (inputs `(("zlib" ,zlib))) (home-page "https://developer.android.com/") (synopsis "Android platform sparse library") (description "@code{android-libsparse} is a library in common use by the various Android core host applications.") (license license:asl2.0))) (define-public android-libziparchive (package (name "android-libziparchive") (version (android-platform-version)) (source (android-platform-system-core version)) (build-system android-ndk-build-system) (arguments `(#:tests? #f ; TODO. #:make-flags '("CFLAGS=-Wno-error" "CXXFLAGS=-fpermissive -Wno-error -std=gnu++11") #:phases (modify-phases %standard-phases (add-after 'unpack 'enter-source (lambda _ (chdir "libziparchive") #t)) (add-after 'install 'install-headers (lambda* (#:key inputs outputs #:allow-other-keys) (let ((out (assoc-ref outputs "out"))) (copy-recursively "../include/ziparchive" (string-append out "/include/ziparchive")) #t)))))) (inputs `(("zlib" ,zlib))) (home-page "https://developer.android.com/") (synopsis "Android platform ZIP library") (description "@code{android-libziparchive} is a library in common use by the various Android core host applications.") (license license:asl2.0))) (define-public adb (package (name "adb") (version (android-platform-version)) (source (android-platform-system-core version)) (build-system android-ndk-build-system) (arguments `(#:tests? #f ; TODO. #:make-flags (list "CFLAGS=-Wno-error" "CXXFLAGS=-fpermissive -Wno-error -std=gnu++14 -D_Nonnull= -D_Nullable= -I ." (string-append "LDFLAGS=-Wl,-rpath=" (assoc-ref %outputs "out") "/lib " "-Wl,-rpath=" (assoc-ref %build-inputs "openssl") "/lib -L .")) #:phases (modify-phases %standard-phases (add-after 'unpack 'enter-source (lambda _ (chdir "adb") #t)) (add-after 'enter-source 'make-libs-available (lambda* (#:key inputs outputs #:allow-other-keys) (substitute* "Android.mk" (("libcrypto_static") "libcrypto")) #t)) (add-after 'install 'install-headers (lambda* (#:key inputs outputs #:allow-other-keys) (install-file "diagnose_usb.h" (string-append (assoc-ref outputs "out") "/include")) #t))))) (inputs `(("libbase" ,libbase) ("libcutils" ,libcutils) ("liblog" ,liblog) ("openssl" ,openssl))) (home-page "https://developer.android.com/studio/command-line/adb.html") (synopsis "Android Debug Bridge") (description "@command{adb} is a versatile command line tool that lets you communicate with an emulator instance or connected Android device. It facilitates a variety of device actions, such as installing and debugging apps, and it provides access to a Unix shell that can run commands on the connected device or emulator.") (license license:asl2.0))) (define-public mkbootimg (package (name "mkbootimg") (version (android-platform-version)) (source (origin (inherit (android-platform-system-core version)))) (build-system python-build-system) (arguments `(#:tests? #f #:phases (modify-phases %standard-phases (add-after 'unpack 'enter-source (lambda _ (chdir "mkbootimg") #t)) (delete 'configure) (delete 'build) (replace 'install (lambda* (#:key outputs #:allow-other-keys) (let* ((out (assoc-ref outputs "out")) (bin (string-append out "/bin")) (include (string-append out "/include"))) (install-file "mkbootimg" bin) (install-file "bootimg.h" include) #t)))))) (home-page "https://developer.android.com/studio/command-line/adb.html") (synopsis "Tool to create Android boot images") (description "This package provides a tool to create Android Boot Images.") (license license:asl2.0))) (define-public android-safe-iop (package (name "android-safe-iop") (version (android-platform-version)) (source (android-platform-external version "safe-iop" "1nyyrs463advjhlq8xx1lm37m4g5afv7gy0csxrj7biwwl0v13qw")) (build-system android-ndk-build-system) (arguments `(#:make-flags '("CXXFLAGS=-fpermissive -Wno-error") #:phases (modify-phases %standard-phases (add-before 'build 'patch-host (lambda _ ;; TODO: Cross-compile. (substitute* "Android.mk" (("BUILD_STATIC_LIBRARY") "BUILD_HOST_STATIC_LIBRARY")) #t))))) (home-page "https://developer.android.com/") (synopsis "Safe integers in C") (description "@code{android-safe-iop} provides a set of functions for performing and checking safe integer operations. Ensure that integer operations do not result in silent overflow.") (license license:bsd-2))) (define-public android-bionic-uapi (package (name "android-bionic-uapi") (version (android-platform-version)) (source (android-platform-bionic version)) (build-system android-ndk-build-system) (arguments `(#:phases (modify-phases %standard-phases (add-after 'unpack 'enter-source (lambda _ (chdir "libc") #t)) (replace 'check (const #t)) (replace 'build (const #t)) (replace 'install (lambda* (#:key outputs #:allow-other-keys) (let* ((out (assoc-ref outputs "out")) (out-sys (string-append out "/include/sys"))) (mkdir-p out-sys) (install-file "include/sys/system_properties.h" out-sys) (install-file "include/sys/_system_properties.h" out-sys) (copy-recursively "kernel/uapi" (string-append out "/include")) #t)))))) (home-page "https://developer.android.com/") (synopsis "Android Linux API that is safe for user space") (description "@code{android-bionic-uapi} provides the part of the Linux API that is safe to use for user space. It also includes @code{system_properties.h} and @code{_system_properties.h}.") (license license:asl2.0))) (define-public android-libselinux (package (name "android-libselinux") (version (android-platform-version)) (source (android-platform-external version "libselinux" "13m2q32gzdcs5d0zj1nwasjy1j8vsxsgbjg7m5sa9lfcjaj7nkm7")) (build-system android-ndk-build-system) (arguments ;; See logd/Android.mk for the *_LOG_TAG values. `(#:make-flags (list (string-append "CFLAGS=-Wno-error " "-I core/include " "-I core/libpackagelistparser/include " "-DAUDITD_LOG_TAG=1003 " "-DLOGD_LOG_TAG=1004 -D_GNU_SOURCE") "LDFLAGS=-L . -lpcre") #:phases (modify-phases %standard-phases (add-after 'unpack 'unpack-core (lambda* (#:key inputs #:allow-other-keys) (mkdir-p "core") (with-directory-excursion "core" (invoke "tar" "axf" (assoc-ref inputs "core") "--strip-components=1")) #t)) (add-after 'unpack-core 'patch-HOST (lambda _ ;; gettid duplicates otherwise. (substitute* "src/procattr.c" (("#ifdef HOST") "#ifdef XXX")) #t))))) (inputs `(("openssl" ,openssl))) (native-inputs `(("android-bionic-uapi" ,android-bionic-uapi) ("core" ,(android-platform-system-core version)) ;; pcre is inlined by our package. ("pcre" ,pcre))) (home-page "https://developer.android.com/") (synopsis (package-synopsis libselinux)) (description (package-description libselinux)) (license (package-license libselinux)))) (define-public android-ext4-utils (package (name "android-ext4-utils") (version (android-platform-version)) (source (android-platform-system-extras version)) (build-system android-ndk-build-system) (arguments `(#:tests? #f ; TODO. #:make-flags (list (string-append "CPPFLAGS=" ;"-Wno-error " "-I " (assoc-ref %build-inputs "android-libselinux") "/include " "-I " (assoc-ref %build-inputs "android-libsparse") "/include " "-I " (assoc-ref %build-inputs "libcutils") "/include " "-I " (assoc-ref %build-inputs "liblog") "/include " "-I ../core/include") "CFLAGS=-Wno-error" "install-libext4_utils_host.a" (string-append "prefix=" (assoc-ref %outputs "out"))) #:phases (modify-phases %standard-phases (add-after 'unpack 'unpack-core (lambda* (#:key inputs #:allow-other-keys) (mkdir-p "core") (with-directory-excursion "core" (invoke "tar" "axf" (assoc-ref inputs "android-core") "--strip-components=1")) #t)) (add-after 'unpack-core 'enter-source (lambda _ (chdir "ext4_utils") #t)) (replace 'install (lambda* (#:key inputs outputs #:allow-other-keys) (let ((out (assoc-ref outputs "out"))) (copy-recursively "." (string-append out "/include"))) #t))))) (inputs `(("libcutils" ,libcutils) ("liblog" ,liblog) ("android-libselinux" ,android-libselinux) ("android-libsparse" ,android-libsparse) ("zlib" ,zlib))) (native-inputs `(("android-core" ,(android-platform-system-core version)))) (home-page "https://developer.android.com/") (synopsis "Android ext4 filesystem utils") (description "@code{android-ext4-utils} is a library in common use by the Android core.") (license license:asl2.0))) (define-public android-f2fs-utils (package (name "android-f2fs-utils") (version (android-platform-version)) (source (android-platform-system-extras version)) (build-system android-ndk-build-system) (arguments `(#:tests? #f ; TODO. #:phases (modify-phases %standard-phases (add-after 'unpack 'enter-source (lambda _ (chdir "f2fs_utils") #t)) (add-after 'install 'install-headers (lambda* (#:key inputs outputs #:allow-other-keys) (copy-recursively "." (string-append (assoc-ref outputs "out") "/include")) #t))))) (inputs `(("f2fs-tools" ,f2fs-tools-1.7) ("android-libselinux" ,android-libselinux) ("android-libsparse" ,android-libsparse) ("libcutils" ,libcutils) ("zlib" ,zlib))) (home-page "https://developer.android.com/") (synopsis "Android ext4 utils") (description "@code{android-ext4-utils} is a library in common use by the Android core.") (license license:asl2.0))) (define-public android-libutils (package (name "android-libutils") (version (android-platform-version)) (source (android-platform-system-core version)) (build-system android-ndk-build-system) (arguments `(#:tests? #f ; TODO #:make-flags '("CXXFLAGS=-std=gnu++11 -Wno-error") #:phases (modify-phases %standard-phases (add-after 'unpack 'enter-source (lambda _ (chdir "libutils") #t)) (add-after 'install 'install-headers (lambda* (#:key inputs outputs #:allow-other-keys) (copy-recursively "../include/utils" (string-append (assoc-ref outputs "out") "/include/utils"))))))) (inputs `(("android-safe-iop" ,android-safe-iop) ("libcutils" ,libcutils))) (native-inputs `(("android-bionic-uapi" ,android-bionic-uapi))) (home-page "https://developer.android.com/") (synopsis "Android utility library") (description "@code{android-libutils} provides utilities for Android NDK developers.") (license license:asl2.0))) (define-public android-udev-rules (package (name "android-udev-rules") (version "20180112") (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/M0Rf30/android-udev-rules") (commit version))) (file-name (string-append name "-" version "-checkout")) (sha256 (base32 "13gj79nnd04szqlrrzzkdr6wi1fky08pi7x8xfbg0jj3d3v0giah")))) (build-system trivial-build-system) (native-inputs `(("source" ,source))) (arguments '(#:modules ((guix build utils)) #:builder (begin (use-modules (guix build utils)) (let ((source (assoc-ref %build-inputs "source"))) (install-file (string-append source "/51-android.rules") (string-append %output "/lib/udev/rules.d")))))) (home-page "https://github.com/M0Rf30/android-udev-rules") (synopsis "udev rules for Android devices") (description "Provides a set of udev rules to allow using Android devices with tools such as @command{adb} and @command{fastboot} without root privileges. This package is intended to be added as a rule to the @code{udev-service-type} in your @code{operating-system} configuration. Additionally, an @code{adbusers} group must be defined and your user added to it. @emph{Simply installing this package will not have any effect.} It is meant to be passed to the @code{udev} service.") (license license:gpl3+))) (define-public git-repo (package (name "git-repo") (version "1.12.37") (source (origin (method git-fetch) (uri (git-reference (url "https://gerrit.googlesource.com/git-repo") (commit (string-append "v" version)))) (file-name (string-append "git-repo-" version "-checkout")) (sha256 (base32 "0qp7jqhblv7xblfgpcq4n18dyjdv8shz7r60c3vnjxx2fngkj2jd")))) (build-system python-build-system) (arguments `(#:python ,python-2 ; code says: "Python 3 support is … experimental." #:phases (modify-phases %standard-phases (add-before 'build 'set-executable-paths (lambda* (#:key inputs outputs #:allow-other-keys) (let* ((out (assoc-ref outputs "out")) (git (assoc-ref inputs "git")) (gpg (assoc-ref inputs "gnupg")) (ssh (assoc-ref inputs "ssh"))) (substitute* '("repo" "git_command.py") (("^GIT = 'git' ") (string-append "GIT = '" git "/bin/git' "))) (substitute* "repo" ((" cmd = \\['gpg',") (string-append " cmd = ['" gpg "/bin/gpg',"))) (substitute* "git_config.py" ((" command_base = \\['ssh',") (string-append " command_base = ['" ssh "/bin/ssh',"))) #t))) (add-before 'build 'do-not-clone-this-source (lambda* (#:key outputs #:allow-other-keys) (let* ((out (assoc-ref outputs "out")) (repo-dir (string-append out "/share/" ,name))) (substitute* "repo" (("^def _FindRepo\\(\\):.*") (format #f " def _FindRepo(): '''Look for a repo installation, starting at the current directory.''' # Use the installed version of git-repo. repo_main = '~a/main.py' curdir = os.getcwd() olddir = None while curdir != '/' and curdir != olddir: dot_repo = os.path.join(curdir, repodir) if os.path.isdir(dot_repo): return (repo_main, dot_repo) else: olddir = curdir curdir = os.path.dirname(curdir) return None, '' # The remaining of this function is dead code. It was used to # find a git-checked-out version in the local project.\n" repo-dir)) ;; Neither clone, check out, nor verify the git repository (("(^\\s+)_Clone\\(.*\\)") "") (("(^\\s+)_Checkout\\(.*\\)") "") ((" rev = _Verify\\(.*\\)") " rev = None")) #t))) (delete 'build) ; nothing to build (replace 'check (lambda _ (zero? (system* "python" "-m" "nose")))) (replace 'install (lambda* (#:key outputs #:allow-other-keys) (let* ((out (assoc-ref outputs "out")) (bin-dir (string-append out "/bin")) (repo-dir (string-append out "/share/" ,name))) (mkdir-p bin-dir) (mkdir-p repo-dir) (copy-recursively "." repo-dir) (delete-file-recursively (string-append repo-dir "/tests")) (symlink (string-append repo-dir "/repo") (string-append bin-dir "/repo")) #t)))))) (inputs ;; TODO: Add git-remote-persistent-https once it is available in guix `(("git" ,git) ("gnupg" ,gnupg) ("ssh" ,openssh))) (native-inputs `(("nose" ,python2-nose))) (home-page "https://code.google.com/p/git-repo/") (synopsis "Helps to manage many Git repositories.") (description "Repo is a tool built on top of Git. Repo helps manage many Git repositories, does the uploads to revision control systems, and automates parts of the development workflow. Repo is not meant to replace Git, only to make it easier to work with Git. The repo command is an executable Python script that you can put anywhere in your path.") (license license:asl2.0))) (define-public abootimg (package (name "abootimg") (version "0.6") (source (origin (method url-fetch) (uri (string-append "http://http.debian.net/debian/pool/main/a/abootimg/" "abootimg_" version ".orig.tar.gz")) (sha256 (base32 "0sfc2k011l1ymv97821w89391gnqdh8pp0haz4sdcm5hx0axv2ba")))) (build-system gnu-build-system) (arguments `(#:tests? #f #:phases (modify-phases %standard-phases (replace 'configure (lambda _ (setenv "CC" "gcc") #t)) (replace 'install (lambda* (#:key outputs #:allow-other-keys) (let* ((out (assoc-ref outputs "out")) (bin (string-append out "/bin"))) (install-file "abootimg" bin) #t)))))) (inputs `(("libblkid" ,util-linux))) (home-page "https://ac100.grandou.net/abootimg") (synopsis "Tool for manipulating Android Boot Images") (description "This package provides a tool for manipulating old Android Boot Images. @code{abootimg} can work directly on block devices, or, the safest way, on a file image.") (license license:gpl2+)))