hdf5/config/gnu-flags
Bill Wendling 4a72a04048 [svn-r3891] Purpose:
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)
2001-05-07 19:04:50 -05:00

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