library_builders.sh 11.8 KB
Newer Older
Andrew Murray's avatar
Andrew Murray committed
1
# Find, load common utilities
2
# Defines IS_OSX, fetch_unpack
3
4
MULTIBUILD_DIR=$(dirname "${BASH_SOURCE[0]}")
source $MULTIBUILD_DIR/common_utils.sh
xoviat's avatar
xoviat committed
5
6
7
8
9
source $MULTIBUILD_DIR/_gfortran_utils.sh

# For OpenBLAS
PLAT="${PLAT:x86_64}"
GF_LIB_URL="https://3f23b170c54c2533c070-1c8a9b3114517dc5fe17b7c3f8c63a43.ssl.cf2.rackcdn.com"
10

Andrew Murray's avatar
Andrew Murray committed
11
# Recipes for building some libraries
Matthew Brett's avatar
Matthew Brett committed
12
OPENBLAS_VERSION="${OPENBLAS_VERSION:-0.2.18}"
13
# We use system zlib by default - see build_new_zlib
Matthew Brett's avatar
Matthew Brett committed
14
ZLIB_VERSION="${ZLIB_VERSION:-1.2.10}"
15
16
17
LIBPNG_VERSION="${LIBPNG_VERSION:-1.6.21}"
BZIP2_VERSION="${BZIP2_VERSION:-1.0.6}"
FREETYPE_VERSION="${FREETYPE_VERSION:-2.6.3}"
Matthew Brett's avatar
Matthew Brett committed
18
TIFF_VERSION="${TIFF_VERSION:-4.0.6}"
19
JPEG_VERSION="${JPEG_VERSION:-9b}"
20
21
22
23
24
25
OPENJPEG_VERSION="${OPENJPEG_VERSION:-2.1}"
LCMS2_VERSION="${LCMS2_VERSION:-2.7}"
GIFLIB_VERSION="${GIFLIB_VERSION:-5.1.3}"
LIBWEBP_VERSION="${LIBWEBP_VERSION:-0.5.0}"
XZ_VERSION="${XZ_VERSION:-5.2.2}"
LIBYAML_VERSION="${LIBYAML_VERSION:-0.1.5}"
Matthew Brett's avatar
Matthew Brett committed
26
SZIP_VERSION="${SZIP_VERSION:-2.1}"
Andrea Bedini's avatar
Andrea Bedini committed
27
HDF5_VERSION="${HDF5_VERSION:-1.8.18}"
28
LIBAEC_VERSION="${LIBAEC_VERSION:-0.3.3}"
29
LZO_VERSION=${LZO_VERSION:-2.09}
Rolando Espinoza's avatar
Rolando Espinoza committed
30
LZF_VERSION="${LZF_VERSION:-3.6}"
31
BLOSC_VERSION=${BLOSC_VERSION:-1.10.2}
Rolando Espinoza's avatar
Rolando Espinoza committed
32
SNAPPY_VERSION="${SNAPPY_VERSION:-1.1.3}"
33
CURL_VERSION=${CURL_VERSION:-7.49.1}
34
NETCDF_VERSION=${NETCDF_VERSION:-4.4.1.1}
xoviat's avatar
xoviat committed
35
SWIG_VERSION=${SWIG_VERSION:-3.0.12}
36
PCRE_VERSION=${PCRE_VERSION:-8.38}
37
SUITESPARSE_VERSION=${SUITESPARSE_VERSION:-4.5.6}
38
39
40
41
LIBTOOL_VERSION=${LIBTOOL_VERSION:-2.4.6}
RAGEL_VERSION=${RAGEL_VERSION:-6.10}
FLEX_VERSION=${FLEX_VERSION:-2.6.4}
BISON_VERSION=${BISON_VERSION:-3.0.4}
Matthew Brett's avatar
Matthew Brett committed
42
43
44
OPENSSL_ROOT=openssl-1.0.2l
# Hash from https://www.openssl.org/source/openssl-1.0.2?.tar.gz.sha256
OPENSSL_HASH=ce07195b659e75f4e1db43552860070061f156a98bb37b672b101ba6e3ddf30c
45
OPENSSL_DOWNLOAD_URL=https://www.openssl.org/source
46

Rolando Espinoza's avatar
Rolando Espinoza committed
47

Matthew Brett's avatar
Matthew Brett committed
48
BUILD_PREFIX="${BUILD_PREFIX:-/usr/local}"
49
ARCHIVE_SDIR=${ARCHIVE_DIR:-archives}
50

51
52
53
# Set default library compilation flags for OSX
# IS_OSX defined in common_utils.sh
if [ -n "$IS_OSX" ]; then
54
    # Dual arch build by default
55
    ARCH_FLAGS=${ARCH_FLAGS:-"-arch i386 -arch x86_64"}
56
57
58
    # Only set CFLAGS, FFLAGS if they are not already defined.  Build functions
    # can override the arch flags by setting CFLAGS, FFLAGS
    export CFLAGS="${CFLAGS:-$ARCH_FLAGS}"
59
    export CXXFLAGS="${CXXFLAGS:-$ARCH_FLAGS}"
60
    export FFLAGS="${FFLAGS:-$ARCH_FLAGS}"
61
fi
62
63

function build_simple {
xoviat's avatar
xoviat committed
64
65
66
    # Example: build_simple libpng $LIBPNG_VERSION \
    #               http://download.sourceforge.net/libpng tar.gz \
    #               --additional --configure --arguments
67
68
69
    local name=$1
    local version=$2
    local url=$3
70
    local ext=${4:-tar.gz}
71
    local configure_args=${@:5}
72
73
74
75
    if [ -e "${name}-stamp" ]; then
        return
    fi
    local name_version="${name}-${version}"
76
77
    local archive=${name_version}.${ext}
    fetch_unpack $url/$archive
Matthew Brett's avatar
Matthew Brett committed
78
    (cd $name_version \
79
        && ./configure --prefix=$BUILD_PREFIX $configure_args \
80
        && make -j4 \
Matthew Brett's avatar
Matthew Brett committed
81
        && make install)
82
83
84
    touch "${name}-stamp"
}

85
86
87
88
89
90
function build_github {
    # Example: build_github fredrik-johansson/arb 2.11.1
    local path=$1
    local version=$2
    local configure_args=${@:3}
    local name=`basename "$path"`
91
92
93
94
95
96
97
    # This is tricky. If the version name starts with a "v",
    # then the archive name will not start with a "v"
    if [[ $version == v* ]]; then 
        local name_version="${name}-${version:1}"
    else
        local name_version="${name}-${version}"
    fi
98
99
100
101
102
103
    if [ -e "${name}-stamp" ]; then
        return
    fi
    fetch_unpack "https://github.com/${path}/archive/${version}.tar.gz"
    (cd $name_version \
        && ./configure --prefix=$BUILD_PREFIX $configure_args \
104
        && make -j4 \
105
106
107
108
        && make install)
    touch "${name}-stamp"
}

109
110
function build_openblas {
    if [ -e openblas-stamp ]; then return; fi
111
112
113
    if [ -n "$IS_OSX" ]; then
        brew install openblas
        brew link --force openblas
114
    else
115
        mkdir -p $ARCHIVE_SDIR
xoviat's avatar
xoviat committed
116
117
118
        local plat=${1:-$PLAT}
        local tar_path=$(abspath $(_mb_get_gf_lib "openblas-${OPENBLAS_VERSION}" "$plat"))
        (cd / && tar zxf $tar_path)
119
    fi
120
121
122
123
124
    touch openblas-stamp
}

function build_zlib {
    # Gives an old but safe version
125
    if [ -n "$IS_OSX" ]; then return; fi  # OSX has zlib already
126
    if [ -e zlib-stamp ]; then return; fi
127
    yum install -y zlib-devel
128
129
130
131
132
    touch zlib-stamp
}

function build_new_zlib {
    # Careful, this one may cause yum to segfault
133
134
    # Fossils directory should also contain latest
    build_simple zlib $ZLIB_VERSION http://zlib.net/fossils
135
136
137
138
}

function build_jpeg {
    if [ -e jpeg-stamp ]; then return; fi
139
140
    fetch_unpack http://ijg.org/files/jpegsrc.v${JPEG_VERSION}.tar.gz
    (cd jpeg-${JPEG_VERSION} \
Matthew Brett's avatar
Matthew Brett committed
141
        && ./configure --prefix=$BUILD_PREFIX \
142
        && make -j4 \
Matthew Brett's avatar
Matthew Brett committed
143
        && make install)
144
145
146
147
148
149
150
151
152
    touch jpeg-stamp
}

function build_libpng {
    build_zlib
    build_simple libpng $LIBPNG_VERSION http://download.sourceforge.net/libpng
}

function build_bzip2 {
153
    if [ -n "$IS_OSX" ]; then return; fi  # OSX has bzip2 libs already
154
    if [ -e bzip2-stamp ]; then return; fi
155
    fetch_unpack http://bzip.org/${BZIP2_VERSION}/bzip2-${BZIP2_VERSION}.tar.gz
Matthew Brett's avatar
Matthew Brett committed
156
157
158
    (cd bzip2-${BZIP2_VERSION} \
        && make -f Makefile-libbz2_so \
        && make install PREFIX=$BUILD_PREFIX)
159
160
161
162
163
164
165
    touch bzip2-stamp
}

function build_tiff {
    build_zlib
    build_jpeg
    build_xz
Matthew Brett's avatar
Matthew Brett committed
166
    build_simple tiff $TIFF_VERSION http://download.osgeo.org/libtiff
167
168
}

169
function get_cmake {
Matthew Brett's avatar
Matthew Brett committed
170
    local cmake=cmake
171
    if [ -n "$IS_OSX" ]; then
172
        brew install cmake > /dev/null
173
    else
174
        yum install -y cmake28 > /dev/null
Matthew Brett's avatar
Matthew Brett committed
175
        cmake=cmake28
176
    fi
177
178
179
180
181
    echo $cmake
}

function build_openjpeg {
    if [ -e openjpeg-stamp ]; then return; fi
Matthew Brett's avatar
Matthew Brett committed
182
183
184
185
    build_zlib
    build_libpng
    build_tiff
    build_lcms2
186
    local cmake=$(get_cmake)
187
    local archive_prefix="v"
188
    local directory_prefix="openjpeg-"
189
190
    if [ $(lex_ver $OPENJPEG_VERSION) -lt $(lex_ver 2.1.1) ]; then
        archive_prefix="version."
191
        directory_prefix="openjpeg-version."
192
193
    fi
    fetch_unpack https://github.com/uclouvain/openjpeg/archive/${archive_prefix}${OPENJPEG_VERSION}.tar.gz
194
    (cd ${directory_prefix}${OPENJPEG_VERSION} \
Matthew Brett's avatar
Matthew Brett committed
195
196
        && $cmake -DCMAKE_INSTALL_PREFIX=$BUILD_PREFIX . \
        && make install)
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
    touch openjpeg-stamp
}

function build_lcms2 {
    build_tiff
    build_simple lcms2 $LCMS2_VERSION http://downloads.sourceforge.net/project/lcms/lcms/$LCMS2_VERSION
}

function build_giflib {
    build_simple giflib $GIFLIB_VERSION http://downloads.sourceforge.net/project/giflib
}

function build_xz {
    build_simple xz $XZ_VERSION http://tukaani.org/xz
}

function build_libwebp {
    build_libpng
    build_tiff
    build_giflib
217
    build_simple libwebp $LIBWEBP_VERSION \
xoviat's avatar
xoviat committed
218
        https://storage.googleapis.com/downloads.webmproject.org/releases/webp/ tar.gz \
219
        --enable-libwebpmux --enable-libwebpdemux 
220
221
222
223
224
225
226
227
228
229
230
}

function build_freetype {
    build_libpng
    build_bzip2
    build_simple freetype $FREETYPE_VERSION http://download.savannah.gnu.org/releases/freetype
}

function build_libyaml {
    build_simple yaml $LIBYAML_VERSION http://pyyaml.org/download/libyaml
}
Matthew Brett's avatar
Matthew Brett committed
231
232
233
234

function build_szip {
    # Build szip without encoding (patent restrictions)
    build_zlib
235
    build_simple szip $SZIP_VERSION \
xoviat's avatar
xoviat committed
236
        https://www.hdfgroup.org/ftp/lib-external/szip/ tar.gz \
237
        --enable-encoding=no
Matthew Brett's avatar
Matthew Brett committed
238
239
240
241
}

function build_hdf5 {
    if [ -e hdf5-stamp ]; then return; fi
Matthew Brett's avatar
Matthew Brett committed
242
    build_zlib
243
244
    # libaec is a drop-in replacement for szip
    build_libaec
Matthew Brett's avatar
Matthew Brett committed
245
    local hdf5_url=https://www.hdfgroup.org/ftp/HDF5/releases
246
247
    local short=$(echo $HDF5_VERSION | awk -F "." '{printf "%d.%d", $1, $2}')
    fetch_unpack $hdf5_url/hdf5-$short/hdf5-$HDF5_VERSION/src/hdf5-$HDF5_VERSION.tar.gz
Matthew Brett's avatar
Matthew Brett committed
248
    (cd hdf5-$HDF5_VERSION \
Matthew Brett's avatar
Matthew Brett committed
249
        && ./configure --with-szlib=$BUILD_PREFIX --prefix=$BUILD_PREFIX \
250
        && make -j4 \
Matthew Brett's avatar
Matthew Brett committed
251
252
253
        && make install)
    touch hdf5-stamp
}
254
255
256
257
258
259

function build_libaec {
    if [ -e libaec-stamp ]; then return; fi
    local root_name=libaec-0.3.3
    local tar_name=${root_name}.tar.gz
    # Note URL will change for each version
260
    fetch_unpack https://gitlab.dkrz.de/k202009/libaec/uploads/48398bd5b7bc05a3edb3325abfeac864/${tar_name}
261
    (cd $root_name \
Matthew Brett's avatar
Matthew Brett committed
262
        && ./configure --prefix=$BUILD_PREFIX \
263
264
265
266
        && make \
        && make install)
    touch libaec-stamp
}
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283

function build_blosc {
    if [ -e blosc-stamp ]; then return; fi
    local cmake=$(get_cmake)
    fetch_unpack https://github.com/Blosc/c-blosc/archive/v${BLOSC_VERSION}.tar.gz
    (cd c-blosc-${BLOSC_VERSION} \
        && $cmake -DCMAKE_INSTALL_PREFIX=$BUILD_PREFIX . \
        && make install)
    if [ -n "$IS_OSX" ]; then
        # Fix blosc library id bug
        for lib in $(ls ${BUILD_PREFIX}/lib/libblosc*.dylib); do
            install_name_tool -id $lib $lib
        done
    fi
    touch blosc-stamp
}

Rolando Espinoza's avatar
Rolando Espinoza committed
284
285
286
287
function build_snappy {
    build_simple snappy $SNAPPY_VERSION https://github.com/google/snappy/releases/download/$SNAPPY_VERSION
}

288
289
290
291
292
293
294
295
296
function build_lzo {
    if [ -e lzo-stamp ]; then return; fi
    fetch_unpack http://www.oberhumer.com/opensource/lzo/download/lzo-${LZO_VERSION}.tar.gz
    (cd lzo-${LZO_VERSION} \
        && ./configure --prefix=$BUILD_PREFIX --enable-shared \
        && make \
        && make install)
    touch lzo-stamp
}
297

Rolando Espinoza's avatar
Rolando Espinoza committed
298
299
300
301
function build_lzf {
    build_simple liblzf $LZF_VERSION http://dist.schmorp.de/liblzf
}

302
303
function build_curl {
    if [ -e curl-stamp ]; then return; fi
Matthew Brett's avatar
Matthew Brett committed
304
    local flags="--prefix=$BUILD_PREFIX"
Matthew Brett's avatar
Matthew Brett committed
305
    if [ -n "$IS_OSX" ]; then
306
        flags="$flags --with-darwinssl"
307
    else  # manylinux
308
        flags="$flags --with-ssl"
Matthew Brett's avatar
Matthew Brett committed
309
310
        build_openssl
    fi
311
312
    fetch_unpack https://curl.haxx.se/download/curl-${CURL_VERSION}.tar.gz
    (cd curl-${CURL_VERSION} \
313
314
315
        && if [ -z "$IS_OSX" ]; then \
        LIBS=-ldl ./configure $flags; else \
        ./configure $flags; fi\
316
        && make -j4 \
317
318
319
320
        && make install)
    touch curl-stamp
}

Matthew Brett's avatar
Matthew Brett committed
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
function check_sha256sum {
    local fname=$1
    if [ -z "$fname" ]; then echo "Need path"; exit 1; fi
    local sha256=$2
    if [ -z "$sha256" ]; then echo "Need SHA256 hash"; exit 1; fi
    echo "${sha256}  ${fname}" > ${fname}.sha256
    if [ -n "$IS_OSX" ]; then
        shasum -a 256 -c ${fname}.sha256
    else
        sha256sum -c ${fname}.sha256
    fi
    rm ${fname}.sha256
}

function build_openssl {
    if [ -e openssl-stamp ]; then return; fi
    fetch_unpack ${OPENSSL_DOWNLOAD_URL}/${OPENSSL_ROOT}.tar.gz
    check_sha256sum $ARCHIVE_SDIR/${OPENSSL_ROOT}.tar.gz ${OPENSSL_HASH}
    (cd ${OPENSSL_ROOT} \
        && ./config no-ssl2 no-shared -fPIC --prefix=$BUILD_PREFIX \
341
        && make -j4 \
Matthew Brett's avatar
Matthew Brett committed
342
343
344
345
        && make install)
    touch openssl-stamp
}

346
347
348
349
350
351
function build_netcdf {
    if [ -e netcdf-stamp ]; then return; fi
    build_hdf5
    build_curl
    fetch_unpack https://github.com/Unidata/netcdf-c/archive/v${NETCDF_VERSION}.tar.gz
    (cd netcdf-c-${NETCDF_VERSION} \
Matthew Brett's avatar
Matthew Brett committed
352
        && ./configure --prefix=$BUILD_PREFIX --enable-dap \
353
        && make -j4 \
354
355
356
        && make install)
    touch netcdf-stamp
}
xoviat's avatar
xoviat committed
357

358
359
function build_pcre {
    build_simple pcre $PCRE_VERSION https://ftp.pcre.org/pub/pcre/
xoviat's avatar
xoviat committed
360
361
}

xoviat's avatar
xoviat committed
362
363
364
365
function build_swig {
    if [ -n "$IS_OSX" ]; then
        brew install swig > /dev/null
    else
366
367
        build_pcre
        build_simple swig $SWIG_VERSION http://prdownloads.sourceforge.net/swig/
xoviat's avatar
xoviat committed
368
369
370
    fi
}

xoviat's avatar
xoviat committed
371
function build_suitesparse {
xoviat's avatar
xoviat committed
372
    if [ -n "$IS_OSX" ]; then
xoviat's avatar
xoviat committed
373
        brew install suite-sparse > /dev/null
xoviat's avatar
xoviat committed
374
    else
xoviat's avatar
xoviat committed
375
        yum install -y suitesparse-devel > /dev/null
xoviat's avatar
xoviat committed
376
377
    fi
}
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395

function build_libtool {
    build_simple libtool $LIBTOOL_VERSION https://ftp.gnu.org/gnu/libtool/
}

function build_ragel {
    build_simple ragel $RAGEL_VERSION http://www.colm.net/files/ragel/
}

function build_bison {
    build_simple bison $BISON_VERSION https://ftp.gnu.org/gnu/bison/
}

function build_flex {
    # the flex repository's git tags have a 'v' prefix
    build_simple flex $FLEX_VERSION \
        https://github.com/westes/flex/releases/download/v$FLEX_VERSION
}