Blob Blame History Raw
#!/bin/sh
# dlfcn-win32 configure script
#
# Copyright (c) 2007, 2009, 2012 Ramiro Polla
# Copyright (c) 2014 Tiancheng "Timothy" Gu
#
# Parts copied from FFmpeg's configure. Original license was:
#
# Copyright (c) 2000-2002 Fabrice Bellard
# Copyright (c) 2005-2007 Diego Biurrun
# Copyright (c) 2005-2007 Mans Rullgard
#
# dlfcn-win32 is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.

# dlfcn-win32 is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with dlfcn-win32; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

set_all(){
    value=$1
    shift
    for var in $*; do
        eval $var=$value
    done
}

enable(){
    set_all yes $*
}

disable(){
    set_all no $*
}

enabled(){
    eval test "x\$$1" = "xyes"
}

disabled(){
    eval test "x\$$1" = "xno"
}

show_help(){
  echo "Usage: configure [options]"
  echo "Options: [defaults in brackets after descriptions]"
  echo "All \"enable\" options have \"disable\" counterparts"
  echo
  echo "  --help                    print this message"
  echo "  --prefix=PREFIX           install in PREFIX [$prefix]"
  echo "  --libdir=DIR              install libs in DIR [$libdir]"
  echo "  --incdir=DIR              install includes in DIR [$incdir]"
  echo "  --enable-shared           build shared libraries [no]"
  echo "  --enable-static           build static libraries [yes]"
  echo "  --enable-msvc             create msvc-compatible import lib [auto]"
  echo "  --enable-stripping        strip shared library [yes]"
  echo "  --enable-wine[=cmd]       use wine in tests [auto,cmd=$winecmd]"
  echo
  echo "  --cc=CC                   use C compiler CC [$cc_default]"
  echo "  --cross-prefix=PREFIX     use PREFIX for compilation tools [$cross_prefix]"
  exit 1
}

die_unknown(){
    echo "Unknown option \"$1\"."
    echo "See $0 --help for available options."
    exit 1
}

prefix="/mingw"
libdir='${prefix}/lib'
incdir='${prefix}/include'
ar="ar"
cc_default="gcc"
ranlib="ranlib"
strip="strip"
winecmd="wine"

DEFAULT="msvc
    wine
"

DEFAULT_NO="shared
"

DEFAULT_YES="static
    stripping
"

CMDLINE_SELECT="$DEFAULT
    $DEFAULT_NO
    $DEFAULT_YES
"

enable  $DEFAULT_YES
disable $DEFAULT_NO

for opt do
    optval="${opt#*=}"
    case "$opt" in
    --help)
        show_help
    ;;
    --prefix=*)
        prefix="$optval"
    ;;
    --libdir=*)
        libdir="$optval"
    ;;
    --incdir=*)
        incdir="$optval"
    ;;
    --cc=*)
        cc="$optval"
    ;;
    --cross-prefix=*)
        cross_prefix="$optval"
    ;;
    --enable-wine=*)
        winecmd="$optval"
        enable wine
    ;;
    --enable-?*|--disable-?*)
        eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'`
        echo "$CMDLINE_SELECT" | grep -q "^ *$option\$" || die_unknown $opt
        $action $option
    ;;
    *)
        die_unknown $opt
    ;;
    esac
done

ar="${cross_prefix}${ar}"
cc_default="${cross_prefix}${cc_default}"
ranlib="${cross_prefix}${ranlib}"
strip="${cross_prefix}${strip}"

if ! test -z $cc; then
    cc_default="${cc}"
fi
cc="${cc_default}"

disabled shared && disabled static && {
    echo "At least one library type must be set.";
    exit 1;
}

# simple cc test
cat > tmptest.c << EOF
#include <windows.h>
void function(void)
{ LoadLibrary(NULL); }
EOF
echo testing compiler: $cc -shared -o tmptest.dll tmptest.c
$cc -shared -o tmptest.dll tmptest.c

test "$?" != 0 && {
    echo "$cc could not create shared file with Windows API functions.";
    echo "Make sure your MinGW system is working properly.";
    exit 1;
}

if enabled wine; then      # wine explicitly enabled
    $winecmd --version > /dev/null 2>&1 /dev/null || {
        echo "wine command not found."
        echo "Make sure wine is installed and its bin folder is in your \$PATH."
        exit 1
    }
elif disabled wine; then   # explicitly disabled
    winecmd=""
else                       # autodetect
    $winecmd --version > /dev/null 2>&1 /dev/null && enable wine || winecmd=""
fi

if ! enabled stripping; then
    strip="@echo ignoring strip"
fi

if enabled msvc; then      # msvc explicitly enabled
    disabled shared && {
        echo "MSVC understands static libraries created by gcc."
        echo "There's no need to create an import lib."
        exit 1
    }
    lib /? > /dev/null 2>&1 /dev/null || {
        echo "MSVC's lib command not found."
        echo "Make sure MSVC is installed and its bin folder is in your \$PATH."
        exit 1
    }
fi

if enabled shared; then    # msvc autodetected
    lib /? > /dev/null 2>&1 /dev/null && enable msvc || disable msvc
fi

enabled msvc && libcmd="lib" || libcmd="@echo ignoring lib"

echo "# Automatically generated by configure" > config.mak
echo "prefix=$prefix" >> config.mak
echo "libdir=$libdir" >> config.mak
echo "incdir=$incdir" >> config.mak
echo "AR=$ar" >> config.mak
echo "CC=$cc" >> config.mak
echo "RANLIB=$ranlib" >> config.mak
echo "STRIP=$strip" >> config.mak
echo "BUILD_SHARED=$shared" >> config.mak
echo "BUILD_STATIC=$static" >> config.mak
echo "BUILD_MSVC=$msvc" >> config.mak
echo "LIBCMD=$libcmd" >> config.mak
echo "WINE=$winecmd" >> config.mak

echo "prefix: $prefix"
echo "libdir: $libdir"
echo "incdir: $incdir"
echo "ar:     $ar"
echo "cc:     $cc"
echo "ranlib: $ranlib"
echo "strip:  $strip"
echo "static: $static"
echo "shared: $shared"
if enabled shared; then
    echo "msvc:   $msvc";
    echo "strip:  $stripping";
fi
echo "wine:   $wine $winecmd"