mirror of
https://github.com/HDFGroup/hdf5.git
synced 2024-11-27 02:10:55 +08:00
4a72a04048
Bug Fix Description: Linux does actually support 64 bit files (those greater than 2GB), you just have to defined a bunch of, seemingly meaningless, macros in order to coax glibc to work with you. 64 bit file support is in the 2.3 and above kernels by default. For lower, well...upgrade or something. The one weird thing, the "-mdouble-align" flag was causing hdf5 to barf when the large file support was compiled in there. It has something to do with the structures and their alignment or something. Very weird. Solution: Added a test to see if we're on a Linux boxen with kernel >2.3 and if so then specify the flags for LFS support. Removed the -mdouble-align flag if we do use LFS support since it causes damage. Platforms tested: Linux (Dangermouse)
222 lines
6.6 KiB
Bash
222 lines
6.6 KiB
Bash
# -*- shell-script -*-
|
|
#
|
|
# This file should be sourced into configure if the compiler is the
|
|
# GNU gcc compiler or a derivative. It is careful not to do anything
|
|
# if the compiler is not GNU; otherwise `cc_flags_set' is set to `yes'
|
|
#
|
|
|
|
# Get the compiler version in a way that works for gcc, egcs, and
|
|
# pgcc unless a compiler version is already known
|
|
#
|
|
# cc_vendor: The compiler name: gcc, egcs, or pgcc
|
|
# cc_version: Version number: 2.91.60, 2.7.2.1
|
|
#
|
|
if test X = "X$cc_flags_set"; then
|
|
cc_version="`$CC $CFLAGS -v 2>&1 |grep 'gcc version' |\
|
|
sed 's/.*gcc version \([-a-z0-9\.]*\).*/\1/'`"
|
|
cc_vendor=`echo $cc_version |sed 's/\([a-z]*\).*/\1/'`
|
|
cc_version=`echo $cc_version |sed 's/[-a-z]//g'`
|
|
if test X = "X$cc_vendor" -a X != "X$cc_version"; then
|
|
cc_vendor=gcc
|
|
fi
|
|
if test "-" != "$cc_vendor-$cc_version"; then
|
|
echo "compiler '$CC' is GNU $cc_vendor-$cc_version"
|
|
fi
|
|
|
|
# Some version numbers
|
|
cc_vers_major=`echo $cc_version | cut -f1 -d.`
|
|
cc_vers_minor=`echo $cc_version | cut -f2 -d.`
|
|
cc_vers_patch=`echo $cc_version | cut -f3 -d.`
|
|
test -n "$cc_vers_major" || cc_vers_major=0
|
|
test -n "$cc_vers_minor" || cc_vers_minor=0
|
|
test -n "$cc_vers_patch" || cc_vers_patch=0
|
|
cc_vers_all=`expr $cc_vers_major '*' 1000000 + $cc_vers_minor '*' 1000 + $cc_vers_patch`
|
|
fi
|
|
|
|
# GCC compilers before gcc-2.8.1 have problems with `long long'.
|
|
if test gcc = $cc_vendor -a $cc_vers_all -lt 2008001; then
|
|
cat <<EOF
|
|
**
|
|
** This compiler may be unable to properly compile the long long
|
|
** data type used extensively by hdf5, although specifying
|
|
** --disable-hsizet for configure may work around those bugs.
|
|
** There may be other code generation problems also, especially
|
|
** when optimizations are enabled. Please upgrade to at least GNU
|
|
** gcc version 2.8.1 before reporting bugs to the HDF5 team.
|
|
**
|
|
EOF
|
|
sleep 5
|
|
|
|
# Current EGCS compilers have problems with `long long' and register
|
|
# allocation when optimizations are turned on for x86 systems.
|
|
elif test egcs = $cc_vendor -a $cc_vers_all -le 2091066; then
|
|
if test "$HSIZET" != "large"; then
|
|
cat <<EOF
|
|
**
|
|
** This compiler may have problems allocating registers when
|
|
** optimizations are enabled on some platforms. Specifying
|
|
** --disable-hsizet usually avoids the bug.
|
|
**
|
|
EOF
|
|
sleep 5
|
|
fi
|
|
|
|
# All current versions of PGCC have problems also.
|
|
elif test pgcc = $cc_vendor -a $cc_vers_all -le 2091066; then
|
|
cat <<EOF
|
|
**
|
|
** This compiler may have problems allocating registers for long
|
|
** long data types when optimizations are enabled. There may be
|
|
** other code generation problems as well. We know of no version
|
|
** of pgcc which is capable of compiling HDF5 in production mode.
|
|
** Please use gcc-2.8 or egcs-1.1.1 before reporting bugs.
|
|
**
|
|
EOF
|
|
sleep 5
|
|
|
|
fi
|
|
|
|
# Architecture-specific flags
|
|
case "$host_os-$host_cpu" in
|
|
# FreeBSD sets the information from "hostname -m" to the general machine
|
|
# architecture, not the specific CPU for the machine, so even our
|
|
# Pentium II Xeon server is set to "i386". Once we know we are on a FreeBSD
|
|
# machine, use the "sysctl" command to get the CPU hardware model.
|
|
freebsd*)
|
|
host_cpu_model=`sysctl -n hw.model`
|
|
case "$host_cpu_model" in
|
|
# Hmm.. this might not catch Celerons, but it won't hurt them either...
|
|
*Pro*|*II*)
|
|
# This check should be kept in sync with the *-i686 check below
|
|
case "$cc_vendor-$cc_version" in
|
|
gcc-2.95*)
|
|
ARCH=${ARCH:="-march=i686 -malign-double"}
|
|
;;
|
|
gcc-*|egcs-*|pgcc-*)
|
|
ARCH=${ARCH:="-mcpu=pentiumpro -march=pentiumpro -malign-double"}
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
;;
|
|
|
|
*-i686)
|
|
# Large file system support has to be compiled with these flags.
|
|
LFS_FLAGS="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE"
|
|
case "$cc_vendor-$cc_version" in
|
|
gcc-2.95*)
|
|
case "`uname -r`" in
|
|
# For kernels 2.2 and below, we don't have support
|
|
# for >2GB files. We care only about >2.3.
|
|
[2-9].[3-9].*)
|
|
# The -malign-double flag is bad for our
|
|
# architecture with large file support. Define
|
|
# these flags so that we can have large file
|
|
# support in the library.
|
|
ARCH=${ARCH:="-march=i686 $LFS_FLAGS"}
|
|
;;
|
|
*)
|
|
ARCH=${ARCH:="-march=i686 -malign-double"}
|
|
;;
|
|
esac
|
|
;;
|
|
gcc-*|egcs-*|pgcc-*)
|
|
ARCH=${ARCH:="-mcpu=pentiumpro -march=pentiumpro -malign-double"}
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
|
|
# Host-specific flags
|
|
case "`hostname`" in
|
|
hawkwind.ncsa.uiuc.edu)
|
|
ARCH="$ARCH -pipe"
|
|
;;
|
|
esac
|
|
|
|
# Common GCC flags for various situations
|
|
case "$cc_vendor-$cc_version" in
|
|
gcc*|egcs*|pgcc*)
|
|
# General
|
|
CFLAGS="$CFLAGS $ARCH -ansi -pedantic -Wchar-subscripts -Wall -W -Wshadow -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Winline -Wpointer-arith -Wconversion -Wredundant-decls"
|
|
|
|
# Production
|
|
PROD_CFLAGS="-O2 $NOFP -finline-functions"
|
|
PROD_CPPFLAGS=
|
|
|
|
# Debug
|
|
DEBUG_CFLAGS="-g -fverbose-asm"
|
|
DEBUG_CPPFLAGS=
|
|
|
|
# Profile
|
|
PROFILE_CFLAGS=-pg
|
|
PROFILE_CPPFLAGS=
|
|
|
|
;;
|
|
esac
|
|
|
|
# Version specific GCC flags
|
|
case "$cc_vendor-$cc_version" in
|
|
gcc-2.7*)
|
|
# No changes from default GCC flags...
|
|
|
|
# Flags are set
|
|
cc_flags_set=yes
|
|
;;
|
|
|
|
gcc-2.8.*)
|
|
# General
|
|
CFLAGS="$CFLAGS $ARCH -Wsign-compare"
|
|
|
|
# Production
|
|
PROD_CFLAGS="$PROD_CFLAGS -fschedule-insns2"
|
|
|
|
# Flags are set
|
|
cc_flags_set=yes
|
|
;;
|
|
|
|
gcc-2.95*)
|
|
# No changes from default GCC flags...
|
|
|
|
# Flags are set
|
|
cc_flags_set=yes
|
|
;;
|
|
|
|
egcs-2.*|pgcc-2.*)
|
|
# General
|
|
CFLAGS="$CFLAGS $ARCH -Wsign-compare"
|
|
|
|
# Production
|
|
PROD_CFLAGS="-O6 $NOFP"
|
|
|
|
# Flags are set
|
|
cc_flags_set=yes
|
|
;;
|
|
|
|
gcc-*|egcs-*|pgcc-*)
|
|
# This must be some other GNU compiler that we don't know about.
|
|
# Just use fairly generic flags.
|
|
|
|
# Production
|
|
PROD_CFLAGS=-O
|
|
PROD_CPPFLAGS=
|
|
|
|
# Debug
|
|
DEBUG_CFLAGS=-g
|
|
DEBUG_CPPFLAGS=
|
|
|
|
# Profile
|
|
PROFILE_CFLAGS=-pg
|
|
PROFILE_CPPFLAGS=
|
|
|
|
# Flags are set
|
|
cc_flags_set=yes
|
|
;;
|
|
esac
|
|
|
|
# Clear cc info if no flags set
|
|
if test X = "X$cc_flags_set"; then
|
|
cc_vendor=
|
|
cc_version=
|
|
fi
|