;;; Copyright © 2020 Denis Carikli ;;; ;;; 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 . ;;; 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. ;;; ;;; For instance here it is used to build libsamsung-ipc in various ;;; configurations. Instead distributions would typically be interested ;;; in only one of the configurations. ;;; ;;; It also copies the sources that are present in the directory that ;;; contains the guix.scm, and builds them. Distributions would instead ;;; be interested in retrieving the source from git or releases tarballs. ;;; ;;; Once you have Guix installed, to build libsamsung-ipc with the ;;; guix.scm file, you can use the 'guix build --file=scripts/guix.scm' ;;; command, however as explained above, keep in mind that it will copy ;;; all the files in the same directory than guix.scm, so you might want ;;; to make sure that the sources are clean (with 'make distclean') if ;;; you already built libsamsung-ipc in that directory. ;;; ;;; While this file could also serve as a basis to make a libsamsung-ipc ;;; package in Guix, it is probably a good idea to wait until the API ;;; and ABI changes are complete, ie when the ipc_client has been passed ;;; to all the exported functions, and make a new release when that is ;;; done. (use-modules (ice-9 popen) (ice-9 rdelim) (ice-9 regex) (ice-9 textual-ports) (sxml ssax input-parse) ((guix licenses) #:prefix license:) (guix build-system android-ndk) (guix build-system gnu) (guix gexp) (guix git-download) (guix packages) (gnu packages android) (gnu packages autotools) (gnu packages commencement) (gnu packages curl) (gnu packages disk) (gnu packages linux) (gnu packages llvm) (gnu packages pkg-config) (gnu packages python) (gnu packages python-xyz) (gnu packages tls) (gnu packages valgrind)) (define (parse-android.mk port modules-list) (let* ((line (read-line port))) (if (not (eof-object? line)) (let* ((line-parts (string-split line #\ ))) (if (string=? (car line-parts) "LOCAL_MODULE") (if (and (not (string=? (list-ref line-parts 2) "libsamsung-ipc")) (not (string-match "-static$" (list-ref line-parts 2)) )) (if (string=? modules-list "") (parse-android.mk port (list-ref line-parts 2)) (parse-android.mk port (string-append modules-list " " (list-ref line-parts 2)))) (parse-android.mk port modules-list)) (parse-android.mk port modules-list))) modules-list))) (define android-local-modules (let* ((port (open-input-file "./Android.mk")) (local-modules (parse-android.mk port ""))) (close-input-port port) (string-split local-modules #\ ))) (define %common-strict-cflags (let* ((port (open-input-pipe "./strict-cflags.sh")) (str (read-line port))) (close-pipe port) (string-append "CFLAGS=" str))) (define %clang-strict-cflags (string-append "-Werror=non-virtual-dtor")) (define %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)) (define-public libsamsung-ipc (package (name "libsamsung-ipc") (version (git-version "0.0" "HEAD" %commit)) (source %local-source) (build-system gnu-build-system) (native-inputs `(("autoreconf" ,autoconf) ("aclocal" ,automake) ("ddrescue", ddrescue) ("libc:debug", (@@ (gnu packages commencement) glibc-final) "debug") ("libcurl" ,curl) ("libtool" ,libtool) ("pkgconfig" ,pkg-config) ("python" ,python) ("python-sh" ,python-sh) ("valgrind" ,valgrind))) (inputs `(("openssl" ,openssl))) (arguments `(#:phases (modify-phases %standard-phases (add-before 'build 'patch-python (lambda _ (substitute* (find-files "." ".*\\.py$") (("/usr/bin/env python") (which "python3"))) #t)) (add-after 'patch-python 'fix-valgrind (lambda _ (substitute* (find-files "." ".*\\.py$") (("'--leak-check=full',") (string-append "'--leak-check=full', '--extra-debuginfo-path=" (assoc-ref %build-inputs "libc:debug") "/lib/debug',"))) #t))) #:configure-flags (list "--enable-debug" "--enable-valgrind-tests"))) (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 (make-android-package local-modules) (package (inherit libsamsung-ipc) (name "libsamsung-ipc-gcc-android") (build-system android-ndk-build-system) (inputs `(("android-libutils" ,android-libutils) ("libcrypto" ,openssl) ("libcurl" ,curl))) (native-inputs '()) (arguments `(#:phases (modify-phases %standard-phases (delete 'bootstrap) (add-before 'build 'patch-host (lambda _ (substitute* "Android.mk" (("BUILD_EXECUTABLE") "BUILD_HOST_EXECUTABLE") (("BUILD_SHARED_LIBRARY") "BUILD_HOST_SHARED_LIBRARY") (("BUILD_STATIC_LIBRARY") "BUILD_HOST_STATIC_LIBRARY") (("BUILD_STATIC_EXECUTABLE") "BUILD_HOST_STATIC_EXECUTABLE")) #t)) (replace 'build (lambda* (#:key inputs make-flags native-inputs outputs #:allow-other-keys) (for-each (lambda (arg) ((assoc-ref %standard-phases 'build) #:make-flags (append make-flags (list (string-append "LOCAL_MODULE=" arg))))) ,local-modules) #t)) (replace 'install (lambda* (#:key inputs make-flags native-inputs outputs #:allow-other-keys) (for-each (lambda (arg) ((assoc-ref %standard-phases 'install) #:inputs inputs #:outputs outputs #:make-flags (append make-flags (list (string-append "LOCAL_MODULE=" arg))))) ,local-modules) #t))) #:make-flags (list ,%common-strict-cflags))))) (define-public libsamsung-ipc-gcc-android (make-android-package ;; `(list "https-send-sms" "ipc-modem"))) `(list "libsamsung-ipc" ,@android-local-modules))) ;;(pk (append (list "libsamsung-ipc") android-local-modules)) (define-public libsamsung-ipc-gcc-autotools (package (inherit libsamsung-ipc) (name "libsamsung-ipc-gcc-autotools") (arguments `(#:phases (modify-phases %standard-phases (add-before 'build 'patch-python (lambda _ (substitute* (find-files "." ".*\\.py$") (("/usr/bin/env python") (which "python3"))) #t))) #:configure-flags (list "--enable-debug") #:make-flags (list ,%common-strict-cflags))))) (define-public libsamsung-ipc-clang-autotools (package (inherit libsamsung-ipc) (name "libsamsung-ipc-gcc-autotools") (native-inputs `(("autoreconf" ,autoconf) ("aclocal" ,automake) ("ddrescue", ddrescue) ("libcurl" ,curl) ("libtool" ,libtool) ("pkgconfig" ,pkg-config) ("python" ,python) ("python-sh" ,python-sh) ("clang" ,clang))) (arguments `(#:phases (modify-phases %standard-phases (add-before 'build 'patch-python (lambda _ (substitute* (find-files "." ".*\\.py$") (("/usr/bin/env python") (which "python3"))) #t))) #:configure-flags (list "--enable-debug") #:make-flags (list ,%common-strict-cflags ,%clang-strict-cflags))))) (define-public libsamsung-ipc-clang-android (package (inherit libsamsung-ipc) (name "libsamsung-ipc-clang-android") (build-system android-ndk-build-system) (inputs `(("android-libutils" ,android-libutils) ("libcrypto" ,openssl) ("libcurl" ,curl) ("clang" ,clang))) (native-inputs '()) (arguments `(#:phases (modify-phases %standard-phases (delete 'bootstrap) (add-before 'build 'patch-host (lambda _ (substitute* "Android.mk" (("BUILD_EXECUTABLE") "BUILD_HOST_EXECUTABLE") (("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))) #:make-flags (list ,%common-strict-cflags ,%clang-strict-cflags))))) ;; Combinaisons: ;; +--------------------------------+----------+----------+--------------+--------------+ ;; | Package name | Compiler | Compiler | Build system | Comments | ;; | | | flags | | | ;; +--------------------------------+----------+----------+--------------+--------------+ ;; | libsamsung-ipc | GCC | none | autotools | Base package | ;; +--------------------------------+----------+----------+--------------+--------------+ ;; | libsamsung-ipc-gcc-android | GCC | strict | Android.mk | | ;; +--------------------------------+----------+----------+--------------+--------------+ ;; | libsamsung-ipc-gcc-autotools | GCC | strict | autotools | | ;; +--------------------------------+----------+----------+--------------+--------------+ ;; | libsamsung-ipc-clang-android | clang | strict | Android.mk | | ;; +--------------------------------+----------+----------+--------------+--------------+ ;; | libsamsung-ipc-clang-autotools | clang | strict | autotools | | ;; +--------------------------------+----------+----------+--------------+--------------+ (list ;; libsamsung-ipc libsamsung-ipc-gcc-android ;; libsamsung-ipc-gcc-autotools ;; libsamsung-ipc-clang-android ;; libsamsung-ipc-clang-autotools )