xref: /freebsd/contrib/unbound/acx_python.m4 (revision 5685098846d7f11ad642d9804d94dc7429a7b212)
1b7579f77SDag-Erling SmørgravAC_DEFUN([AC_PYTHON_DEVEL],[
2b7579f77SDag-Erling Smørgrav        #
3b7579f77SDag-Erling Smørgrav        # Allow the use of a (user set) custom python version
4b7579f77SDag-Erling Smørgrav        #
5b7579f77SDag-Erling Smørgrav        AC_ARG_VAR([PYTHON_VERSION],[The installed Python
6b7579f77SDag-Erling Smørgrav                version to use, for example '2.3'. This string
7b7579f77SDag-Erling Smørgrav                will be appended to the Python interpreter
8b7579f77SDag-Erling Smørgrav                canonical name.])
9b7579f77SDag-Erling Smørgrav
10b7579f77SDag-Erling Smørgrav        AC_PATH_PROG([PYTHON],[python[$PYTHON_VERSION]])
11b7579f77SDag-Erling Smørgrav        if test -z "$PYTHON"; then
12*56850988SCy Schubert           AC_MSG_ERROR([Cannot find 'python$PYTHON_VERSION' in your system path. You can use the environment variable 'PYTHON_VERSION=version_number' for an explicit version.])
13b7579f77SDag-Erling Smørgrav           PYTHON_VERSION=""
14b7579f77SDag-Erling Smørgrav        fi
15b7579f77SDag-Erling Smørgrav
16b7579f77SDag-Erling Smørgrav        if test -z "$PYTHON_VERSION"; then
17ff825849SDag-Erling Smørgrav		PYTHON_VERSION=`$PYTHON -c "import sys; \
18ff825849SDag-Erling Smørgrav			print(sys.version.split()[[0]])"`
19b7579f77SDag-Erling Smørgrav	fi
208f76bb7dSCy Schubert	# calculate the version number components.
218f76bb7dSCy Schubert	[
228f76bb7dSCy Schubert	v="$PYTHON_VERSION"
238f76bb7dSCy Schubert	PYTHON_VERSION_MAJOR=`echo $v | sed 's/[^0-9].*//'`
248f76bb7dSCy Schubert	if test -z "$PYTHON_VERSION_MAJOR"; then PYTHON_VERSION_MAJOR="0"; fi
258f76bb7dSCy Schubert	v=`echo $v | sed -e 's/^[0-9]*$//' -e 's/[0-9]*[^0-9]//'`
268f76bb7dSCy Schubert	PYTHON_VERSION_MINOR=`echo $v | sed 's/[^0-9].*//'`
278f76bb7dSCy Schubert	if test -z "$PYTHON_VERSION_MINOR"; then PYTHON_VERSION_MINOR="0"; fi
288f76bb7dSCy Schubert	v=`echo $v | sed -e 's/^[0-9]*$//' -e 's/[0-9]*[^0-9]//'`
298f76bb7dSCy Schubert	PYTHON_VERSION_PATCH=`echo $v | sed 's/[^0-9].*//'`
308f76bb7dSCy Schubert	if test -z "$PYTHON_VERSION_PATCH"; then PYTHON_VERSION_PATCH="0"; fi
318f76bb7dSCy Schubert	]
32b7579f77SDag-Erling Smørgrav
338f76bb7dSCy Schubert	# For some systems, sysconfig exists, but has the wrong paths,
348f76bb7dSCy Schubert	# on Debian 10, for python 2.7 and 3.7. So, we check the version,
358f76bb7dSCy Schubert	# and for older versions try distutils.sysconfig first. For newer
368f76bb7dSCy Schubert	# versions>=3.10, where distutils.sysconfig is deprecated, use
378f76bb7dSCy Schubert	# sysconfig first and then attempt the other one.
388f76bb7dSCy Schubert	py_distutils_first="no"
398f76bb7dSCy Schubert	if test $PYTHON_VERSION_MAJOR -lt 3; then
408f76bb7dSCy Schubert		py_distutils_first="yes"
418f76bb7dSCy Schubert	fi
428f76bb7dSCy Schubert	if test $PYTHON_VERSION_MAJOR -eq 3 -a $PYTHON_VERSION_MINOR -lt 10; then
438f76bb7dSCy Schubert		py_distutils_first="yes"
448f76bb7dSCy Schubert	fi
458f76bb7dSCy Schubert
468f76bb7dSCy Schubert	# Check if you have the first module
478f76bb7dSCy Schubert	if test "$py_distutils_first" = "yes"; then m="distutils"; else m="sysconfig"; fi
488f76bb7dSCy Schubert	sysconfig_module=""
498f76bb7dSCy Schubert	AC_MSG_CHECKING([for the $m Python module])
508f76bb7dSCy Schubert        if ac_modulecheck_result1=`$PYTHON -c "import $m" 2>&1`; then
51a39a5a69SCy Schubert                AC_MSG_RESULT([yes])
528f76bb7dSCy Schubert		sysconfig_module="$m"
53a39a5a69SCy Schubert	else
54a39a5a69SCy Schubert                AC_MSG_RESULT([no])
558f76bb7dSCy Schubert	fi
56a39a5a69SCy Schubert
578f76bb7dSCy Schubert	# if not found, try the other one.
588f76bb7dSCy Schubert	if test -z "$sysconfig_module"; then
598f76bb7dSCy Schubert		if test "$py_distutils_first" = "yes"; then m2="sysconfig"; else m2="distutils"; fi
608f76bb7dSCy Schubert		AC_MSG_CHECKING([for the $m2 Python module])
618f76bb7dSCy Schubert		if ac_modulecheck_result2=`$PYTHON -c "import $m2" 2>&1`; then
62b7579f77SDag-Erling Smørgrav			AC_MSG_RESULT([yes])
638f76bb7dSCy Schubert			sysconfig_module="$m2"
64b7579f77SDag-Erling Smørgrav		else
65b7579f77SDag-Erling Smørgrav			AC_MSG_RESULT([no])
668f76bb7dSCy Schubert			AC_MSG_ERROR([cannot import Python module "$m", or "$m2".
678f76bb7dSCy Schubert	Please check your Python installation. The errors are:
688f76bb7dSCy Schubert	$m
698f76bb7dSCy Schubert	$ac_modulecheck_result1
708f76bb7dSCy Schubert	$m2
718f76bb7dSCy Schubert	$ac_modulecheck_result2])
72b7579f77SDag-Erling Smørgrav			PYTHON_VERSION=""
73b7579f77SDag-Erling Smørgrav		fi
74a39a5a69SCy Schubert	fi
758f76bb7dSCy Schubert	if test "$sysconfig_module" = "distutils"; then sysconfig_module="distutils.sysconfig"; fi
76a39a5a69SCy Schubert
77b7579f77SDag-Erling Smørgrav        #
78b7579f77SDag-Erling Smørgrav        # Check for Python include path
79b7579f77SDag-Erling Smørgrav        #
80b7579f77SDag-Erling Smørgrav        AC_MSG_CHECKING([for Python include path])
81b7579f77SDag-Erling Smørgrav        if test -z "$PYTHON_CPPFLAGS"; then
82a39a5a69SCy Schubert		if test "$sysconfig_module" = "sysconfig"; then
83a39a5a69SCy Schubert			python_path=`$PYTHON -c 'import sysconfig; \
84a39a5a69SCy Schubert				print(sysconfig.get_path("include"));'`
85a39a5a69SCy Schubert		else
86b7579f77SDag-Erling Smørgrav			python_path=`$PYTHON -c "import distutils.sysconfig; \
87ff825849SDag-Erling Smørgrav				print(distutils.sysconfig.get_python_inc());"`
88a39a5a69SCy Schubert		fi
89b7579f77SDag-Erling Smørgrav                if test -n "${python_path}"; then
90b7579f77SDag-Erling Smørgrav                        python_path="-I$python_path"
91b7579f77SDag-Erling Smørgrav                fi
92b7579f77SDag-Erling Smørgrav                PYTHON_CPPFLAGS=$python_path
93b7579f77SDag-Erling Smørgrav        fi
94b7579f77SDag-Erling Smørgrav        AC_MSG_RESULT([$PYTHON_CPPFLAGS])
95b7579f77SDag-Erling Smørgrav        AC_SUBST([PYTHON_CPPFLAGS])
96b7579f77SDag-Erling Smørgrav
97b7579f77SDag-Erling Smørgrav        #
98b7579f77SDag-Erling Smørgrav        # Check for Python library path
99b7579f77SDag-Erling Smørgrav        #
100b7579f77SDag-Erling Smørgrav        AC_MSG_CHECKING([for Python library path])
101b7579f77SDag-Erling Smørgrav        if test -z "$PYTHON_LDFLAGS"; then
102a39a5a69SCy Schubert                PYTHON_LDFLAGS=`$PYTHON -c "from $sysconfig_module import *; \
103b5663de9SDag-Erling Smørgrav                        print('-L'+get_config_var('LIBDIR')+' -L'+get_config_var('LIBDEST')+' '+get_config_var('BLDLIBRARY'));"`
104b7579f77SDag-Erling Smørgrav        fi
105b7579f77SDag-Erling Smørgrav        AC_MSG_RESULT([$PYTHON_LDFLAGS])
106b7579f77SDag-Erling Smørgrav        AC_SUBST([PYTHON_LDFLAGS])
107b7579f77SDag-Erling Smørgrav
10825039b37SCy Schubert        if test -z "$PYTHON_LIBDIR"; then
109a39a5a69SCy Schubert                PYTHON_LIBDIR=`$PYTHON -c "from $sysconfig_module import *; \
11025039b37SCy Schubert                        print(get_config_var('LIBDIR'));"`
11125039b37SCy Schubert        fi
11225039b37SCy Schubert
113b7579f77SDag-Erling Smørgrav        #
114b7579f77SDag-Erling Smørgrav        # Check for site packages
115b7579f77SDag-Erling Smørgrav        #
116b7579f77SDag-Erling Smørgrav        AC_MSG_CHECKING([for Python site-packages path])
117b7579f77SDag-Erling Smørgrav        if test -z "$PYTHON_SITE_PKG"; then
118a39a5a69SCy Schubert		if test "$sysconfig_module" = "sysconfig"; then
119a39a5a69SCy Schubert			PYTHON_SITE_PKG=`$PYTHON -c 'import sysconfig; \
120a39a5a69SCy Schubert				print(sysconfig.get_path("platlib"));'`
121a39a5a69SCy Schubert		else
122b7579f77SDag-Erling Smørgrav			PYTHON_SITE_PKG=`$PYTHON -c "import distutils.sysconfig; \
123ff825849SDag-Erling Smørgrav				print(distutils.sysconfig.get_python_lib(1,0));"`
124b7579f77SDag-Erling Smørgrav		fi
125a39a5a69SCy Schubert        fi
126b7579f77SDag-Erling Smørgrav        AC_MSG_RESULT([$PYTHON_SITE_PKG])
127b7579f77SDag-Erling Smørgrav        AC_SUBST([PYTHON_SITE_PKG])
128b7579f77SDag-Erling Smørgrav
129b7579f77SDag-Erling Smørgrav        #
130b7579f77SDag-Erling Smørgrav        # final check to see if everything compiles alright
131b7579f77SDag-Erling Smørgrav        #
132b7579f77SDag-Erling Smørgrav        AC_MSG_CHECKING([consistency of all components of python development environment])
133b7579f77SDag-Erling Smørgrav        AC_LANG_PUSH([C])
134b7579f77SDag-Erling Smørgrav        # save current global flags
1358ed2b524SDag-Erling Smørgrav        ac_save_LIBS="$LIBS"
1368ed2b524SDag-Erling Smørgrav        ac_save_CPPFLAGS="$CPPFLAGS"
1378ed2b524SDag-Erling Smørgrav
1388ed2b524SDag-Erling Smørgrav        LIBS="$LIBS $PYTHON_LDFLAGS"
1398ed2b524SDag-Erling Smørgrav        CPPFLAGS="$CPPFLAGS $PYTHON_CPPFLAGS"
140f44e67d1SCy Schubert        AC_LINK_IFELSE([AC_LANG_PROGRAM([[
141b7579f77SDag-Erling Smørgrav                #include <Python.h>
142f44e67d1SCy Schubert        ]],[[
143b7579f77SDag-Erling Smørgrav                Py_Initialize();
144f44e67d1SCy Schubert        ]])],[pythonexists=yes],[pythonexists=no])
145b7579f77SDag-Erling Smørgrav
146b7579f77SDag-Erling Smørgrav        AC_MSG_RESULT([$pythonexists])
147b7579f77SDag-Erling Smørgrav
148b7579f77SDag-Erling Smørgrav        if test ! "$pythonexists" = "yes"; then
149b7579f77SDag-Erling Smørgrav           AC_MSG_ERROR([
150b7579f77SDag-Erling Smørgrav  Could not link test program to Python. Maybe the main Python library has been
151b7579f77SDag-Erling Smørgrav  installed in some non-standard library path. If so, pass it to configure,
152b7579f77SDag-Erling Smørgrav  via the LDFLAGS environment variable.
153b7579f77SDag-Erling Smørgrav  Example: ./configure LDFLAGS="-L/usr/non-standard-path/python/lib"
154b7579f77SDag-Erling Smørgrav  ============================================================================
155b7579f77SDag-Erling Smørgrav   ERROR!
156b7579f77SDag-Erling Smørgrav   You probably have to install the development version of the Python package
157b7579f77SDag-Erling Smørgrav   for your distribution.  The exact name of this package varies among them.
158b7579f77SDag-Erling Smørgrav  ============================================================================
159b7579f77SDag-Erling Smørgrav           ])
160b7579f77SDag-Erling Smørgrav          PYTHON_VERSION=""
161b7579f77SDag-Erling Smørgrav        fi
162b7579f77SDag-Erling Smørgrav        AC_LANG_POP
163b7579f77SDag-Erling Smørgrav        # turn back to default flags
164b7579f77SDag-Erling Smørgrav        CPPFLAGS="$ac_save_CPPFLAGS"
165b7579f77SDag-Erling Smørgrav        LIBS="$ac_save_LIBS"
166b7579f77SDag-Erling Smørgrav
167b7579f77SDag-Erling Smørgrav        #
168b7579f77SDag-Erling Smørgrav        # all done!
169b7579f77SDag-Erling Smørgrav        #
170b7579f77SDag-Erling Smørgrav])
171b7579f77SDag-Erling Smørgrav
172