From: Robert Schwebel Subject: [patch] fix python headers When cross compiling mod_python for a 32 bit system while being on a 64 bit build host, we get the following error: some_path/include/python2.4/pyport.h:612:2: error: #error "LONG_BIT definition appears wrong for platform (bad gcc/glibc config?)." The reason is that in a cross scenario we need a python build for the "--build" machine and one for the "--host" machine; currently the python headers have been taken from the "--build" path, which brings 64 bit headers into a 32 bit build. The patch below was taken from the OpenEmbedded repository and adapted to mod_python. Signed-off-by: Robert Schwebel --- autogen.sh | 5 configure.in | 8 - m4/python.m4 | 307 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/Makefile.in | 2 4 files changed, 317 insertions(+), 5 deletions(-) Index: mod_python-3.3.1/m4/python.m4 =================================================================== --- /dev/null +++ mod_python-3.3.1/m4/python.m4 @@ -0,0 +1,307 @@ +dnl +dnl Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 +dnl Free Software Foundation, Inc. +dnl +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl + +dnl +dnl AM_CHECK_PYMOD(MODNAME [,SYMBOL [,ACTION-IF-FOUND [,ACTION-IF-NOT-FOUND]]]) +dnl Check if a module containing a given symbol is visible to python. +dnl +dnl this one is commonly used with AM_PATH_PYTHONDIR ... +dnl + +AC_DEFUN([AM_CHECK_PYMOD],[ + + AC_REQUIRE([AM_PATH_PYTHON]) + py_mod_var=`echo $1['_']$2 | sed 'y%./+-%__p_%'` + + AC_MSG_CHECKING(for ifelse([$2],[],,[$2 in ])python module $1) + AC_CACHE_VAL(py_cv_mod_$py_mod_var, [ + ifelse([$2],[], [prog=" + import sys + try: + import $1 + except ImportError: + sys.exit(1) + except: + sys.exit(0) + sys.exit(0)"], [prog=" + import $1 + $1.$2"]) + if $PYTHON -c "$prog" 1>&AC_FD_CC 2>&AC_FD_CC + then + eval "py_cv_mod_$py_mod_var=yes" + else + eval "py_cv_mod_$py_mod_var=no" + fi + ]) + py_val=`eval "echo \`echo '$py_cv_mod_'$py_mod_var\`"` + if test "x$py_val" != xno; then + AC_MSG_RESULT(yes) + ifelse([$3], [],, [$3 + ])dnl + else + AC_MSG_RESULT(no) + ifelse([$4], [],, [$4 + ])dnl + fi + +]) + + +dnl +dnl Check the ability to create python extensions +dnl +dnl AM_CHECK_PYTHON_HEADERS([ACTION-IF-POSSIBLE], dnl [ACTION-IF-NOT-POSSIBLE]) +dnl +dnl This function does also define PYTHON_INCLUDES +dnl + +AC_DEFUN([AM_CHECK_PYTHON_HEADERS],[ + + AC_REQUIRE([AM_PATH_PYTHON]) + + AC_MSG_CHECKING(for headers required to compile python extensions) + + dnl deduce PYTHON_INCLUDES + AC_ARG_WITH(python-includes, + AS_HELP_STRING([--with-python-includes=DIR], [DIR path to Python includes]), + py_exec_prefix=$withval + ) + if test x$py_exec_prefix != x; then + PYTHON_INCLUDES="-I${py_exec_prefix}/include/python${PYTHON_VERSION}" + else + py_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.prefix)"` + py_exec_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.exec_prefix)"` + if test -x "$PYTHON-config"; then + PYTHON_INCLUDES=`$PYTHON-config --includes 2>/dev/null` + else + PYTHON_INCLUDES="-I${py_prefix}/include/python${PYTHON_VERSION}" + if test "$py_prefix" != "$py_exec_prefix"; then + PYTHON_INCLUDES="$PYTHON_INCLUDES -I${py_exec_prefix}/include/python${PYTHON_VERSION}" + fi + fi + fi + + AC_SUBST(PYTHON_INCLUDES) + + dnl check if the headers exist: + save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $PYTHON_INCLUDES" + + AC_TRY_CPP([#include ],dnl + [AC_MSG_RESULT(found) + $1],dnl + [AC_MSG_RESULT(not found) + $2]) + CPPFLAGS="$save_CPPFLAGS" +]) + + +dnl +dnl JD_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) +dnl +dnl Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION. +dnl Run ACTION-IF-FALSE otherwise. +dnl +dnl This test uses sys.hexversion instead of the string equivalent. +dnl This is similar to AM_PYTHON_CHECK_VERSION, but without python 1.5.x support +dnl and with python 3.0 support. +dnl + +AC_DEFUN([JD_PYTHON_CHECK_VERSION],[ + + prog="import sys + # split strings by '.' and convert to numeric. Append some zeros + # because we need at least 4 digits for the hex conversion. + # map returns an iterator in Python 3.0 and a list in 2.x + minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]] + minverhex = 0 + # xrange is not present in Python 3.0 and range returns an iterator + for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]] + sys.exit(sys.hexversion < minverhex)" + + AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4]) + +]) + + +dnl +dnl JD_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl +dnl Adds support for distributing Python modules and packages. To +dnl install modules, copy them to $(pythondir), using the python_PYTHON +dnl automake variable. To install a package with the same name as the +dnl automake package, install to $(pkgpythondir), or use the +dnl pkgpython_PYTHON automake variable. +dnl +dnl The variables $(pyexecdir) and $(pkgpyexecdir) are provided as +dnl locations to install python extension modules (shared libraries). +dnl Another macro is required to find the appropriate flags to compile +dnl extension modules. +dnl +dnl If your package is configured with a different prefix to python, +dnl users will have to add the install directory to the PYTHONPATH +dnl environment variable, or create a .pth file (see the python +dnl documentation for details). +dnl +dnl If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will +dnl cause an error if the version of python installed on the system +dnl doesn't meet the requirement. MINIMUM-VERSION should consist of +dnl numbers and dots only. +dnl + +AC_DEFUN([JD_PATH_PYTHON], + [ + dnl Find a Python interpreter. Python versions prior to 2.0 are not + dnl supported + m4_define_default([_AM_PYTHON_INTERPRETER_LIST], + [python python2 python3 python3.0 python2.5 python2.4 python2.3 python2.2 dnl +python2.1 python2.0]) + + m4_if([$1],[],[ + dnl No version check is needed. + # Find any Python interpreter. + if test -z "$PYTHON"; then + AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :) + fi + am_display_PYTHON=python + ], [ + dnl A version check is needed. + if test -n "$PYTHON"; then + # If the user set $PYTHON, use it and don't search something else. + AC_MSG_CHECKING([whether $PYTHON version >= $1]) + JD_PYTHON_CHECK_VERSION([$PYTHON], [$1], + [AC_MSG_RESULT(yes)], + [AC_MSG_ERROR(too old)]) + am_display_PYTHON=$PYTHON + else + # Otherwise, try each interpreter until we find one that satisfies + # VERSION. + AC_CACHE_CHECK([for a Python interpreter with version >= $1], + [am_cv_pathless_PYTHON],[ + for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do + test "$am_cv_pathless_PYTHON" = none && break + JD_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break]) + done]) + # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. + if test "$am_cv_pathless_PYTHON" = none; then + PYTHON=: + else + AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON]) + fi + am_display_PYTHON=$am_cv_pathless_PYTHON + fi + ]) + + if test "$PYTHON" = :; then + dnl Run any user-specified action, or abort. + m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])]) + else + + dnl Query Python for its version number. Getting [:3] seems to be + dnl the best way to do this; it's what "site.py" does in the standard + dnl library. + + AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version], + [am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[[:3]])"`]) + AC_SUBST([PYTHON_VERSION], [$am_cv_python_version]) + + dnl Use the values of $prefix and $exec_prefix for the corresponding + dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX. These are made + dnl distinct variables so they can be overridden if need be. However, + dnl general consensus is that you shouldn't need this ability. + + AC_SUBST([PYTHON_PREFIX], ['${prefix}']) + AC_SUBST([PYTHON_EXEC_PREFIX], ['${exec_prefix}']) + + dnl At times (like when building shared libraries) you may want + dnl to know which OS platform Python thinks this is. + + AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform], + [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`]) + AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform]) + + + dnl Set up 4 directories: + + dnl pythondir -- where to install python scripts. This is the + dnl site-packages directory, not the python standard library + dnl directory like in previous automake betas. This behavior + dnl is more consistent with lispdir.m4 for example. + dnl Query distutils for this directory. distutils does not exist in + dnl Python 1.5, so we fall back to the hardcoded directory if it + dnl doesn't work. + AC_CACHE_CHECK([for $am_display_PYTHON script directory], + [am_cv_python_pythondir], + [am_cv_python_pythondir=`$PYTHON -c "from distutils import sysconfig; print sysconfig.get_python_lib(0,0,prefix='$PYTHON_PREFIX')" 2>/dev/null || + echo "$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages"`]) + AC_SUBST([pythondir], [$am_cv_python_pythondir]) + + dnl pkgpythondir -- $PACKAGE directory under pythondir. Was + dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is + dnl more consistent with the rest of automake. + + AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE]) + + dnl pyexecdir -- directory for installing python extension modules + dnl (shared libraries) + dnl Query distutils for this directory. distutils does not exist in + dnl Python 1.5, so we fall back to the hardcoded directory if it + dnl doesn't work. + AC_CACHE_CHECK([for $am_display_PYTHON extension module directory], + [am_cv_python_pyexecdir], + [am_cv_python_pyexecdir=`$PYTHON -c "from distutils import sysconfig; print sysconfig.get_python_lib(1,0,prefix='$PYTHON_EXEC_PREFIX')" 2>/dev/null || + echo "${PYTHON_EXEC_PREFIX}/lib/python${PYTHON_VERSION}/site-packages"`]) + AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir]) + + dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE) + + AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE]) + + dnl Run any user-specified action. + $2 + fi + +]) + + +dnl +dnl JD_CHECK_PYTHON_HEADERS([ACTION-IF-POSSIBLE], [ACTION-IF-NOT-POSSIBLE]) +dnl +dnl A macro to check for ability to create python extensions. +dnl This function also defines PYTHON_INCLUDES +dnl + +AC_DEFUN([JD_CHECK_PYTHON_HEADERS],[ + + AC_REQUIRE([AM_PATH_PYTHON]) + AC_MSG_CHECKING(for headers required to compile python extensions) + + dnl deduce PYTHON_INCLUDES + py_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.prefix)"` + py_exec_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.exec_prefix)"` + + if test -x "$PYTHON-config"; then + PYTHON_INCLUDES=`$PYTHON-config --includes 2>/dev/null` + else + PYTHON_INCLUDES="-I${py_prefix}/include/python${PYTHON_VERSION}" + if test "$py_prefix" != "$py_exec_prefix"; then + PYTHON_INCLUDES="$PYTHON_INCLUDES -I${py_exec_prefix}/include/python${PYTHON_VERSION}" + fi + fi + + AC_SUBST(PYTHON_INCLUDES) + + dnl check if the headers exist: + save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $PYTHON_INCLUDES" + + AC_TRY_CPP([#include ],[AC_MSG_RESULT(found) $1],[AC_MSG_RESULT(not found) $2]) + CPPFLAGS="$save_CPPFLAGS" +]) + Index: mod_python-3.3.1/configure.in =================================================================== --- mod_python-3.3.1.orig/configure.in +++ mod_python-3.3.1/configure.in @@ -275,11 +275,11 @@ LDFLAGS="${LDFLAGS} ${PyLFS} ${PyLDFLAGS LDFLAGS="${LDFLAGS} ${PY_LDFLAGS}" AC_MSG_RESULT($PY_LDFLAGS) -AC_MSG_CHECKING(where Python include files are) +INCLUDES="${INCLUDES} ${AP_INCLUDES}" AC_SUBST(INCLUDES) -PY_INCLUDES="-I${PyEXEC_INSTALLDIR}/include/python${PyVERSION}" -INCLUDES="${INCLUDES} ${AP_INCLUDES} ${PY_INCLUDES}" -AC_MSG_RESULT($PY_INCLUDES) + +# determine PYTHON_PATH +AM_CHECK_PYTHON_HEADERS # this for the test.py script AC_SUBST(TEST_SERVER_ROOT) Index: mod_python-3.3.1/src/Makefile.in =================================================================== --- mod_python-3.3.1.orig/src/Makefile.in +++ mod_python-3.3.1/src/Makefile.in @@ -22,7 +22,7 @@ MKDEP=@MKDEP@ # requires flex 2.5.31 for reentrant support LEX=@LEX@ -INCLUDES=@INCLUDES@ +INCLUDES=@INCLUDES@ @PYTHON_INCLUDES@ LIBS=@LIBS@ LDFLAGS=@LDFLAGS@ OPT= Index: mod_python-3.3.1/autogen.sh =================================================================== --- /dev/null +++ mod_python-3.3.1/autogen.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +aclocal -I `pwd`/m4 +autoconf +