From 18ed3103650ca6be672d2b853cf4f5196f363662 Mon Sep 17 00:00:00 2001 From: Yevgen Muntyan <17531749+muntyan@users.noreply.github.com> Date: Wed, 10 Jan 2007 04:15:27 -0600 Subject: [PATCH] New macro for mingw python, actually working; made mingw-configure make configure remember everything, so mingw-configure is required only for initial configuration --- m4/moo-pygtk.m4 | 22 +++++---- m4/moo-python.m4 | 85 ++++------------------------------ m4/python-cross-mingw.m4 | 99 ++++++++++++++++++++++++++++++++++++++++ mingw-configure | 95 ++++++++++++++++++++++---------------- 4 files changed, 177 insertions(+), 124 deletions(-) create mode 100644 m4/python-cross-mingw.m4 diff --git a/m4/moo-pygtk.m4 b/m4/moo-pygtk.m4 index 42a02720..90ebf14b 100644 --- a/m4/moo-pygtk.m4 +++ b/m4/moo-pygtk.m4 @@ -78,16 +78,16 @@ AC_DEFUN([_MOO_AC_CHECK_PYGTK_MINGW],[ ############################################################################## -# _MOO_AC_CHECK_PYGTK_UNIX(action-if-found,action-if-not-found) +# _MOO_AC_CHECK_PYGTK_UNIX(python-version,action-if-found,action-if-not-found) # checks pygtk stuff # AC_DEFUN([_MOO_AC_CHECK_PYGTK_UNIX],[ - PKG_CHECK_MODULES(PYGTK,pygtk-2.0 >= 2.6.0,[ + PKG_CHECK_MODULES(PYGTK$1,pygtk-2.0 >= 2.6.0,[ AC_MSG_CHECKING([whether pygtk can be used]) save_CPPFLAGS="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS $PYGTK_CFLAGS $PYTHON_CFLAGS" + CPPFLAGS="$CPPFLAGS $PYGTK[]$1[]_CFLAGS $PYTHON[]$1[]_INCLUDES" save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $PYGTK_CFLAGS $PYTHON_CFLAGS" + CFLAGS="$CFLAGS $PYGTK[]$1[]_CFLAGS $PYTHON[]$1[]_INCLUDES" AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ #include @@ -97,16 +97,20 @@ AC_DEFUN([_MOO_AC_CHECK_PYGTK_UNIX],[ return 0; }]])],[ AC_MSG_RESULT(yes) - $2 PYGTK_DEFS_DIR=`$PKG_CONFIG --variable=defsdir pygtk-2.0` AC_SUBST(PYGTK_DEFS_DIR) PYGTK_CODEGEN_DIR=`$PKG_CONFIG --variable=codegendir pygtk-2.0` AC_SUBST(PYGTK_CODEGEN_DIR) + m4_if([$1],,,[ + AC_SUBST(PYGTK[]$1[]_DEFS_DIR,[$PYGTK_DEFS_DIR]) + AC_SUBST(PYGTK[]$1[]_CODEGEN_DIR,[$PYGTK_CODEGEN_DIR]) + ]) AC_MSG_NOTICE([pygtk defs dir: $PYGTK_DEFS_DIR]) _MOO_AC_PYGTK_CODEGEN + m4_if([$2],[],[:],[$2]) ],[ AC_MSG_RESULT([no]) - $3 + m4_if([$3],[],[:],[$3]) ]) CFLAGS="$save_CFLAGS" @@ -127,10 +131,10 @@ AC_DEFUN([_MOO_AC_CHECK_PYGTK],[ if test "x$MOO_OS_CYGWIN" != "xyes"; then if test "x$MOO_OS_MINGW" = "xyes"; then - _MOO_AC_CHECK_PYGTK_MINGW([24],[$2],[$3]) - _MOO_AC_CHECK_PYGTK_MINGW([25],[$2],[$3]) + _MOO_AC_CHECK_PYGTK_UNIX([24],[$2],[$3]) + _MOO_AC_CHECK_PYGTK_UNIX([25],[$2],[$3]) else - _MOO_AC_CHECK_PYGTK_UNIX([$1],[$2],[$3]) + _MOO_AC_CHECK_PYGTK_UNIX(,[$2],[$3]) fi fi ]) diff --git a/m4/moo-python.m4 b/m4/moo-python.m4 index 7404ed9e..ef6ed24a 100644 --- a/m4/moo-python.m4 +++ b/m4/moo-python.m4 @@ -1,70 +1,3 @@ -############################################################################## -# _MOO_AC_CHECK_PYTHON_MINGW(version,action-if-found,action-if-not-found) -# checks python stuff when building for mingw. it's broken -# -AC_DEFUN([_MOO_AC_CHECK_PYTHON_MINGW],[ - if test -z "$PYTHON[]$1[]_PARENT_DIR"; then - PYTHON[]$1[]_PARENT_DIR=/usr/local/win - fi - if test -z "$PYTHON[]$1[]_PREFIX"; then - PYTHON[]$1[]_PREFIX=$PYTHON[]$1[]_PARENT_DIR/Python$1 - fi - if test -z "$PYTHON[]$1[]_CFLAGS"; then - PYTHON[]$1[]_CFLAGS="-I$PYTHON[]$1[]_PREFIX/include -mno-cygwin" - fi - if test -z "$PYTHON[]$1[]_LIBS"; then - PYTHON[]$1[]_LIBS="-L$PYTHON[]$1[]_PREFIX/libs -lpython$1 -mno-cygwin" - fi - if test -z "$PYTHON[]$1"; then - PYTHON[]$1="python" - fi - - PYTHON_PARENT_DIR="$PYTHON[]$1[]_PARENT_DIR" - PYTHON_PREFIX="$PYTHON[]$1[]_PREFIX" - PYTHON="$PYTHON[]$1[]" - - # check whether Python.h and library exists - - moo_ac_save_CPPFLAGS="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS $PYTHON[]$1[]_CFLAGS" - moo_ac_save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $PYTHON[]$1[]_CFLAGS" - moo_ac_save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $PYTHON[]$1[]_LIBS" - - AC_MSG_CHECKING([PYTHON[]$1[]_CFLAGS]) - AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ - #include - int main () - { - Py_Initialize(); - PyRun_SimpleString("from time import time,ctime\n" - "print 'Today is',ctime(time())\n"); - Py_Finalize(); - return 0; - }]])],[ - AC_MSG_RESULT([$PYTHON[]$1[]_CFLAGS]) - AC_MSG_CHECKING([PYTHON[]$1[]_LIBS]) - AC_MSG_RESULT([$PYTHON[]$1[]_LIBS]) - AC_MSG_NOTICE([Did not do real linking]) - AC_SUBST(PYTHON[]$1[]_CFLAGS) - AC_SUBST(PYTHON[]$1[]_LIBS) - pyexecdir=$PYTHON[]$1[]_PREFIX/Lib/site-packages - m4_if([$2],[],[:],[$2]) - ],[ - AC_MSG_RESULT([Not found]) - PYTHON[]$1[]_CFLAGS="" - PYTHON[]$1[]_LIBS="" - PYTHON[]$1[]_EXTRA_LIBS="" - m4_if([$3],[],[:],[$3]) - ]) - - LDFLAGS="$moo_ac_save_LDFLAGS" - CFLAGS="$moo_ac_save_CFLAGS" - CPPFLAGS="$moo_ac_save_CPPFLAGS" -]) - - ############################################################################## # _MOO_AC_PYTHON_DEVEL(action-if-found,action-if-not-found) # checks python headers and libs. it's @@ -86,21 +19,21 @@ Please check your Python installation.]) fi # Check for Python include path - # if PYTHON_CFLAGS is set, do not do anything + # if PYTHON_INCLUDES is set, do not do anything if test $python_found = yes; then AC_MSG_CHECKING([for Python include path]) - if test -z "$PYTHON_CFLAGS"; then + if test -z "$PYTHON_INCLUDES"; then python_path=`$PYTHON -c "import distutils.sysconfig; \ print distutils.sysconfig.get_python_inc();"` if test -n "${python_path}"; then python_path="-I$python_path" fi - PYTHON_CFLAGS=$python_path + PYTHON_INCLUDES=$python_path fi - AC_MSG_RESULT([$PYTHON_CFLAGS]) - AC_SUBST([PYTHON_CFLAGS]) + AC_MSG_RESULT([$PYTHON_INCLUDES]) + AC_SUBST([PYTHON_INCLUDES]) fi # Check for Python linker flags @@ -181,7 +114,7 @@ AC_DEFUN([_MOO_AC_CHECK_PYTHON_UNIX],[ if test x$python_found = xyes; then m4_if([$2],[],[:],[$2]) else - PYTHON_CFLAGS="" + PYTHON_INCLUDES="" PYTHON_LIBS="" PYTHON_EXTRA_LIBS="" m4_if([$3],[],[:],[$3]) @@ -198,10 +131,10 @@ AC_MSG_NOTICE([checking for headers and libs required to compile python extensio AC_REQUIRE([MOO_AC_CHECK_OS]) if test x$MOO_OS_CYGWIN != xyes; then if test x$MOO_OS_MINGW = xyes; then - _MOO_AC_CHECK_PYTHON_MINGW([24],[$2],[$3]) - _MOO_AC_CHECK_PYTHON_MINGW([25],[$2],[$3]) + AM_PYTHON_DEVEL_CROSS_MINGW([$2],[$3],[2.4]) + AM_PYTHON_DEVEL_CROSS_MINGW([$2],[$3],[2.5]) else - _MOO_AC_CHECK_PYTHON_UNIX([$1],[$2],[$3]) + _MOO_AC_CHECK_PYTHON_UNIX([$1],[$2],[$3]) fi fi ]) diff --git a/m4/python-cross-mingw.m4 b/m4/python-cross-mingw.m4 new file mode 100644 index 00000000..e15b7ed4 --- /dev/null +++ b/m4/python-cross-mingw.m4 @@ -0,0 +1,99 @@ +dnl AM_PYTHON_DEVEL_CROSS_MINGW([action-if-found[,action-if-not-found[,version]]]) +AC_DEFUN([AM_PYTHON_DEVEL_CROSS_MINGW],[ + m4_if([$3],[],[ + m4_define([_ac_m4_pyver],[]) + ],[ + m4_define([_ac_m4_pyver],[m4_bpatsubst([$3],[\.])]) + ]) + + if test "x$PYTHON[]_ac_m4_pyver[]_HOME" = x; then + AC_MSG_ERROR([PYTHON[]_ac_m4_pyver[]_HOME environment variable must be set dnl + when cross-compiling with mingw]) + fi + + AC_MSG_CHECKING(host system python version) + m4_if([$3],,[ + if test "x$PYTHON[]_ac_m4_pyver[]_VERSION" = x; then + # guess python version, very clever heuristics here + for _ac_python_minor in 3 4 5 6 7 8 9; do + if test -f "$PYTHON[]_ac_m4_pyver[]_HOME/libs/libpython2$_ac_python_minor.a" -o \ + -f "$PYTHON[]_ac_m4_pyver[]_HOME/libs/python2$_ac_python_minor.lib" ; + then + _ac_pyversion="2.$_ac_python_minor" + break + fi + done + else + _ac_pyversion=$PYTHON[]_ac_m4_pyver[]_VERSION + fi + + if test "x$_ac_pyversion" = x; then + AC_MSG_ERROR([Could not determine Python version]) + fi + ],[ + _ac_pyversion=$3 + ]) + AC_MSG_RESULT([$_ac_pyversion]) + _ac_pyversion_no_dot=`echo $_ac_pyversion | $SED 's/^2\.*\([[3-9]]\).*/2\1/'` + + AC_MSG_CHECKING(installation directory for python modules) + if test "x$PYTHON[]_ac_m4_pyver[]_PKG_DIR" != x; then + _ac_pythondir=$PYTHON[]_ac_m4_pyver[]_PKG_DIR + else + _ac_pythondir="$PYTHON[]_ac_m4_pyver[]_HOME/Lib/site-packages" + fi + AC_MSG_RESULT([$_ac_pythondir]) + + if test "x$PYTHON[]_ac_m4_pyver[]_INCLUDES" != x; then + _ac_pyincludes=$PYTHON[]_ac_m4_pyver[]_INCLUDES + else + _ac_pyincludes="-I$PYTHON[]_ac_m4_pyver[]_HOME/include" + fi + + if test "x$PYTHON[]_ac_m4_pyver[]_LIBS" != x; then + _ac_pylibs=$PYTHON[]_ac_m4_pyver[]_LIBS + else + _ac_pylibs="-L$PYTHON[]_ac_m4_pyver[]_HOME/libs -lpython$_ac_pyversion_no_dot" + fi + + _ac_have_pydev=false + _ac_save_CPPFLAGS="$CPPFLAGS" + _ac_save_LDFLAGS="$LDFLAGS" + CPPFLAGS="$CPPFLAGS $_ac_pyincludes" + LDFLAGS="$LDFLAGS $_ac_pylibs" + AC_MSG_CHECKING(python headers and linker flags) + dnl AC_TRY_LINK is buggy, it puts libs before source file on compilation + dnl command line + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ + #include + int main () + { + Py_Initialize(); + return 0; + }]])],[ + AC_MSG_RESULT([$_ac_pyincludes $_ac_pylibs]) + _ac_have_pydev=true + ],[ + AC_MSG_RESULT(not found) + ]) + CPPFLAGS="$_ac_save_CPPFLAGS" + LDFLAGS="$_ac_save_LDFLAGS" + + if $_ac_have_pydev; then + AC_SUBST(PYTHON[]_ac_m4_pyver[]_PLATFORM, [nt]) + AC_SUBST(PYTHON[]_ac_m4_pyver[]_INCLUDES,[$_ac_pyincludes]) + AC_SUBST(PYTHON[]_ac_m4_pyver[]_LIBS,[$_ac_pylibs]) + AC_SUBST(PYTHON[]_ac_m4_pyver[]_EXTRA_LIBS,[]) + AC_SUBST(PYTHON[]_ac_m4_pyver[]_LDFLAGS,[]) + AC_SUBST(PYTHON[]_ac_m4_pyver[]_EXTRA_LDFLAGS,[]) + AC_SUBST(python[]_ac_m4_pyver[]dir,[$_ac_pythondir]) + AC_SUBST(pyexec[]_ac_m4_pyver[]dir,[$_ac_pythondir]) + AC_SUBST(pkgpython[]_ac_m4_pyver[]dir,[\${python[]_ac_m4_pyver[]dir}/$PACKAGE]) + AC_SUBST(pkgpyexec[]_ac_m4_pyver[]dir,[\${python[]_ac_m4_pyver[]dir}/$PACKAGE]) + m4_if([$1],[],[:],[$1]) + else + m4_if([$2],[],[:],[$2]) + fi + + m4_undefine([_ac_m4_pyver]) +]) diff --git a/mingw-configure b/mingw-configure index 2dc7cae6..909f08a8 100755 --- a/mingw-configure +++ b/mingw-configure @@ -9,33 +9,34 @@ cat > $1 << ENDSRIPT export PKG_CONFIG_LIBDIR="$GTK_PREFIX/lib/pkgconfig":"$PYTHON_PREFIX/Lib/pkgconfig" export PKG_CONFIG_PATH=\$PKG_CONFIG_LIBDIR -if [ "x\$1" = "x--atleast-pkgconfig-version" -o "x\$1" = "x--atleast-version" ]; then +# pkg-config doesn't like --define-variable with these +if [ "x\`echo "\$*" | grep -- --atleast-pkgconfig-version\`" != x -o \\ + "x\`echo "\$*" | grep -- --atleast-version\`" != x ]; then exec "$PKG_CONFIG_PROGRAM" \$* else - if [ "x\$2" = "xpygtk-2.0" -o "x\$2" = "xpygobject-2.0" -o \\ - "x\$3" = "xpygtk-2.0" -o "x\$3" = "xpygobject-2.0" ]; - then - prefix="$PYTHON_PREFIX" - else - prefix="$GTK_PREFIX" - fi - - exec "$PKG_CONFIG_PROGRAM" --define-variable=prefix=\$prefix \$* + exec "$PKG_CONFIG_PROGRAM" --define-variable=prefix="$GTK_PREFIX" \$* fi ENDSRIPT chmod +x $1 } -export PKG_CONFIG_PROGRAM=${PKG_CONFIG_PROGRAM:-/usr/bin/pkg-config} -export MINGW_TOOL_PREFIX=${MINGW_TOOL_PREFIX:-/usr/bin/i586-mingw32msvc} +PKG_CONFIG_PROGRAM=${PKG_CONFIG_PROGRAM:-/usr/bin/pkg-config} +MINGW_TOOL_PREFIX=${MINGW_TOOL_PREFIX:-/usr/bin/i586-mingw32msvc-} + export GTK_PREFIX=${GTK_PREFIX:-/usr/local/win/gtk} if [ "x$1" = "x--with-python=2.5" -o "x$2" = "x--with-python=2.5" ]; then - export PYTHON_PREFIX=${PYTHON_PREFIX:-/usr/local/win/Python25} + export PYTHON_PREFIX=${PYTHON_PREFIX:-/usr/local/win/Python25} + export PYTHON25_HOME=$PYTHON_PREFIX else - export PYTHON_PREFIX=${PYTHON_PREFIX:-/usr/local/win/Python24} + export PYTHON_PREFIX=${PYTHON_PREFIX:-/usr/local/win/Python24} + export PYTHON24_HOME=$PYTHON_PREFIX fi +export PYTHON_HOME=$PYTHON_PREFIX +export PYTHON24_HOME=${PYTHON24_HOME:-/usr/local/win/Python24} +export PYTHON25_HOME=${PYTHON25_HOME:-/usr/local/win/Python25} + if [ x$CONFIGURE = x ]; then CONFIGURE="configure" if [ ! -e $CONFIGURE ]; then @@ -51,31 +52,35 @@ if [ x$CONFIGURE = x ]; then CONFIG_GUESS="$configure_dir"/config.guess fi -export ADDR2LINE="$MINGW_TOOL_PREFIX-addr2line" -export AR="$MINGW_TOOL_PREFIX-ar" -export AS="$MINGW_TOOL_PREFIX-as" -export CC="$MINGW_TOOL_PREFIX-gcc" -export CPP="$MINGW_TOOL_PREFIX-cpp" -export CPPFILT="$MINGW_TOOL_PREFIX-c++filt" -export CXX="$MINGW_TOOL_PREFIX-g++" -export DLLTOOL="$MINGW_TOOL_PREFIX-dlltool" -export DLLWRAP="$MINGW_TOOL_PREFIX-dllwrap" -export GCOV="$MINGW_TOOL_PREFIX-gcov" -export LD="$MINGW_TOOL_PREFIX-ld" -export NM="$MINGW_TOOL_PREFIX-nm" -export OBJCOPY="$MINGW_TOOL_PREFIX-objcopy" -export OBJDUMP="$MINGW_TOOL_PREFIX-objdump" -export RANLIB="$MINGW_TOOL_PREFIX-ranlib" -export READELF="$MINGW_TOOL_PREFIX-readelf" -export SIZE="$MINGW_TOOL_PREFIX-size" -export STRINGS="$MINGW_TOOL_PREFIX-strings" -export STRIP="$MINGW_TOOL_PREFIX-strip" -export WINDRES="$MINGW_TOOL_PREFIX-windres" +# autoconf is not intelligent enough to guess that +# i586-pc-mingw32msvc target has anything to do with +# debian /usr/bin/i586-mingw32msvc-gcc or freebsd +# /usr/local/mingw32/bin/gcc, hence these variables +export ADDR2LINE="${MINGW_TOOL_PREFIX}addr2line" +export AS="${MINGW_TOOL_PREFIX}as" +export CC="${MINGW_TOOL_PREFIX}gcc" +export CPP="${MINGW_TOOL_PREFIX}cpp" +export CPPFILT="${MINGW_TOOL_PREFIX}c++filt" +export CXX="${MINGW_TOOL_PREFIX}g++" +export DLLTOOL="${MINGW_TOOL_PREFIX}dlltool" +export DLLWRAP="${MINGW_TOOL_PREFIX}dllwrap" +export GCOV="${MINGW_TOOL_PREFIX}gcov" +export LD="${MINGW_TOOL_PREFIX}ld" +export NM="${MINGW_TOOL_PREFIX}nm" +export OBJCOPY="${MINGW_TOOL_PREFIX}objcopy" +export OBJDUMP="${MINGW_TOOL_PREFIX}objdump" +export READELF="${MINGW_TOOL_PREFIX}readelf" +export SIZE="${MINGW_TOOL_PREFIX}size" +export STRINGS="${MINGW_TOOL_PREFIX}strings" +export WINDRES="${MINGW_TOOL_PREFIX}windres" +export AR="${MINGW_TOOL_PREFIX}ar" +export RANLIB="${MINGW_TOOL_PREFIX}ranlib" +export STRIP="${MINGW_TOOL_PREFIX}strip" -export LDFLAGS="-L$GTK_PREFIX/lib" +export LDFLAGS="-L$GTK_PREFIX/lib -mno-cygwin" export CPPFLAGS="-I$GTK_PREFIX/include" -export CFLAGS="${CFLAGS:-"-O2"} -I$GTK_PREFIX/include -mms-bitfields -march=i686" -export CXXFLAGS="${CFLAGS:-"-O2"} -I$GTK_PREFIX/include -mms-bitfields -march=i686" +export CFLAGS="${CFLAGS:-"-O2"} -I$GTK_PREFIX/include -mno-cygwin -mms-bitfields -march=i686" +export CXXFLAGS="${CFLAGS:-"-O2"} -I$GTK_PREFIX/include -mno-cygwin -mms-bitfields -march=i686" mkdir -p fake-bin write_pkg_config fake-bin/pkg-config @@ -84,5 +89,17 @@ export PATH=`pwd`/fake-bin:$MINGW_BIN:/usr/i586-mingw32msvc/bin:/usr/local/mingw TARGET=i586-pc-mingw32msvc -echo sh $CONFIGURE --build=`$CONFIG_GUESS` --host=$TARGET --target=$TARGET --enable-all-warnings $* -exec sh $CONFIGURE --build=`$CONFIG_GUESS` --host=$TARGET --target=$TARGET --enable-all-warnings $* +echo sh $CONFIGURE --build=`$CONFIG_GUESS` --host=$TARGET --target=$TARGET \ +--enable-all-warnings --enable-maintainer-mode \ +PKG_CONFIG="$PKG_CONFIG" GTK_PREFIX="$GTK_PREFIX" \ +PYTHON_PREFIX="$PYTHON_PREFIX" PYTHON_HOME="$PYTHON_HOME" \ +PYTHON24_HOME="$PYTHON24_HOME" PYTHON25_HOME="$PYTHON25_HOME" \ +AR="$AR" RANLIB="$RANLIB" STRIP="$STRIP" AS="$AS" DLLTOOL="$DLLTOOL" \ +OBJDUMP="$OBJDUMP" NM="$NM" $@ +exec sh $CONFIGURE --build=`$CONFIG_GUESS` --host=$TARGET --target=$TARGET \ +--enable-all-warnings --enable-maintainer-mode \ +PKG_CONFIG="$PKG_CONFIG" GTK_PREFIX="$GTK_PREFIX" \ +PYTHON_PREFIX="$PYTHON_PREFIX" PYTHON_HOME="$PYTHON_HOME" \ +PYTHON24_HOME="$PYTHON24_HOME" PYTHON25_HOME="$PYTHON25_HOME" \ +AR="$AR" RANLIB="$RANLIB" STRIP="$STRIP" AS="$AS" DLLTOOL="$DLLTOOL" \ +OBJDUMP="$OBJDUMP" NM="$NM" $@