diff options
-rw-r--r-- | scripts/guix.scm | 325 |
1 files changed, 325 insertions, 0 deletions
diff --git a/scripts/guix.scm b/scripts/guix.scm new file mode 100644 index 0000000..04a79a4 --- /dev/null +++ b/scripts/guix.scm @@ -0,0 +1,325 @@ +;;; Copyright © 2020 Denis Carikli <GNUtoo@cyberdimension.org> +;;; +;;; This file 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. +;;; +;;; This file 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 <http://www.gnu.org/licenses/>. +;;; The guix.scm file is a convention: A file named guix.scm is +;;; found in several project source code, either in the top +;;; directory or in sub-directories like contrib for instance. + +;;; The guix.scm files typically contain package definitions that +;;; are not meant to be used as regular packages but are meant for +;;; testing or developing on the given project. +;;; +;;; Here it enables to build libsamsung-ril under GNU/Linux from the +;;; files currently present in this repository: Guix first copies all +;;; the files in this repository as-is and builds them. So if there +;;; are some local changes that aren't even committed in git yet, they +;;; will also be picked up and built by Guix. This is very useful to +;;; do fast compilation tests. +;;; +;;; Because of that it's also not adapted to be used as a regular package +;;; as distributions would typically need to use a given git revision or +;;; released tarballs instead of potentially locally modified code. +;;; +;;; Once you have Guix installed, to build libsamsung-ril with this +;;; guix.scm file, you can use the 'guix build --file=scripts/guix.scm' +;;; command. + +(use-modules + (ice-9 popen) + (ice-9 rdelim) + (sxml ssax input-parse) + ((guix licenses) #:prefix license:) + (guix build-system android-ndk) + (guix build-system gnu) + (guix gexp) + (guix git-download) + (guix packages) + (guix transformations) + (gnu packages) + (gnu packages android) + (gnu packages autotools) + (gnu packages disk) + (gnu packages linux) + (gnu packages llvm) + (gnu packages pkg-config) + (gnu packages python) + (gnu packages python-xyz) + (gnu packages tls)) + +(define %strict-cflags "CFLAGS=-Werror -W -Wall -Wunused -Wunused-function") + +(define %libsamsung-ril-commit + (let* ((port (open-input-pipe + "git --no-pager log --oneline HEAD -1 --format='%H'")) + (str (read-line port))) + (close-pipe port) + str)) + +(define %local-source + (local-file + (dirname (dirname (current-filename))) + #:recursive? #t)) + +;; We just need libsamsung-ipc to build libsamsung-ril. +;; Using the Android.mk instead of Autotools can help spot more issues. +;; For instance if libsamsung-ril depends on libsamsung-ipc code that is only +;; built by the Autotools, using the Android.mk might spot that. +;; Forgetting to update the Android.mk seems more frequent than forgetting +;; to update the Autotools, because the code is often build tested with the +;; Autotools while writing it. +(define-public libsamsung-ipc + (package + (name "libsamsung-ipc") + ;; Note that the hash is ignored here because we use transformations + ;; to get the latest git version + (version (git-version "0.0" "HEAD" + "73b26ca046c7dc2a3de89079203159a0cae83807")) + (source + (origin + (method git-fetch) + (uri + (git-reference + (url + "https://git.replicant.us/replicant/hardware_replicant_libsamsung-ipc") + ;; Note that the hashes are ignored here because we use transformations + ;; to get the latest git version + (commit "73b26ca046c7dc2a3de89079203159a0cae83807"))) + (sha256 (base32 "0icrc6b8hsjvzr6wjhvylq8fkn9s8snm6qf6yvz0lnlnxv0xifgp")) + )) + (build-system android-ndk-build-system) + (inputs + `(("android-libutils" ,android-libutils) + ("libcrypto" ,openssl))) + (arguments + `(#:phases + (modify-phases + %standard-phases + (delete 'bootstrap) + (add-before + 'build 'patch-host + (lambda _ + (substitute* "Android.mk" + (("BUILD_SHARED_LIBRARY") "BUILD_HOST_SHARED_LIBRARY") + (("BUILD_STATIC_LIBRARY") "BUILD_HOST_STATIC_LIBRARY") + (("BUILD_STATIC_EXECUTABLE") + "BUILD_HOST_STATIC_EXECUTABLE")) + #t))) + #:make-flags (list ,%strict-cflags))) + (synopsis + "libsamsung-ipc is a free software implementation of the Samsung IPC modem + protocol") + (description + "libsamsung-ipc is a free software implementation of the Samsung IPC modem + protocol, found in many Samsung smartphones and tablets.") + (home-page "https://www.replicant.us") + (license license:gpl2+))) + +(define-public replicant-6-hardware_ril-headers + (package + (name "replicant-6-hardware_ril-headers") + (version "6.0-0003") + (source + (origin + (method git-fetch) + (uri + (git-reference + (url + "https://git.replicant.us/mirrors/LineageOS/android_hardware_ril.git") + (commit "f29d36b6b5430d3974b1857f8438d924c2f16a86"))) + (file-name (git-file-name name version)) + (sha256 (base32 "1inaz3lyqx3bmn6421yvxpkyj0v8vkslpl8ymxng2s3jm5xwi39g")))) + (build-system android-ndk-build-system) + (arguments + `(#:phases + (modify-phases + %standard-phases + (delete 'bootstrap) + (delete 'configure) + ;; We only want to packages the headers for now + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (include (string-append out "/include"))) + (copy-recursively + "include" (string-append out "/include")) + #t)))))) + (synopsis "Headers of the RIL used by Replicant 6.0") + (description + "Headers of the The Radio Interface Layer (RIL) used by Replicant 6.0 + The Radio Interface Layer (RIL) daemon is used to abstracts the modem + protocols in Android. It typically loads a libril counterpart that actually + implement a specific modem protocol, while the RIL daemon itself handles the + interface with the Android framework") + (home-page "https://www.replicant.us") + (license license:asl2.0))) + +(define-public replicant-6-libhardware_legacy + (package + (name "replicant-6-libhardware_legacy") + (version "6.0-0003") + (source + (origin + (method git-fetch) + (uri + (git-reference + (url + "https://git.replicant.us/replicant/hardware_libhardware_legacy.git") + (commit "0a29b8547b892115003c46ae17eae4b609aa9a87"))) + (file-name (git-file-name name version)) + (sha256 (base32 "1m8ip09pqw9gjrcqvsj3c7l2mxpaprp3z92sqq7qvp018ayqg1nv")))) + (build-system android-ndk-build-system) + (inputs + `(("android-libcutils" ,android-libcutils) + ("android-liblog" ,android-liblog) + ("libnl" ,libnl))) + (native-inputs + `(("android-core" ,(android-platform-system-core + (android-platform-version))))) + (arguments + `(#:make-flags + (list + (string-append "CFLAGS= " + ;; TODO: see the comment below about + ;; unpacking android-core tarball. + ;; Uncomment the following lines and + ;; remove -I ../core/include when + ;; this is fixed: + ;; "-I " (assoc-ref %build-inputs "android-core") + ;; "/include " + "-I core/include ")) + #:phases + (modify-phases + %standard-phases + ;; TODO: Guix's android.scm does that too in android-ext4-utils however + ;; it might be a good idea to instead package the android-code source + ;; code as-is instead of just downloading it as a tarball + (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)) + (delete 'bootstrap) + (add-before + 'build 'patch-host + (lambda _ + ;; TODO: Cross-compile. + (substitute* "Android.mk" + (("BUILD_SHARED_LIBRARY") "BUILD_HOST_SHARED_LIBRARY") + (("BUILD_STATIC_LIBRARY") "BUILD_HOST_STATIC_LIBRARY") + (("BUILD_STATIC_EXECUTABLE") + "BUILD_HOST_STATIC_EXECUTABLE")) + #t))))) + (synopsis + "replicant-6-libhardware_legacy is Replicant 6.0's fork of Android's legacy + HAL (Hardware Abstraction Layer)") + (description + "replicant-6-libhardware_legacy is Replicant 6.0's fork of Android's legacy + HAL (Hardware Abstraction Layer). + At the beginning of Android, breaking the kernel API to support (new) hardware + faster was a common practice. This was handled by the use of an hardware + abstraction in userspace between the (highly modified) Linux kernel and the + Android framework that the Android applications interact with. In addition that + abstraction layer also supported userspace drivers for things that are not + typically handled by the kernel like modem or GPS protocols.") + (home-page "https://www.replicant.us") + (license license:asl2.0))) + +(define-public libsamsung-ril + (package + (name "libsamsung-ril") + (version (git-version "0.0" "HEAD" %libsamsung-ril-commit)) + (source %local-source) + (build-system android-ndk-build-system) + (inputs + `(("android-libcutils" ,android-libcutils) + ("android-liblog" ,android-liblog) + ("android-libutils" ,android-libutils) + ("clang" ,clang) + ("libcrypto" ,openssl) + ("libsamsung-ipc" ,libsamsung-ipc) + ("replicant-6-libhardware_legacy" ,replicant-6-libhardware_legacy))) + (native-inputs + `(("android-core" ,(android-platform-system-core + (android-platform-version))) + ("replicant-6-hardware_ril-headers" ,replicant-6-hardware_ril-headers))) + (arguments + `(#:make-flags + (list + (string-append + "CFLAGS=-W -Wall -Wno-unused " + "-DANDROID " + "-I core/include " + "-I " (assoc-ref %build-inputs "libsamsung-ipc") + "/include/samsung-ipc " + "-I " (assoc-ref %build-inputs "replicant-6-libhardware_legacy") + "/include " + "-I " (assoc-ref %build-inputs "replicant-6-hardware_ril-headers") + "/include ") + ;; We need to pass it LOCAL_MODULE=libsamsung-ril, else it only builds + ;; the libsrs-client target (and not the libsamsung-ril target nor any of + ;; the other tools). + ;; TODO: Build all the tools as well + "LOCAL_MODULE=libsamsung-ril") + #: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)) + (delete 'bootstrap) + (add-before + 'build 'patch-host + (lambda _ + ;; TODO: Cross-compile. + (substitute* + "Android.mk" + (("BUILD_SHARED_LIBRARY") "BUILD_HOST_SHARED_LIBRARY") + (("BUILD_STATIC_LIBRARY") "BUILD_HOST_STATIC_LIBRARY") + (("BUILD_STATIC_EXECUTABLE") + "BUILD_HOST_STATIC_EXECUTABLE")) + #t)) + (add-after + 'patch-host + 'prepare-build-environment + (lambda* (#:key inputs #:allow-other-keys) + (setenv "CC" "clang") + #t))))) + (synopsis + "libsamsung-ril is RIL library that uses libsamsung-ipc to implementation + the Samsung IPC modem protocol") + (description + "The Radio Interface Layer (RIL) daemon is used to abstracts the modem + protocols in Android. It typically loads a libril counterpart that actually + implement a specific modem protocol, while the RIL daemon itself handles the + interface with the Android framework. libsamsung-ril is libril library + that uses libsamsung-ipc to implementation the Samsung IPC modem protocol, + found in many Samsung smartphones and tablets.") + (home-page "https://www.replicant.us") + (license license:gpl2+))) + +(define use-libsamsung-ipc-master + (options->transformation + '((with-branch . "libsamsung-ipc=master")))) + +(list (use-libsamsung-ipc-master libsamsung-ril)) |