From e1067facc404655c021011266c42d5e643a87abd Mon Sep 17 00:00:00 2001
From: Julien Lepiller
Date: Sun, 11 Dec 2016 17:08:15 +0100
Subject: [PATCH] gnu: Add adb.
* gnu/packages/android.scm: New file.
* gnu/packages/patches/adb-fix-build.scm: New file.
* gnu/local.mk (GNU_SYSTEM_MODULES): Add them
---
gnu/local.mk | 2 +
gnu/packages/android.scm | 132 +++++++++++++++++++++++++++++++
gnu/packages/patches/adb-fix-build.patch | 67 ++++++++++++++++
3 files changed, 201 insertions(+)
create mode 100644 gnu/packages/android.scm
create mode 100644 gnu/packages/patches/adb-fix-build.patch
diff --git a/gnu/local.mk b/gnu/local.mk
index 98a7f65ca..2dcf7547b 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -40,6 +40,7 @@ GNU_SYSTEM_MODULES = \
%D%/packages/adns.scm \
%D%/packages/algebra.scm \
%D%/packages/aidc.scm \
+ %D%/packages/android.scm \
%D%/packages/animation.scm \
%D%/packages/anthy.scm \
%D%/packages/apl.scm \
@@ -463,6 +464,7 @@ dist_patch_DATA = \
%D%/packages/patches/abiword-explictly-cast-bools.patch \
%D%/packages/patches/abiword-wmf-version-lookup-fix.patch \
%D%/packages/patches/acl-hurd-path-max.patch \
+ %D%/packages/patches/adb-fix-build.patch \
%D%/packages/patches/aegis-constness-error.patch \
%D%/packages/patches/aegis-perl-tempdir1.patch \
%D%/packages/patches/aegis-perl-tempdir2.patch \
diff --git a/gnu/packages/android.scm b/gnu/packages/android.scm
new file mode 100644
index 000000000..f4aa02858
--- /dev/null
+++ b/gnu/packages/android.scm
@@ -0,0 +1,132 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2016 Julien Lepiller
+;;;
+;;; 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 ((srfi srfi-1) #:hide (zip))
+ #:use-module (gnu packages)
+ #:use-module ((guix licenses) #:prefix license:)
+ #:use-module (guix packages)
+ #:use-module (guix download)
+ #:use-module (guix git-download)
+ #:use-module (guix build-system gnu)
+ #:use-module (gnu packages tls)
+ #:use-module (gnu packages gcc)
+ #:use-module (gnu packages llvm))
+
+(define-public adb
+ (package
+ (name "adb")
+ (version "7.0.0_r21")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://android.googlesource.com/platform/system/core")
+ (commit (string-append "android-" version))))
+ (sha256
+ (base32
+ "0570iyxkknhfl6q4jif8569f6zxiqpg7vrgprk5jz2jjvz4wkd2h"))
+ (patches (search-patches "adb-fix-build.patch"))))
+ (build-system gnu-build-system)
+ (propagated-inputs `(("openssl" ,openssl)))
+ (arguments
+ `(#:parallel-build? #f
+ #:tests? #f
+ #:phases
+ (modify-phases %standard-phases
+ (delete 'configure)
+ (add-before 'build 'fix-clang
+ (lambda* (#:key inputs #:allow-other-keys)
+ (substitute* "adb/adb_client.h"
+ (("_Nonnull") "")
+ (("_Nullable") ""))))
+ (replace 'build
+ (lambda* (#:key inputs #:allow-other-keys)
+ (define (compile-c file)
+ (format #t "CC ~a\n" file)
+ (zero? (system* "gcc" "-o" (string-append file ".o")
+ "-std=gnu11" "-DLIBLOG_LOG_TAG=1005"
+ "-DFAKE_LOG_DEVICE=1" "-D_GNU_SOURCE"
+ "-Ilog/include" "-Iinclude" "-c"
+ file)))
+ (define (compile-cpp file)
+ (format #t "CPP ~a\n" file)
+ (zero? (system* "g++" "-o" (string-append file ".o")
+ "-std=gnu++14"
+ (string-append "-DADB_REVISION=" "\""
+ ,version "\"")
+ (string-append "-I" (assoc-ref inputs "gcc")
+ "/include/c++")
+ (string-append "-I" (assoc-ref inputs "gcc")
+ "/include/c++/backward")
+ (string-append "-I" (assoc-ref inputs "gcc")
+ "/include/c++/x86_64-unknown-linux-gnu")
+ "-DWORKAROUND_BUG6558362" "-D_GNU_SOURCE"
+ "-DADB_HOST=1" "-fpermissive"
+ "-Iinclude" "-Ibase/include"
+ "-Iadb" "-c" file)))
+ (define cpp-source
+ (list "adb/adb.cpp" "adb/adb_auth.cpp"
+ "adb/adb_io.cpp" "adb/adb_listeners.cpp"
+ "adb/adb_trace.cpp" "adb/adb_utils.cpp"
+ "adb/line_printer.cpp" "adb/sockets.cpp"
+ "adb/transport.cpp" "adb/transport_local.cpp"
+ "adb/transport_usb.cpp" "adb/sysdeps_unix.cpp"
+ "adb/fdevent.cpp" "adb/get_my_path_linux.cpp"
+ "adb/usb_linux.cpp" "adb/adb_auth_host.cpp"
+ "adb/shell_service_protocol.cpp"
+ "adb/console.cpp" "adb/commandline.cpp"
+ "adb/adb_client.cpp" "adb/services.cpp"
+ "adb/file_sync_client.cpp" "adb/client/main.cpp"
+ "base/file.cpp" "base/logging.cpp"
+ "base/parsenetaddress.cpp" "base/stringprintf.cpp"
+ "base/strings.cpp" "base/errors_unix.cpp"
+ "libcutils/sockets_unix.cpp" "libcutils/sockets.cpp"
+ "adb/diagnose_usb.cpp"))
+ (define c-source
+ (list "liblog/log_event_write.c" "liblog/fake_log_device.c"
+ "liblog/log_event_list.c" "liblog/logger_write.c"
+ "liblog/config_write.c" "liblog/logger_lock.c"
+ "liblog/fake_writer.c" "liblog/logger_name.c"
+ "libcutils/load_file.c"
+ "libcutils/socket_local_client_unix.c"
+ "libcutils/socket_loopback_client_unix.c"
+ "libcutils/socket_network_client_unix.c"
+ "libcutils/socket_loopback_server_unix.c"
+ "libcutils/socket_local_server_unix.c"
+ "libcutils/socket_inaddr_any_server_unix.c"))
+ (define (file-o list)
+ (string-join (map (lambda (str) (string-append str ".o"))
+ list)))
+ (map compile-c c-source)
+ (map compile-cpp cpp-source)
+ (zero?
+ (system
+ (string-append "g++ -o myadb -lrt -ldl -lpthread -lcrypto "
+ (file-o c-source) " " (file-o cpp-source))))))
+ (replace 'install
+ (lambda* (#:key outputs #:allow-other-keys)
+ (let ((bin (string-append (assoc-ref outputs "out") "/bin")))
+ (mkdir-p bin)
+ (copy-file "myadb" (string-append bin "/adb"))))))))
+ (home-page
+ "https://android.googlesource.com/platform/system/core/")
+ (synopsis "Android Debug Bridge")
+ (description "Allows you to communicate with your android device through the
+Android Debug Bridge.")
+ (license license:asl2.0))) ; and others for some files
+
diff --git a/gnu/packages/patches/adb-fix-build.patch b/gnu/packages/patches/adb-fix-build.patch
new file mode 100644
index 000000000..fc81d6849
--- /dev/null
+++ b/gnu/packages/patches/adb-fix-build.patch
@@ -0,0 +1,67 @@
+This patch fixes the build of adb on linux. It was taken from archlinux.
+diff --git a/adb/sysdeps.h b/adb/sysdeps.h
+index 75dcc86..867f3ec 100644
+--- a/adb/sysdeps.h
++++ b/adb/sysdeps.h
+@@ -25,6 +25,7 @@
+ #endif
+
+ #include
++#include
+
+ #include
+ #include
+@@ -831,7 +832,16 @@ static __inline__ int adb_is_absolute_host_path(const char* path) {
+
+ static __inline__ unsigned long adb_thread_id()
+ {
+- return (unsigned long)gettid();
++ // TODO: this function should be merged with GetThreadId
++#if defined(__BIONIC__)
++ return gettid();
++#elif defined(__APPLE__)
++ return syscall(SYS_thread_selfid);
++#elif defined(__linux__)
++ return syscall(__NR_gettid);
++#elif defined(_WIN32)
++ return GetCurrentThreadId();
++#endif
+ }
+
+ #endif /* !_WIN32 */
+diff --git a/base/errors_unix.cpp b/base/errors_unix.cpp
+index 296995e..48269b6 100644
+--- a/base/errors_unix.cpp
++++ b/base/errors_unix.cpp
+@@ -17,6 +17,7 @@
+ #include "android-base/errors.h"
+
+ #include
++#include
+
+ namespace android {
+ namespace base {
+diff --git a/base/file.cpp b/base/file.cpp
+index da1adba..91a3901 100644
+--- a/base/file.cpp
++++ b/base/file.cpp
+@@ -20,6 +20,7 @@
+ #include
+ #include
+ #include
++#include
+
+ #include
+
+diff --git a/base/logging.cpp b/base/logging.cpp
+index 1741871..e97c7f1 100644
+--- a/base/logging.cpp
++++ b/base/logging.cpp
+@@ -21,6 +21,7 @@
+ #include "android-base/logging.h"
+
+ #include
++#include
+
+ // For getprogname(3) or program_invocation_short_name.
+ #if defined(__ANDROID__) || defined(__APPLE__)
--
2.11.0