]> git.cworth.org Git - fips/blobdiff - configure
configure: Test whether compiler can create both 32 and 64-bit binaries
[fips] / configure
index 91797ce86eedce8895de98550ef3139793ec08f6..c584c93a349ad7023f58f4112bc942d4d734c6f8 100755 (executable)
--- a/configure
+++ b/configure
@@ -42,7 +42,6 @@ LDFLAGS=${LDFLAGS:-}
 # Set the defaults for values the user can specify with command-line
 # options.
 PREFIX=/usr/local
 # Set the defaults for values the user can specify with command-line
 # options.
 PREFIX=/usr/local
-LIBDIR=
 
 usage ()
 {
 
 usage ()
 {
@@ -82,8 +81,8 @@ specify an installation prefix other than $PREFIX using
 
 Fine tuning of some installation directories is available:
 
 
 Fine tuning of some installation directories is available:
 
+       --bindir=DIR            Install executables to DIR [PREFIX/bin]
        --libdir=DIR            Install libraries to DIR [PREFIX/lib]
        --libdir=DIR            Install libraries to DIR [PREFIX/lib]
-       --includedir=DIR        Install header files to DIR [PREFIX/include]
        --mandir=DIR            Install man pages to DIR [PREFIX/share/man]
        --sysconfdir=DIR        Read-only single-machine data [PREFIX/etc]
 
        --mandir=DIR            Install man pages to DIR [PREFIX/share/man]
        --sysconfdir=DIR        Read-only single-machine data [PREFIX/etc]
 
@@ -102,6 +101,36 @@ configure-script calling conventions, but don't do anything yet:
 EOF
 }
 
 EOF
 }
 
+# Given two absolute paths ("from" and "to"), compute a relative path
+# from "from" to "to". For example:
+#
+#      relative_path /foo/bar/baz /foo/qux -> ../../qux
+relative_path ()
+{
+    if [ $# -ne 2 ] ; then
+       echo "Internal error: relative_path requires exactly 2 arguments"
+       exit 1;
+    fi
+
+    from="$1"
+    to="$2"
+
+    # Handle trivial case up-front
+    if [ "$from" = "$to" ] ; then
+       echo ""
+    else
+       shared="$from"
+       relative=""
+
+       while [ "${to#$shared}" = "$to" ] && [ "$shared" != "." ] ; do
+           shared="$(dirname $shared)"
+           relative="..${relative:+/${relative}}"
+       done
+
+       echo "${relative:-.}${to#$shared}"
+    fi
+}
+
 # Parse command-line options
 for option; do
     if [ "${option}" = '--help' ] ; then
 # Parse command-line options
 for option; do
     if [ "${option}" = '--help' ] ; then
@@ -109,10 +138,10 @@ for option; do
        exit 0
     elif [ "${option%%=*}" = '--prefix' ] ; then
        PREFIX="${option#*=}"
        exit 0
     elif [ "${option%%=*}" = '--prefix' ] ; then
        PREFIX="${option#*=}"
+    elif [ "${option%%=*}" = '--bindir' ] ; then
+       BINDIR="${option#*=}"
     elif [ "${option%%=*}" = '--libdir' ] ; then
        LIBDIR="${option#*=}"
     elif [ "${option%%=*}" = '--libdir' ] ; then
        LIBDIR="${option#*=}"
-    elif [ "${option%%=*}" = '--includedir' ] ; then
-       INCLUDEDIR="${option#*=}"
     elif [ "${option%%=*}" = '--mandir' ] ; then
        MANDIR="${option#*=}"
     elif [ "${option%%=*}" = '--sysconfdir' ] ; then
     elif [ "${option%%=*}" = '--mandir' ] ; then
        MANDIR="${option#*=}"
     elif [ "${option%%=*}" = '--sysconfdir' ] ; then
@@ -142,17 +171,6 @@ for option; do
     fi
 done
 
     fi
 done
 
-# We set this value early, (rather than just while printing the
-# Makefile.config file later like most values), because we need to
-# actually investigate this value compared to the ldconfig_paths value
-# below.
-if [ -z "$LIBDIR" ] ; then
-    libdir_expanded="${PREFIX}/lib"
-else
-    # very non-general variable expansion
-    libdir_expanded=`echo "$LIBDIR" | sed "s|\\${prefix}|${PREFIX}|g; s|\\$prefix/|${PREFIX}/|; s|//*|/|g"`
-fi
-
 cat <<EOF
 Welcome to ${PROJECT}, ${PROJECT_BLURB}
 
 cat <<EOF
 Welcome to ${PROJECT}, ${PROJECT_BLURB}
 
@@ -174,13 +192,58 @@ EOF
 
 errors=0
 
 
 errors=0
 
+printf "Checking for pkg-config... "
 if pkg-config --version > /dev/null 2>&1; then
 if pkg-config --version > /dev/null 2>&1; then
-    have_pkg_config=1
+    printf "Yes.\n"
 else
 else
-    have_pkg_config=0
+    printf "No.\n"
+    cat <<EOF
+
+*** Error: This configure script requires pkg-config to find the
+compilation flags required to link against the various libraries
+needed by ${PROJECT}. The pkg-config program can be obtained from:
+
+       http://www.freedesktop.org/wiki/Software/pkg-config/
+
+Or you may be able install it with a command such as:
+
+       sudo apt-get install pkg-config
+    or:
+       sudo yum install pkgconfig
+
+EOF
+
+exit 1
+
 fi
 
 fi
 
-printf "Checking for talloc development files... "
+printf "Checking for working C compiler (${CC})... "
+printf "int main(void){return 42;}\n" > minimal.c
+if ${CC} -o minimal minimal.c > /dev/null 2>&1
+then
+    printf "Yes.\n"
+else
+    printf "No.\n"
+    cat <<EOF
+
+*** Error: No functioning C compiler found. Either set the CC environment
+to a working C compiler, or else install gcc:
+
+       http://gcc.gnu.org/
+
+You may be able to install gcc with a command such as:
+
+       sudo apt-get install build-essential
+    or:
+       sudo yum install make automake gcc gcc-c++ kernel-devel
+
+EOF
+
+exit 1
+
+fi
+
+printf "Checking for libtalloc... "
 if pkg-config --exists talloc; then
     printf "Yes.\n"
     have_talloc=1
 if pkg-config --exists talloc; then
     printf "Yes.\n"
     have_talloc=1
@@ -193,62 +256,132 @@ else
     errors=$((errors + 1))
 fi
 
     errors=$((errors + 1))
 fi
 
-libdir_in_ldconfig=0
-
-printf "Checking which platform we are on... "
-uname=`uname`
-if [ $uname = "Darwin" ] ; then
-    printf "Mac OS X.\n"
-    platform=MACOSX
-    linker_resolves_library_dependencies=0
-elif [ $uname = "SunOS" ] ; then
-    printf "Solaris.\n"
-    platform=SOLARIS
-    linker_resolves_library_dependencies=0
-elif [ $uname = "FreeBSD" ] ; then
-    printf "FreeBSD.\n"
-    platform=FREEBSD
-    linker_resolves_library_dependencies=0
-elif [ $uname = "OpenBSD" ] ; then
-    printf "OpenBSD.\n"
-    platform=OPENBSD
-    linker_resolves_library_dependencies=0
-elif [ $uname = "Linux" ] || [ $uname = "GNU" ] ; then
-    printf "$uname\n"
-    platform="$uname"
-    linker_resolves_library_dependencies=1
-
-    printf "Checking for $libdir_expanded in ldconfig... "
-    ldconfig_paths=$(/sbin/ldconfig -N -X -v 2>/dev/null | sed -n -e 's,^\(/.*\):\( (.*)\)\?$,\1,p')
-    # Separate ldconfig_paths only on newline (not on any potential
-    # embedded space characters in any filenames). Note, we use a
-    # literal newline in the source here rather than something like:
-    #
-    #  IFS=$(printf '\n')
-    #
-    # because the shell's command substitution deletes any trailing newlines.
-    IFS="
-"
-    for path in $ldconfig_paths; do
-       if [ "$path" = "$libdir_expanded" ]; then
-           libdir_in_ldconfig=1
-       fi
-    done
-    IFS=$DEFAULT_IFS
-    if [ "$libdir_in_ldconfig" = '0' ]; then
-       printf "No (will set RPATH)\n"
+printf "Checking for libelf... "
+printf "#include <gelf.h>\nint main(void){return elf_version (EV_CURRENT);}\n" > elf-minimal.c
+if ${CC} -o elf-minimal elf-minimal.c -lelf > /dev/null 2>&1
+then
+    printf "Yes.\n"
+    have_libelf=1
+    libelf_cflags=
+    libelf_ldflags=-lelf
+else
+    printf "No.\n"
+    have_libelf=0
+    libelf_cflags=
+    libelf_ldflags=
+    errors=$((errors + 1))
+fi
+rm -f elf-minimal elf-minimal.c
+
+printf "Checking for GL/gl.h... "
+have_gl=0
+if pkg-config --exists gl; then
+    printf "Yes.\n"
+    have_gl=1
+    gl_cflags=$(pkg-config --cflags gl)
+else
+    printf "#include <GL/gl.h>\nint main(void){return 0;}\n" > gl-minimal.c
+    if ${CC} -o gl-minimal gl-minimal.c > /dev/null 2>&1
+    then
+       printf "Yes.\n"
+       have_gl=1
+    else
+       printf "No.\n"
+       errors=$((errors + 1))
+    fi
+    rm -f gl-minimal gl-minimal.c
+fi
+
+printf "Checking for GL window-system-binding headers:\n"
+have_gl_winsys=0
+
+printf "       Checking for GL/glx.h... "
+have_glx=No
+printf "#include <GL/glx.h>\nint main(void){return 0;}\n" > glx-minimal.c
+if ${CC} -o glx-minimal glx-minimal.c ${gl_cflags} > /dev/null 2>&1
+then
+    printf "Yes.\n"
+    have_gl_winsys=1
+    have_glx=Yes
+else
+    printf "No.\n"
+fi
+rm -f glx-minimal glx-minimal.c
+
+printf "       Checking for GL/egl.h... "
+have_egl=No
+if pkg-config --exists egl; then
+    printf "Yes.\n"
+    have_egl=Yes
+    egl_cflags=$(pkg-config --cflags egl)
+else
+    printf "#include <GL/egl.h>\nint main(void){return 0;}\n" > egl-minimal.c
+    if ${CC} -o egl-minimal egl-minimal.c ${gl_cflags} > /dev/null 2>&1
+    then
+       printf "Yes.\n"
+       have_gl_winsys=1
+       have_egl=1
     else
     else
-       printf "Yes\n"
+       printf "No.\n"
+    fi
+    rm -f egl-minimal egl-minimal.c
+fi
+
+if [ $have_gl_winsys -eq 0 ]; then
+    errors=$((errors + 1))
+fi
+
+printf "int main(void){return 0;}\n" > minimal.c
+
+WARN_CFLAGS=""
+printf "Checking for available C compiler warning flags:\n"
+for flag in -Wall -Wextra -Wmissing-declarations; do
+    if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1
+    then
+       WARN_CFLAGS="${WARN_CFLAGS}${WARN_CFLAGS:+ }${flag}"
     fi
     fi
+done
+printf "\t${WARN_CFLAGS}\n"
+
+rm -f minimal minimal.c
+
+printf "#include <features.h>\nint main(void){return 0;}\n" > arch-minimal.c
+
+printf "Checking for machine-dependent compiler support:\n"
+
+printf "       Compiler can create 32-bit binaries... "
+have_m32=Yes
+if ${CC} -m32 -o arch-minimal arch-minimal.c > /dev/null 2>&1
+then
+    printf "Yes.\n"
 else
 else
-    printf "Unknown.\n"
+    printf "No.\n"
+    have_m32=No
+fi
+
+printf "       Compiler can create 64-bit binaries... "
+have_m64=Yes
+if ${CC} -m64 -o arch-minimal arch-minimal.c > /dev/null 2>&1
+then
+    printf "Yes.\n"
+else
+    printf "No.\n"
+    have_m64=No
+fi
+
+if [ "$have_m32" = "No" ] || [ "$have_m64" = "No" ]; then
     cat <<EOF
 
     cat <<EOF
 
-*** Warning: Unknown platform. ${PROJECT} might or might not build correctly.
+* Warning: Cannot create both 32 and 64-bit fips libraries. Fips will not
+           support applications of the non-native size. Fixing this may be
+           as simple as running a command such as:
 
 
+               sudo apt-get install gcc-multilib
 EOF
 fi
 
 EOF
 fi
 
+rm -f arch-minimal arch-minimal.c
+
 if [ $errors -gt 0 ]; then
     cat <<EOF
 
 if [ $errors -gt 0 ]; then
     cat <<EOF
 
@@ -262,6 +395,21 @@ EOF
        echo "  http://talloc.samba.org/"
        echo
     fi
        echo "  http://talloc.samba.org/"
        echo
     fi
+    if [ $have_libelf -eq 0 ]; then
+       echo "  The libelf library (including development files such as headers)"
+       echo "  http://http://sourceforge.net/projects/elftoolchain/"
+       echo
+    fi
+    if [ $have_gl -eq 0 ]; then
+       echo "  Open GL header files (GL/gl.h)"
+       echo "  http://www.mesa3d.org/"
+       echo
+    fi
+    if [ $have_gl_winsys -eq 0 ]; then
+       echo "  OpenGL window-system-bindings header files (GL/glx.h and/or GL/egl.h)"
+       echo "  http://www.mesa3d.org/"
+       echo
+    fi
     cat <<EOF
 With any luck, you're using a modern, package-based operating system
 that has all of these packages available in the distribution. In that
     cat <<EOF
 With any luck, you're using a modern, package-based operating system
 that has all of these packages available in the distribution. In that
@@ -269,35 +417,17 @@ case a simple command will install everything you need. For example:
 
 On Debian and similar systems:
 
 
 On Debian and similar systems:
 
-       sudo apt-get install libtalloc-dev
+       sudo apt-get install libtalloc-dev libelf-dev \\
+       libgl1-mesa-dev libgles2-mesa-dev
 
 Or on Fedora and similar systems:
 
 
 Or on Fedora and similar systems:
 
-       sudo yum install libtalloc-devel
+       sudo yum install libtalloc-devel libelf-devel \\
+       mesa-libGL-devel mesa-libGLES-devel
 
 On other systems, similar commands can be used, but the details of the
 package names may be different.
 
 
 On other systems, similar commands can be used, but the details of the
 package names may be different.
 
-EOF
-    if [ $have_pkg_config -eq 0 ]; then
-cat <<EOF
-Note: the pkg-config program is not available. This configure script
-uses pkg-config to find the compilation flags required to link against
-the various libraries needed by ${PROJECT}. It's possible you simply need
-to install pkg-config with a command such as:
-
-       sudo apt-get install pkg-config
-Or:
-       sudo yum install pkgconfig
-
-But if pkg-config is not available for your system, then you will need
-to modify the configure script to manually set the cflags and ldflags
-variables to the correct values to link against each library in each
-case that pkg-config could not be used to determine those values.
-
-EOF
-    fi
-cat <<EOF
 When you have installed the necessary dependencies, you can run
 configure again to ensure the packages can be found, or simply run
 "make" to compile.
 When you have installed the necessary dependencies, you can run
 configure again to ensure the packages can be found, or simply run
 "make" to compile.
@@ -306,24 +436,16 @@ EOF
     exit 1
 fi
 
     exit 1
 fi
 
-printf "int main(void){return 0;}\n" > minimal.c
+cat <<EOF
 
 
-WARN_CFLAGS=""
-printf "Checking for available C compiler warning flags... "
-for flag in -Wall -Wextra -Wmissing-declarations; do
-    if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1
-    then
-       WARN_CFLAGS="${WARN_CFLAGS}${WARN_CFLAGS:+ }${flag}"
-    fi
-done
-printf "\n\t${WARN_CFLAGS}\n"
+All required packages were found.
 
 
-rm -f minimal minimal.c
+The following OpenGL window-system bindings will be supported:
 
 
-cat <<EOF
+       GLX: ${have_glx}
+       EGL: ${have_egl}
 
 
-All required packages were found. You may now run the following
-commands to compile and install ${PROJECT}:
+You may now run the following commands to compile and install ${PROJECT}:
 
        make
        sudo make install
 
        make
        sudo make install
@@ -369,49 +491,62 @@ CC = ${CC}
 CFLAGS = ${CFLAGS}
 
 # Default FLAGS for the linker (can be overridden by user such as "make LDFLAGS=-znow")
 CFLAGS = ${CFLAGS}
 
 # Default FLAGS for the linker (can be overridden by user such as "make LDFLAGS=-znow")
-LDFLAGS = ${LDFLAGS} -ldl
+LDFLAGS = ${LDFLAGS}
 
 # Flags to enable warnings when using the C compiler
 WARN_CFLAGS=${WARN_CFLAGS}
 
 # The prefix to which ${PROJECT} should be installed
 
 # Flags to enable warnings when using the C compiler
 WARN_CFLAGS=${WARN_CFLAGS}
 
 # The prefix to which ${PROJECT} should be installed
-# Note: If you change this value here, be sure to ensure that the
-# LIBDIR_IN_LDCONFIG value below is still set correctly.
 prefix = ${PREFIX}
 
 prefix = ${PREFIX}
 
+# The directory to which executables should be installed
+bindir = ${BINDIR:=\$(prefix)/bin}
+
 # The directory to which libraries should be installed
 # The directory to which libraries should be installed
-# Note: If you change this value here, be sure to ensure that the
-# LIBDIR_IN_LDCONFIG value below is still set correctly.
 libdir = ${LIBDIR:=\$(prefix)/lib}
 
 libdir = ${LIBDIR:=\$(prefix)/lib}
 
-# Whether libdir is in a path configured into ldconfig
-LIBDIR_IN_LDCONFIG = ${libdir_in_ldconfig}
-
-# The directory to which header files should be installed
-includedir = ${INCLUDEDIR:=\$(prefix)/include}
-
 # The directory to which man pages should be installed
 mandir = ${MANDIR:=\$(prefix)/share/man}
 
 # The directory to which read-only (configuration) files should be installed
 sysconfdir = ${SYSCONFDIR:=\$(prefix)/etc}
 
 # The directory to which man pages should be installed
 mandir = ${MANDIR:=\$(prefix)/share/man}
 
 # The directory to which read-only (configuration) files should be installed
 sysconfdir = ${SYSCONFDIR:=\$(prefix)/etc}
 
-# Supported platforms (so far) are: LINUX, MACOSX, SOLARIS, FREEBSD, OPENBSD
-PLATFORM = ${platform}
-
-# Whether the linker will automatically resolve the dependency of one
-# library on another (if not, then linking a binary requires linking
-# directly against both)
-LINKER_RESOLVES_LIBRARY_DEPENDENCIES = ${linker_resolves_library_dependencies}
+# Whether compiler can create 32 or 64-bit binaries
+COMPILER_SUPPORTS_32 = ${have_m32}
+COMPILER_SUPPORTS_64 = ${have_m64}
 
 # Flags needed to compile and link against talloc
 TALLOC_CFLAGS = ${talloc_cflags}
 TALLOC_LDFLAGS = ${talloc_ldflags}
 
 
 # Flags needed to compile and link against talloc
 TALLOC_CFLAGS = ${talloc_cflags}
 TALLOC_LDFLAGS = ${talloc_ldflags}
 
+# Flags needed to compile and link against libelf
+LIBELF_CFLAGS = ${libelf_cflags}
+LIBELF_LDFLAGS = ${libelf_ldflags}
+
+# Whether GLX headers are available
+HAVE_GLX = ${have_glx}
+
+# Flags needed to find GL and GLX header files (GL/gl.h and GL/glx.h)
+GL_CFLAGS = ${gl_cflags}
+
+# Whether EGL headers are available
+HAVE_EGL = ${have_egl}
+
+# Flags needed to find EGL header files (EGL/egl.h)
+EGL_CFLAGS = ${egl_cflags}
+
 # Flags needed to have linker link only to necessary libraries
 AS_NEEDED_LDFLAGS = ${as_needed_ldflags}
 
 # Combined flags for compiling and linking against all of the above
 # Flags needed to have linker link only to necessary libraries
 AS_NEEDED_LDFLAGS = ${as_needed_ldflags}
 
 # Combined flags for compiling and linking against all of the above
-CONFIGURE_CFLAGS = \$(TALLOC_CFLAGS)
-CONFIGURE_LDFLAGS = \$(TALLOC_LDFLAGS)
+CONFIGURE_CFLAGS = \$(TALLOC_CFLAGS) \$(LIBELF_CFLAGS) \$(GL_CFLAGS) \$(EGL_CFLAGS)
+CONFIGURE_LDFLAGS = \$(TALLOC_LDFLAGS) \$(LIBELF_LDFLAGS)
+EOF
+
+# construct config.h
+cat > config.h <<EOF
+/* Generated by configure. */
+
+/* Relative path from ${bindir} to ${libdir} */
+#define BINDIR_TO_LIBFIPSDIR "$(relative_path ${BINDIR} ${LIBDIR})/fips"
 EOF
 EOF