aboutsummaryrefslogtreecommitdiff
path: root/src/detect.sh
blob: 047e2ddfdeada0cab6154323afe132b43ef3e2d0 (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
257
258
259
260
261
262
263
264
265
266
#! /bin/bash

################################################################################
# Prepare
################################################################################

# Set up shell
if [ "$(echo ${VERBOSE} | tr '[:upper:]' '[:lower:]')" = 'yes' ]; then
    set -x                      # Output commands
fi
set -e                          # Abort on errors

. $CCTK_HOME/lib/make/bash_utils.sh

################################################################################
# Check for old mechanism
################################################################################

if [ -n "${HDF5}" ]; then
    echo 'BEGIN ERROR'
    echo "Setting the option \"HDF5\" is incompatible with the HDF5 thorn. Please remove the option HDF5=${HDF5}."
    echo 'END ERROR'
    exit 1
fi

# Take care of requests to build the library in any case
HDF5_DIR_INPUT=$HDF5_DIR
if [ "$(echo "${HDF5_DIR}" | tr '[a-z]' '[A-Z]')" = 'BUILD' ]; then
    HDF5_BUILD=yes
    HDF5_DIR=
else
    HDF5_BUILD=
fi

# HDF5 can be configures in different ways
HDF5_C_LIBS='hdf5_hl hdf5'
if [ "${HDF5_ENABLE_CXX:=no}" = 'yes' ]; then
    HDF5_CXX_LIBS='hdf5_hl_cpp hdf5_cpp'
    HDF5_REQ='C++'
fi
if [ "${HDF5_ENABLE_FORTRAN:=yes}" = 'yes' ]; then
    if [ "${F90}" != "none" ]; then
        HDF5_FORTRAN_LIBS='hdf5hl_fortran hdf5_fortran'
        HDF5_REQ="$HDF5_REQ Fortran"
    fi
fi
if [ -n "$HDF5_REQ" ]; then
    echo "BEGIN MESSAGE"
    echo "Additional requested language support: $HDF5_REQ"
    echo "END MESSAGE"
fi

HDF5_REQ_LIBS="${HDF5_CXX_LIBS} ${HDF5_FORTRAN_LIBS} ${HDF5_C_LIBS}"

################################################################################
# Search
################################################################################
if [[ -z "$HDF5_BUILD" ]]; then
    find_lib HDF5 hdf5 1 1.0 "$HDF5_REQ_LIBS" "hdf5.h" "$HDF5_DIR"

    # Sadly, pkg-config for HDF5 is good for paths, but bad for the list of
    # available (and necessary) library names, so we have to fix things
    if [ -n "$PKG_CONFIG_SUCCESS" ]; then
        HDF5_LIBS="hdf5_hl $HDF5_LIBS"
        find_libs "$HDF5_LIB_DIRS" "hdf5_hl"
        if [ -z "$FOUND" ]; then
            echo 'BEGIN ERROR'
            echo 'Detected problem with HDF5 libary at'
            echo "          $HDF5_DIR ($HDF5_LIB_DIRS)"
            echo 'Library hdf5_hl not found.'
            echo 'END ERROR'
            exit 1
        fi
        if [ "${HDF5_ENABLE_CXX:=no}" = 'yes' ]; then
            HDF5_LIBS="hdf5_hl_cpp hdf5_cpp $HDF5_LIBS"
            find_libs "$HDF5_LIB_DIRS" "hdf5_hl_cpp hdf5_cpp"
            if [ -z "$FOUND" ]; then
                echo 'BEGIN ERROR'
                echo 'HDF5 Installation found at '
                echo "       $HDF5_DIR ($HDF5_LIB_DIRS)"
                echo '     does not provide requested C++ support. Either specify the '
                echo '     location of a different HDF5 installation, or do not '
                echo '     require the HDF5 C++ interface if you do not need it '
                echo '     (set HDF5_ENABLE_CXX to "no").'
                echo 'END ERROR'
                exit 1
            fi
        fi
        if [ "${HDF5_ENABLE_FORTRAN:=yes}" = 'yes' ]; then
            HDF5_LIBS="hdf5hl_fortran hdf5_fortran $HDF5_LIBS"
            find_libs "$HDF5_LIB_DIRS" "hdf5hl_fortran hdf5_fortran"
            if [ -z "$FOUND" ]; then
                echo 'BEGIN ERROR'
                echo 'HDF5 Installation found at '
                echo "       $HDF5_DIR ($HDF5_LIB_DIRS)"
                echo '     does not provide requested Fortran support. Either specify '
                echo '     location of a different HDF5 installation, or do not '
                echo '     require the HDF5 Fortran interface if you do not need it '
                echo '     (set HDF5_ENABLE_FORTRAN to "no").'
                echo 'END ERROR'
                exit 1
            fi
        fi
    fi
fi

################################################################################
# Build
################################################################################
THORN=HDF5

if [ -n "$HDF5_BUILD" -o -z "${HDF5_DIR}" ]; then
    echo "BEGIN MESSAGE"
    echo "Using bundled HDF5..."
    echo "END MESSAGE"
    
    check_tools "tar patch"

    # Set locations
    NAME=hdf5-1.8.14
    SRCDIR="$(dirname $0)"
    BUILD_DIR=${SCRATCH_BUILD}/build/${THORN}
    if [ -z "${HDF5_INSTALL_DIR}" ]; then
        INSTALL_DIR=${SCRATCH_BUILD}/external/${THORN}
    else
        echo "BEGIN MESSAGE"
        echo "Installing HDF5 into ${HDF5_INSTALL_DIR}"
        echo "END MESSAGE"
        INSTALL_DIR=${HDF5_INSTALL_DIR}
    fi
    HDF5_DIR=${INSTALL_DIR}
    # Fortran modules may be located in the lib directory
    HDF5_INC_DIRS="${HDF5_DIR}/include ${HDF5_DIR}/lib"
    HDF5_LIB_DIRS="${HDF5_DIR}/lib"
    HDF5_LIBS="${HDF5_CXX_LIBS} ${HDF5_FORTRAN_LIBS} ${HDF5_C_LIBS}"
fi

if [ -n "$HDF5_DIR" ]; then
    # Fortran modules may be located in the lib directory
    : ${HDF5_RAW_LIB_DIRS:="$HDF5_LIB_DIRS"}
    HDF5_INC_DIRS="$HDF5_RAW_LIB_DIRS $HDF5_INC_DIRS"
    # We need the un-scrubbed inc dirs to look for a header file below.
    : ${HDF5_RAW_INC_DIRS:="$HDF5_INC_DIRS"}
else
    echo 'BEGIN ERROR'
    echo 'ERROR in HDF5 configuration: Could neither find nor build library.'
    echo 'END ERROR'
fi

mkdir ${SCRATCH_BUILD}/done 2> /dev/null || true
DONE_FILE=${SCRATCH_BUILD}/done/${THORN}
date > ${DONE_FILE}

################################################################################
# Check for additional libraries
################################################################################

# Check whether we are running on Windows
if perl -we 'exit (`uname` =~ /^CYGWIN/)'; then
    is_windows=0
else
    is_windows=1
fi

# Check whether we are running on MacOS
if perl -we 'exit (`uname` =~ /^Darwin/)'; then
    is_macos=0
else
    is_macos=1
fi

# check installed library, assume that everything is fine if we build
if [ -z "$HDF5_BUILD" -a -n "${HDF5_DIR}" ]; then
  # find public include file
  for dir in $HDF5_RAW_INC_DIRS; do
      if [ -r "$dir/H5pubconf.h" ]; then
          H5PUBCONF="$H5PUBCONF $dir/H5pubconf.h"
      fi
  done
  if [ -z "$H5PUBCONF" ]; then
      echo 'BEGIN ERROR'
      echo 'ERROR in HDF5 configuration: '
      echo "H5pubconf.h not found in $HDF5_RAW_INC_DIRS"
      echo 'END ERROR'
  fi
  
  # Check whether we have to link with libsz.a
  if grep -qe '#define H5_HAVE_LIBSZ 1' $H5PUBCONF 2> /dev/null; then
      test_szlib=0
  else
      test_szlib=1
  fi
  if [ $test_szlib -eq 0 ]; then
      HDF5_LIB_DIRS="$HDF5_LIB_DIRS $LIBSZ_DIR"
      if [ $is_windows -eq 0 ]; then
          HDF5_LIBS="$HDF5_LIBS sz"
      else
          HDF5_LIBS="$HDF5_LIBS szlib"
      fi
  fi
  
  # Check whether we have to link with libz.a
  if grep -qe '#define H5_HAVE_LIBZ 1' $H5PUBCONF 2> /dev/null; then
      test_zlib=0
  else
      test_zlib=1
  fi
  if [ $test_zlib -eq 0 ]; then
      HDF5_LIB_DIRS="$HDF5_LIB_DIRS $LIBZ_DIR"
      if [ $is_windows -eq 0 ]; then
          HDF5_LIBS="$HDF5_LIBS z"
      else
          HDF5_LIBS="$HDF5_LIBS zlib"
      fi
  fi
  
  # Check whether we have to link with MPI
  if grep -qe '#define H5_HAVE_PARALLEL 1' $H5PUBCONF 2> /dev/null; then
      test_mpi=0
  else
      test_mpi=1
  fi
  if [ $test_mpi -eq 0 ]; then
      HDF5_LIB_DIRS="$HDF5_LIB_DIRS $MPI_LIB_DIRS"
      HDF5_INC_DIRS="$HDF5_INC_DIRS $MPI_INC_DIRS"
      HDF5_LIBS="$HDF5_LIBS $MPI_LIBS"
  fi
fi

# Add the math library which might not be linked by default
if [ $is_windows -eq 0 ]; then
    HDF5_LIBS="$HDF5_LIBS m"
fi


################################################################################
# Configure Cactus
################################################################################

# Pass configuration options to build script
echo "BEGIN MAKE_DEFINITION"
echo "HDF5_ENABLE_CXX     = ${HDF5_ENABLE_CXX}"
echo "HDF5_ENABLE_FORTRAN = ${HDF5_ENABLE_FORTRAN}"
echo "LIBSZ_DIR           = ${LIBSZ_DIR}"
echo "LIBZ_DIR            = ${LIBZ_DIR}"
echo "HDF5_INSTALL_DIR    = ${HDF5_INSTALL_DIR}"
echo "END MAKE_DEFINITION"

# Is this necessary? Shouldn't the ZLIB thorn already take care of this?
ZLIB_INC_DIRS="$(${CCTK_HOME}/lib/sbin/strip-incdirs.sh ${ZLIB_INC_DIRS})"
ZLIB_LIB_DIRS="$(${CCTK_HOME}/lib/sbin/strip-libdirs.sh ${ZLIB_LIB_DIRS})"

# Pass options to Cactus
echo "BEGIN MAKE_DEFINITION"
echo "HDF5_DIR            = ${HDF5_DIR}"
echo "HDF5_ENABLE_CXX     = ${HDF5_ENABLE_CXX}"
echo "HDF5_ENABLE_FORTRAN = ${HDF5_ENABLE_FORTRAN}"
echo "HDF5_INC_DIRS       = ${HDF5_INC_DIRS} ${ZLIB_INC_DIRS}"
echo "HDF5_LIB_DIRS       = ${HDF5_LIB_DIRS} ${ZLIB_LIB_DIRS}"
echo "HDF5_LIBS           = ${HDF5_LIBS} ${ZLIB_LIBS}"
echo "END MAKE_DEFINITION"

echo 'INCLUDE_DIRECTORY $(HDF5_INC_DIRS)'
echo 'LIBRARY_DIRECTORY $(HDF5_LIB_DIRS)'
echo 'LIBRARY           $(HDF5_LIBS)'