about summary refs log tree commit diff
path: root/guix/guix.scm
diff options
context:
space:
mode:
Diffstat (limited to 'guix/guix.scm')
-rw-r--r--guix/guix.scm256
1 files changed, 256 insertions, 0 deletions
diff --git a/guix/guix.scm b/guix/guix.scm
new file mode 100644
index 0000000..d8d593b
--- /dev/null
+++ b/guix/guix.scm
@@ -0,0 +1,256 @@
+;; To use this file to build HEAD of gemma:
+;;
+;;   guix build -f guix/guix.scm       # default builds pangemma-git
+;;
+;; To get a development container (e.g., run in emacs shell).
+;;
+;;   guix shell -C -D -F -f guix/guix.scm # pangemma-shell-git
+;;
+;; see premake5.lua for build/test instructions
+;;
+;; optimized for arch:
+;;
+;;   guix shell --tune=native -C -D -F # pangemma-shell-git
+;;
+;; see premake5.lua header for examples.
+;;
+;; To optimize use guix --tune=march-type (e.g. --tune=native)
+
+(define-module (guix)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix gexp)
+  #:use-module (guix packages)
+  #:use-module (guix git-download)
+  #:use-module (guix build-system gnu)
+  #:use-module (guix utils)
+
+  #:use-module (gnu packages algebra)
+  #:use-module (gnu packages base)
+  #:use-module (gnu packages build-tools)
+  #:use-module (gnu packages compression)
+  #:use-module (gnu packages commencement)
+  #:use-module (gnu packages check)
+  #:use-module (gnu packages cpp)
+  #:use-module (gnu packages databases)
+  #:use-module (gnu packages gcc)
+  #:use-module (gnu packages gdb)
+  #:use-module (gnu packages guile)
+  #:use-module (gnu packages guile-xyz)
+  #:use-module (gnu packages maths)
+  #:use-module (gnu packages ninja)
+  #:use-module (gnu packages perl)
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages ruby)
+  #:use-module (gnu packages time)
+  #:use-module (srfi srfi-1)
+  #:use-module (ice-9 popen)
+  #:use-module (ice-9 rdelim))
+
+(define %source-dir (dirname (current-filename)))
+
+(define %git-commit
+  (read-string (open-pipe "git describe --always --tags --long|tr -d $'\n'" OPEN_READ)))
+
+(define %pangemma-version
+    (read-string (open-pipe "cat VERSION|tr -d $'\n'" OPEN_READ)))
+
+(define-public openblas-pangemma
+;; we are fixating on an older openblas, for now
+  (package
+    (name "openblas-pangemma")
+    (version "0.3.21")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/xianyi/OpenBLAS")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "0yx1axiki12y0xz0d5s76vvl7ds36k0npv1sww08k2qslhz1g9qp"))))
+    (build-system gnu-build-system)
+    (properties `((tunable? . #t)))
+    (arguments
+     (list
+      #:tests? #f ;; skip tests
+      #:test-target "test"
+      ;; No default baseline is supplied for powerpc-linux.
+      #:substitutable? (not (target-ppc32?))
+      #:make-flags
+      #~(list (string-append "PREFIX=" #$output)
+              (string-append "CFLAGS=-O3 -g -Wno-incompatible-pointer-types -Wno-error=implicit-function-declaration")
+              "COPT="
+              "COMMON_OPT="
+              "DYNAMIC_ARCH="
+              "SHELL=bash"
+              "MAKE_NB_JOBS=0"          ;use jobserver for submakes
+
+              ;; This is the maximum number of threads OpenBLAS will ever use (that
+              ;; is, if $OPENBLAS_NUM_THREADS is greater than that, then NUM_THREADS
+              ;; is used.)  If we don't set it, the makefile sets it to the number
+              ;; of cores of the build machine, which is obviously wrong.
+              "NUM_THREADS=128"
+
+              ;; DYNAMIC_ARCH is only supported on some architectures.
+              ;; DYNAMIC_ARCH combined with TARGET=GENERIC provides a library
+              ;; which uses the optimizations for the detected CPU.  This can
+              ;; be overridden at runtime with the environment variable
+              ;; OPENBLAS_CORETYPE=<type>, where "type" is a supported CPU
+              ;; type.  On other architectures we target only the baseline CPU
+              ;; supported by Guix.
+              #$@(cond
+                    ((or (target-x86-64?)
+                         (target-x86-32?)
+                         (target-ppc64le?)
+                         (target-aarch64?))
+                     ;; Dynamic older enables a few extra CPU architectures
+                     ;; on x86_64 that were released before 2010.
+                     '("DYNAMIC_ARCH=1" "TARGET=GENERIC"))
+                     ;; '("DYNAMIC_ARCH=" "TARGET_CORE=ZEN"))
+                    ;; On some of these architectures the CPU type can't be detected.
+                    ;; We list the oldest CPU core we want to have support for.
+                    ;; On MIPS we force the "SICORTEX" TARGET, as for the other
+                    ;; two available MIPS targets special extended instructions
+                    ;; for Loongson cores are used.
+                    ((target-mips64el?)
+                     '("TARGET=SICORTEX"))
+                    ((target-arm32?)
+                     '("TARGET=ARMV7"))
+                    ((target-riscv64?)
+                     '("TARGET=RISCV64_GENERIC"))
+                    (else '())))
+      ;; no configure script
+      #:phases
+      #~(modify-phases %standard-phases
+          (delete 'configure)
+          (add-before 'build 'set-extralib
+            (lambda* (#:key inputs #:allow-other-keys)
+              ;; Get libgfortran found when building in utest.
+              (setenv "FEXTRALIB"
+                      (string-append
+                       "-L"
+                       (dirname
+                        (search-input-file inputs "/lib/libgfortran.so")))))))))
+    (inputs
+     (list `(,gfortran "lib")))
+    (native-inputs
+     (list cunit gfortran perl))
+    (home-page "https://www.openblas.net/")
+    (synopsis "Optimized BLAS library based on GotoBLAS")
+    (description
+     "OpenBLAS is a BLAS library forked from the GotoBLAS2-1.13 BSD version.")
+    (license license:bsd-3)))
+
+(define-public pangemma-base-git
+  "Pangemma base build package"
+  (package
+    (name "pangemma-git")
+    (version (git-version %pangemma-version "HEAD" %git-commit))
+    (source (local-file %source-dir #:recursive? #t))
+    (build-system gnu-build-system)
+    (inputs
+     (list gsl
+           openblas-pangemma
+           guile-3.0
+           `(,guile-3.0 "debug")
+           ;; `(,guile-3.0 "dev")
+           guile-lmdb
+           lmdb
+           lmdbxx
+           pkg-config
+           ;; ninja
+           ;; ruby
+           time
+           zlib))
+    ;; (propagated-inputs
+    ;;  (list
+    ;;   `("guile" ,guile-3.0-latest)
+    ;;   `("guile-debug" ,guile-3.0-latest "debug")
+    ;;  `("guile" ,guile-3.0-latest "dev")))
+
+    ;; ("gsl-static" ,gsl-static)
+    ;; ("zlib:static" ,zlib "static")
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+                      (delete 'configure)
+                      (delete 'validate-runpath)
+                      (add-before 'build 'bin-mkdir
+                                  (lambda _
+                                    (mkdir-p "bin")
+                                    ))
+                      (replace 'install
+                               (lambda* (#:key outputs #:allow-other-keys)
+                                 (let ((out (assoc-ref outputs "out")))
+                                   (install-file "bin/gemma" (string-append out "/bin"))))))
+       #:tests? #t
+       #:parallel-tests? #f))
+    (home-page "https://git.genenetwork.org/pangemma/")
+    (synopsis "Tool for genome-wide efficient mixed model association")
+    (description "New version of Genome-wide Efficient Mixed Model Association (PANGEMMA)
+provides a standard linear mixed model resolver with application in
+genome-wide association studies (GWAS).")
+    (license license:gpl3)))
+
+(define-public pangemma-shell-git
+  "Shell version for development"
+  (package
+    (inherit pangemma-base-git)
+    (name "pangemma-shell-git")
+    (build-system gnu-build-system)
+    (propagated-inputs
+     (modify-inputs (package-inputs pangemma-base-git)
+                    (append which binutils coreutils gcc-toolchain premake5 gnu-make gdb gperftools ;; for the shell
+                 )))
+    (arguments
+     `(#:phases (modify-phases %standard-phases
+                               (delete 'configure)
+                               (delete 'build)
+                               (delete 'package)
+                               (delete 'check)
+                               (delete 'install))))
+    (description "Pangemma shell for development")
+    ))
+
+;; ---- legacy build -----------------------------------------------------------------
+(define-public gemma-git
+  "Original legacy gemma -- for as long as it compiles"
+  (package
+    (name "gemma-git")
+    (version (git-version %pangemma-version "HEAD" %git-commit))
+    (source (local-file %source-dir #:recursive? #t))
+    (build-system gnu-build-system)
+    (inputs
+     (list catch2
+           gdb
+           gsl
+           openblas-pangemma
+           zlib))
+       ;; ("gsl-static" ,gsl-static)
+       ;; ("zlib:static" ,zlib "static")
+    (native-inputs ; for running tests
+     (list perl which))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+                      (delete 'configure)
+                      (delete 'validate-runpath)
+                      (add-before 'build 'bin-mkdir
+                                  (lambda _
+                                    (mkdir-p "bin")
+                                    ))
+                      (replace 'install
+                               (lambda* (#:key outputs #:allow-other-keys)
+                                 (let ((out (assoc-ref outputs "out")))
+                                   (install-file "bin/gemma" (string-append out "/bin"))))))
+       #:tests? #t
+       #:parallel-tests? #f))
+    (home-page "https://github.com/genetics-statistics")
+    (synopsis "Tool for genome-wide efficient mixed model association")
+    (description "Genome-wide Efficient Mixed Model Association (GEMMA)
+provides a standard linear mixed model resolver with application in
+genome-wide association studies (GWAS).")
+    (license license:gpl3)))
+
+pangemma-shell-git