Project

General

Profile

GuixBuildSystem » History » Revision 5

Revision 4 (Denis 'GNUtoo' Carikli, 07/27/2020 04:59 PM) → Revision 5/7 (Denis 'GNUtoo' Carikli, 07/30/2020 10:13 PM)

h1. GuixBuildSystem 

 h2. Use cases 

 Guix can be used for faster testing: 
 * It can build software that uses autotools and Android.mk Makefiles 
 * We might be able to use it to iterate over different Android versions, to test libsamsung-ril changes for various RIL API way faster (without even having to use it in a specific Replicant version, use repo, etc). 
 * It's more self contained than the whole Replicant source code 

 TODO: 
 * Import the compilation flags for various Replicant versions like -Werror -Wnounused to make sure that everything is usable in all Replicant versions. 
 * Finish packaging libsamsung-ril 
 * Add more automatic testing either in libsamsung-ipc / libsamsung-ril and or in the unofficial Guix packages. 

 h2. Implementation 

 Guix currently uses "android-make-stub":https://github.com/daym/android-make-stub.git to build Android software using Android.mk. 

 There are some comments in Guix source code that cross compilation isn't supported for the android-ndk build system. 

 Practically speaking it means that Guix won't be able to build any BUILD_SHARED_LIBRARY, BUILD_SHARED_LIBRARY or BUILD_STATIC_EXECUTABLE, however building the HOST_* counterpart works fine. 

 To workaround that they simply do replace them in the Android.mk during the build procedude: 
 * BUILD_SHARED_LIBRARY becomes BUILD_HOST_SHARED_LIBRARY 
 * BUILD_SHARED_LIBRARY becomes BUILD_HOST_STATIC_LIBRARY 
 * BUILD_STATIC_EXECUTABLE becomes BUILD_HOST_STATIC_EXECUTABLE 

 For instance we have: 
 <pre> 
    (arguments 
     `(#:phases 
       (modify-phases %standard-phases 
		      (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)) 
		      ))) 
 </pre> 

 Here the (delete 'bootstrap) is because the build is done in several phases, and here the bootstrap phase wasn't overriden by the android-ndk build system yet. As a result it tried to run autogen.sh. That might be because in libsamsung-ipc there is both an android build system and an autotools based one. 

 

 h2. Example 

 * There <pre> 
 ;;; Copyright © 2020 Denis Carikli <GNUtoo@cyberdimension.org> 
 ;;; 
 ;;; This file is some work not part of GNU Guix (yet). 
 ;;; 
 ;;; 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 progress 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 this file.    If not, see <http://www.gnu.org/licenses/>. 

 (define-module (replicant) 
   #:use-module ((guix licenses) #:prefix license:) 
   #:use-module (guix packages) 
   #:use-module (guix git-download) 
   #:use-module (guix build-system android-ndk) 
   #:use-module (guix build-system gnu) 
   #:use-module (gnu packages android) 
   #:use-module (gnu packages autotools) 
   #:use-module (gnu packages pkg-config) 
   #:use-module (gnu packages tls) 
 ) 

 (define-public libsamsung-ipc 
   (package 
    (name "libsamsung-ipc") 
    (version "0.1") 
    (source 
     (origin 
      (method git-fetch) 
      (uri (git-reference 
	    (url "https://git.replicant.us/replicant/hardware_replicant_libsamsung-ipc.git") 
	    (commit "73aa86f31bb004c48c5250ea43cca9ed9d51cb17"))) 
      (file-name (git-file-name name version)) 
      (sha256 (base32 "1wkvkgbckb7cif6lrd8rivh6s4886qa4dw2s433l28h2lh3zmqkb")) 
      ) 
     ) 
    (build-system gnu-build-system) 

    (native-inputs 
     `(("autoreconf" ,autoconf) 
       ("aclocal" ,automake) 
       ("libtool" ,libtool) 
       ("pkgconfig" ,pkg-config) 
       )) 

    (inputs 
     `(("openssl" ,openssl))) 

    (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 libsamsung-ipc-android 
   (package 
    (name "libsamsung-ipc-android") 
    (version "0.1") 
    (source 
     (origin 
      (method git-fetch) 
      (uri (git-reference 
	    (url "https://git.replicant.us/replicant/hardware_replicant_libsamsung-ipc.git") 
	    (commit "73aa86f31bb004c48c5250ea43cca9ed9d51cb17"))) 
      (file-name (git-file-name name version)) 
      (sha256 (base32 "1wkvkgbckb7cif6lrd8rivh6s4886qa4dw2s433l28h2lh3zmqkb")) 
      ) 
     ) 
    (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 _ 
				    ;; 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 "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+) 
    ) 
   ) 

 ;; TODO: This package doesn't compile yet. 
 ;; To make it compile, we would need to: 
 ;; - patch Guix to change (define android-libcutils to 
 ;;     (define-public android-libcutils and also do the same for android-liblog. 
 ;;     When this is done we can use the following in inputs: 
 ;;     ("android-libcutils" ,android-libcutils) 
 ;;     ("android-liblog" ,android-liblog) 
 ;; - to package libnetutils and libpower 
 ;; - find a way to use headers that are not in LOCAL_SHARED_LIBRARIES like 
 ;;     hardware/libhardware_legacy/include and system/core/include 

 (define-public libsamsung-ril 
   (package 
    (name "libsamsung-ril") 
    (version "0.1") 
    (source 
     (origin 
      (method git-fetch) 
      (uri (git-reference 
	    (url "https://git.replicant.us/replicant/hardware_replicant_libsamsung-ril.git") 
	    (commit "181d3e2a85dff24552a29a0cecbca9ac78cba5b7"))) 
      (file-name (git-file-name name version)) 
      (sha256 (base32 "0sjiw7kp9hipkc9smphbzzbmhyf30y0vni94w15vliry381g5ma8")) 
      ) 
     ) 
    (build-system android-ndk-build-system) 

    (inputs 
     `(("android-libutils" ,android-libutils) 
       ("libsamsung-ipc", libsamsung-ipc) 
       ("libcrypto" ,openssl))) 

    (arguments 
     `(#:phases 
       (modify-phases %standard-phases 
		      (delete 'bootstrap) 
		      (add-before 'build 'patch-host 
				  (lambda _ 
				    ;; TODO: Cross-compile. 
				    (substitute* "Android.mk" 
						 (("BUILD_SHARED_LIBRARY") "BUILD_HOST_SHARED_LIBRARY")) 
				    #t)) 
		      ))) 
   
    (synopsis "libsamsung-ipc is a free software implementation of the Samsung IPC modem protocol") 
    (description 
     "libril implementation for faster testing: https://git.replicant.us/contrib/GNUtoo/guix/tree/gnu/packages/replicant.scm?h=libsamsung-ril the Samsung IPC modem protocol, found in many Samsung smartphones and tablets.") 
    (home-page "https://www.replicant.us") 
    (license license:gpl2+) 
    ) 
   ) 
 </pre>