about summary refs log tree commit diff
path: root/guix/guix.scm
blob: d8d593b141e432f281b07b02450d94220ff14bc7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
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