Files
jhendersonHDF 4a12cfec19 Align CMake compiler wrappers with old Autotools versions (#5649)
Implemented missing --help/-h, -c, -echo and -shlib/-noshlib options

Added new -nohl option to avoid building and linking against
high-level HDF5 libraries if desired

Implemented adding of HDF5 installation library directory to rpath of
resulting executable/library and added new -norpath option to avoid
this behavior if desired

Added parsing of HDF5_USE_SHLIB environment variable to determine
whether to link against shared or static HDF5 libraries

Added parsing of HDF5_PKG_CONFIG_ARGS environment variable to separate
pkg-config-specific options from compiler-specific options and prevent
conflicts
2025-07-28 07:42:52 -05:00

280 lines
9.3 KiB
Bash

#! /bin/sh
##
# Copyright by The HDF Group.
# All rights reserved.
#
# This file is part of HDF5. The full HDF5 copyright notice, including
# terms governing use, modification, and redistribution, is contained in
# the LICENSE file, which can be found at the root of the source code
# distribution tree, or in https://www.hdfgroup.org/licenses.
# If you do not have access to either file, you may request a copy from
# help@hdfgroup.org.
##
# Constants definitions
EXIT_SUCCESS=0
EXIT_FAILURE=1
# Variables to control final behavior of script
do_show="no"
do_compile="yes"
do_link="yes"
# Add the HDF5 library directory to the rpath of the
# built executable/library by default
add_rpath="yes"
# Variables for arguments passed to pkg-config and compiler
pc_args="${HDF5_PKG_CONFIG_ARGS}"
compile_args=""
prefix=""
libdir=""
# Variables for flags passed to pkg-config and compiler
pc_flags=""
status=$EXIT_SUCCESS
# Determine name and location of script
prg=$0
if [ ! -e "$prg" ]; then
case $prg in
(*/*) exit 1;;
(*) prg=$(command -v -- "$prg") || exit;;
esac
fi
dir=$(
cd -P -- "$(dirname -- "$prg")/.." && pwd -P
) || exit
prog_name=$(basename -- "$prg") || exit
prg=$dir/bin/$prog_name
prefix=$dir
libdir=$dir/@HDF5_INSTALL_LIB_DIR@
export PKG_CONFIG_PATH=$libdir/pkgconfig
# Show the configuration summary of the library recorded in the
# libhdf5.settings file residing in the lib directory.
showconfigure()
{
cat $dir/@HDF5_INSTALL_LIB_DIR@/libhdf5.settings
status=$?
}
usage() {
# "How-to use" message.
echo "usage: $prog_name [OPTIONS] <compile line>"
echo " OPTIONS:"
echo " -help | --help | -h This help message."
echo " -echo Show all the shell commands executed"
echo " -show Show the commands without executing them"
echo " -showconfig Show the HDF5 library configuration summary"
echo " -shlib Compile with shared HDF5 libraries [default for"
echo " hdf5 built with shared libraries]"
echo " -noshlib Compile with static HDF5 libraries [default for"
echo " hdf5 built without shared libraries]"
echo " -nohl By default, $prog_name builds and links against the"
echo " high-level HDF5 library, if it is available."
echo " Specifying the -nohl option disables this behavior."
echo " -norpath By default, $prog_name adds the library directory"
echo " of the HDF5 installation to the rpath of the resulting"
echo " executable/library when linking against shared HDF5"
echo " libraries. If this behavior is not desired or is"
echo " problematic for a particular compiler/linker, specifying"
echo " the -norpath option disables this behavior."
echo " -c Compile and assemble without linking. When combined"
echo " with -show, displays only the compile flags without"
echo " displaying the linking flags. Otherwise, passes the"
echo " '-c' flag to the compiler, where it's assumed that"
echo " the flag will have the behavior of 'compile and"
echo " assemble without linking'. Note that this may not"
echo " be the case for some compilers."
echo " "
echo " <compile line> - the normal compile line options for your compiler."
echo " $prog_name uses the same compiler you used to compile"
echo " HDF5, unless an alternate compiler is specified at"
echo " configuration time. Check with your compiler's man"
echo " pages for more information on which options are needed."
echo " "
echo " All options specific to $prog_name should appear BEFORE"
echo " any options specified for <compile line>."
echo " "
echo " You can override whether or not to use shared or static HDF5 libraries"
echo " by setting the following environment variable:"
echo " "
echo " HDF5_USE_SHLIB=[yes|no] - use shared or static version of the HDF5 library."
echo " precedence is given to the -shlib/-noshlib options."
echo " [default: yes except when built with only"
echo " static libraries]"
echo " "
echo " $prog_name uses pkg-config to determine additional flags to pass to the"
echo " compiler. You can specify any options to pass to pkg-config by setting the"
echo " following environment variable:"
echo " "
echo " HDF5_PKG_CONFIG_ARGS"
echo " "
}
if test $# -eq 0; then
# No parameters specified, issue usage statement and exit.
usage
exit $EXIT_FAILURE
fi
# If a shared library is available, the default will be to use it. If the only
# available library is static, it will be used by default. The user can
# override either default, although choosing an unavailable library will result
# in errors from h5cc.
SHARED_AVAILABLE="@BUILD_SHARED_LIBS@"
STATIC_AVAILABLE="@BUILD_STATIC_LIBS@"
if test "${SHARED_AVAILABLE}" = "ON"; then
USE_SHARED_LIB="${HDF5_USE_SHLIB:-yes}"
else
USE_SHARED_LIB="${HDF5_USE_SHLIB:-no}"
fi
# If the high-level library is available, the default will be to build and
# link against it.
USE_HL_LIB="yes"
HL_AVAILABLE="@HDF5_BUILD_HL_LIB@"
if test "${HL_AVAILABLE}" = "ON"; then
HL_LIB_NAME="@_PKG_CONFIG_HL_LIBNAME@"
else
USE_HL_LIB="no"
fi
for arg in $@ ; do
case "$arg" in
-help|--help|-h)
usage
exit $EXIT_SUCCESS
;;
-echo)
shift
set -x
;;
-show)
shift
# Delay showing command-line until arguments have been processed
do_show="yes"
;;
-showconfig)
showconfigure
exit $status
;;
-shlib)
shift
USE_SHARED_LIB="yes"
;;
-noshlib)
shift
USE_SHARED_LIB="no"
;;
-nohl)
shift
USE_HL_LIB="no"
;;
-norpath)
shift
add_rpath="no"
;;
-c)
compile_args="${compile_args:+${compile_args} }$arg"
shift
do_link="no"
;;
*)
# For now, any unrecognized arguments are passed directly on to the
# compiler to simplify handling of them. It's assumed that any
# h5cc-specific options come before these arguments. If this proves
# to be insufficient, arguments should be stored somewhere and
# shifted off the command-line.
;;
esac
done
# Check availability of default or requested HDF5 library type
if test "${USE_SHARED_LIB}" = "yes" -a "${SHARED_AVAILABLE}" != "ON"; then
echo "error: linking against shared HDF5 libraries was requested, but shared HDF5 libraries aren't available" >&2
exit $EXIT_FAILURE
elif test "${USE_SHARED_LIB}" = "no" -a "${STATIC_AVAILABLE}" != "ON"; then
echo "error: linking against static HDF5 libraries was requested, but static HDF5 libraries aren't available" >&2
exit $EXIT_FAILURE
fi
# Add in relevant flags to pkg-config command
pc_args="${pc_args:+${pc_args} }--define-variable=prefix=$prefix"
if test "$do_compile" = "yes"; then
pc_args="${pc_args:+${pc_args} }--cflags"
fi
if test "$do_link" = "yes"; then
pc_args="${pc_args:+${pc_args} }--libs"
fi
if test "$USE_SHARED_LIB" = "no"; then
pc_args="${pc_args:+${pc_args} }--static"
fi
pc_args="${pc_args:+${pc_args} }@_PKG_CONFIG_LIBNAME@"
# Build and link against high-level library,
# unless requested not to.
if test "${USE_HL_LIB}" = "yes"; then
pc_args="${pc_args:+${pc_args} }${HL_LIB_NAME}"
fi
# Evaluate pkg-config command for later use
pc_flags="`pkg-config $pc_args`"
if test $? -ne 0; then
echo "pkg-config failed with arguments: $pc_args" >&2
exit $EXIT_FAILURE
fi
# If linking against static HDF5 libraries, fixup the
# flags generated by pkg-config to point to the static
# libraries
if test "$do_link" = "yes" -a "$USE_SHARED_LIB" = "no"; then
# Escape '/' in libdir path to not conflict with sed delimiter
escaped_libdir=$(echo "$libdir" | sed 's/\//\\\//g')
# Replace flags of form '-lhdf5*' with path to matching static library
edited_pc_flags=$(echo "$pc_flags" | sed -E 's/-l(hdf5[a-z0-9_]*)/'"${escaped_libdir}\/"'lib\1.a/g')
if test $? -ne 0; then
echo "couldn't edit flags to compile against static HDF5 libraries" >&2
exit $EXIT_FAILURE
fi
pc_flags=$edited_pc_flags
fi
# If linking against shared HDF5 libraries, add the
# HDF5 library directory to the rpath of the executable
# if not requested not to.
if test "$do_link" = "yes" -a "$USE_SHARED_LIB" = "yes" -a "$add_rpath" = "yes"; then
# Simply assume that the -Wl,-rpath,<dir> form is acceptable
# for the compiler and -rpath is a linker option. Add
# compiler/linker-specific logic as needed.
compile_args="${compile_args:+${compile_args} }-Wl,-rpath,$libdir"
fi
# If -show was passed, only output the command-line, don't execute it
if test "$do_show" = "yes"; then
echo @_PKG_CONFIG_COMPILER@ ${compile_args:+"${compile_args} "}"$@" "$pc_flags"
exit $EXIT_SUCCESS
fi
@_PKG_CONFIG_COMPILER@ $compile_args "$@" $pc_flags
status=$?
if test $status -ne 0; then
echo "compile failed with command: @_PKG_CONFIG_COMPILER@ $compile_args $@ $pc_flags" >&2
fi
exit $status