1# =========================================================================== 2# https://www.gnu.org/software/autoconf-archive/ax_python_devel.html 3# =========================================================================== 4# 5# SYNOPSIS 6# 7# AX_PYTHON_DEVEL([version], [action-if-not-found]) 8# 9# DESCRIPTION 10# 11# Note: Defines as a precious variable "PYTHON_VERSION". Don't override it 12# in your configure.ac. 13# 14# Note: this is a slightly modified version of the original AX_PYTHON_DEVEL 15# macro which accepts an additional [action-if-not-found] argument. This 16# allow to detect if Python development is available without aborting the 17# configure phase with an hard error in case it is not. 18# 19# This macro checks for Python and tries to get the include path to 20# 'Python.h'. It provides the $(PYTHON_CPPFLAGS) and $(PYTHON_LIBS) output 21# variables. It also exports $(PYTHON_EXTRA_LIBS) and 22# $(PYTHON_EXTRA_LDFLAGS) for embedding Python in your code. 23# 24# You can search for some particular version of Python by passing a 25# parameter to this macro, for example ">= '2.3.1'", or "== '2.4'". Please 26# note that you *have* to pass also an operator along with the version to 27# match, and pay special attention to the single quotes surrounding the 28# version number. Don't use "PYTHON_VERSION" for this: that environment 29# variable is declared as precious and thus reserved for the end-user. 30# 31# This macro should work for all versions of Python >= 2.1.0. As an end 32# user, you can disable the check for the python version by setting the 33# PYTHON_NOVERSIONCHECK environment variable to something else than the 34# empty string. 35# 36# If you need to use this macro for an older Python version, please 37# contact the authors. We're always open for feedback. 38# 39# LICENSE 40# 41# Copyright (c) 2009 Sebastian Huber <sebastian-huber@web.de> 42# Copyright (c) 2009 Alan W. Irwin 43# Copyright (c) 2009 Rafael Laboissiere <rafael@laboissiere.net> 44# Copyright (c) 2009 Andrew Collier 45# Copyright (c) 2009 Matteo Settenvini <matteo@member.fsf.org> 46# Copyright (c) 2009 Horst Knorr <hk_classes@knoda.org> 47# Copyright (c) 2013 Daniel Mullner <muellner@math.stanford.edu> 48# Copyright (c) 2018 loli10K <ezomori.nozomu@gmail.com> 49# 50# This program is free software: you can redistribute it and/or modify it 51# under the terms of the GNU General Public License as published by the 52# Free Software Foundation, either version 3 of the License, or (at your 53# option) any later version. 54# 55# This program is distributed in the hope that it will be useful, but 56# WITHOUT ANY WARRANTY; without even the implied warranty of 57# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 58# Public License for more details. 59# 60# You should have received a copy of the GNU General Public License along 61# with this program. If not, see <https://www.gnu.org/licenses/>. 62# 63# As a special exception, the respective Autoconf Macro's copyright owner 64# gives unlimited permission to copy, distribute and modify the configure 65# scripts that are the output of Autoconf when processing the Macro. You 66# need not follow the terms of the GNU General Public License when using 67# or distributing such scripts, even though portions of the text of the 68# Macro appear in them. The GNU General Public License (GPL) does govern 69# all other use of the material that constitutes the Autoconf Macro. 70# 71# This special exception to the GPL applies to versions of the Autoconf 72# Macro released by the Autoconf Archive. When you make and distribute a 73# modified version of the Autoconf Macro, you may extend this special 74# exception to the GPL to apply to your modified version as well. 75 76#serial 21 77 78AU_ALIAS([AC_PYTHON_DEVEL], [AX_PYTHON_DEVEL]) 79AC_DEFUN([AX_PYTHON_DEVEL],[ 80 # 81 # Allow the use of a (user set) custom python version 82 # 83 AC_ARG_VAR([PYTHON_VERSION],[The installed Python 84 version to use, for example '2.3'. This string 85 will be appended to the Python interpreter 86 canonical name.]) 87 88 AC_PATH_PROG([PYTHON],[python[$PYTHON_VERSION]]) 89 if test -z "$PYTHON"; then 90 m4_ifvaln([$2],[$2],[ 91 AC_MSG_ERROR([Cannot find python$PYTHON_VERSION in your system path]) 92 PYTHON_VERSION="" 93 ]) 94 fi 95 96 # 97 # Check for a version of Python >= 2.1.0 98 # 99 AC_MSG_CHECKING([for a version of Python >= '2.1.0']) 100 ac_supports_python_ver=`cat<<EOD | $PYTHON - 101from __future__ import print_function; 102import sys; 103try: 104 from packaging import version; 105except ImportError: 106 from distlib import version; 107ver = sys.version.split ()[[0]]; 108(tst_cmp, tst_ver) = ">= '2.1.0'".split (); 109tst_ver = tst_ver.strip ("'"); 110eval ("print (version.LegacyVersion (ver)"+ tst_cmp +"version.LegacyVersion (tst_ver))") 111EOD` 112 if test "$ac_supports_python_ver" != "True"; then 113 if test -z "$PYTHON_NOVERSIONCHECK"; then 114 AC_MSG_RESULT([no]) 115 m4_ifvaln([$2],[$2],[ 116 AC_MSG_FAILURE([ 117This version of the AC@&t@_PYTHON_DEVEL macro 118doesn't work properly with versions of Python before 1192.1.0. You may need to re-run configure, setting the 120variables PYTHON_CPPFLAGS, PYTHON_LIBS, PYTHON_SITE_PKG, 121PYTHON_EXTRA_LIBS and PYTHON_EXTRA_LDFLAGS by hand. 122Moreover, to disable this check, set PYTHON_NOVERSIONCHECK 123to something else than an empty string. 124]) 125 ]) 126 else 127 AC_MSG_RESULT([skip at user request]) 128 fi 129 else 130 AC_MSG_RESULT([yes]) 131 fi 132 133 # 134 # if the macro parameter ``version'' is set, honour it 135 # 136 if test -n "$1"; then 137 AC_MSG_CHECKING([for a version of Python $1]) 138 # Why the strip ()? Because if we don't, version.parse 139 # will, for example, report 3.10.0 >= '3.11.0' 140 ac_supports_python_ver=`cat<<EOD | $PYTHON - 141 142from __future__ import print_function; 143import sys; 144try: 145 from packaging import version; 146except ImportError: 147 from distlib import version; 148ver = sys.version.split ()[[0]]; 149(tst_cmp, tst_ver) = "$1".split (); 150tst_ver = tst_ver.strip ("'"); 151eval ("print (version.LegacyVersion (ver)"+ tst_cmp +"version.LegacyVersion (tst_ver))") 152EOD` 153 if test "$ac_supports_python_ver" = "True"; then 154 AC_MSG_RESULT([yes]) 155 else 156 AC_MSG_RESULT([no]) 157 m4_ifvaln([$2],[$2],[ 158 AC_MSG_ERROR([this package requires Python $1. 159If you have it installed, but it isn't the default Python 160interpreter in your system path, please pass the PYTHON_VERSION 161variable to configure. See ``configure --help'' for reference. 162]) 163 PYTHON_VERSION="" 164 ]) 165 fi 166 fi 167 168 # 169 # Check for Python include path 170 # 171 # 172 AC_MSG_CHECKING([for Python include path]) 173 if test -z "$PYTHON_CPPFLAGS"; then 174 python_path=`$PYTHON -c "import sysconfig; \ 175 print (sysconfig.get_path('include'));"` 176 plat_python_path=`$PYTHON -c "import sysconfig; \ 177 print (sysconfig.get_path('platinclude'));"` 178 if test -n "${python_path}"; then 179 if test "${plat_python_path}" != "${python_path}"; then 180 python_path="-I$python_path -I$plat_python_path" 181 else 182 python_path="-I$python_path" 183 fi 184 fi 185 PYTHON_CPPFLAGS=$python_path 186 fi 187 AC_MSG_RESULT([$PYTHON_CPPFLAGS]) 188 AC_SUBST([PYTHON_CPPFLAGS]) 189 190 # 191 # Check for Python library path 192 # 193 AC_MSG_CHECKING([for Python library path]) 194 if test -z "$PYTHON_LIBS"; then 195 # (makes two attempts to ensure we've got a version number 196 # from the interpreter) 197 ac_python_version=`cat<<EOD | $PYTHON - 198 199# join all versioning strings, on some systems 200# major/minor numbers could be in different list elements 201from sysconfig import * 202e = get_config_var('VERSION') 203if e is not None: 204 print(e) 205EOD` 206 207 if test -z "$ac_python_version"; then 208 if test -n "$PYTHON_VERSION"; then 209 ac_python_version=$PYTHON_VERSION 210 else 211 ac_python_version=`$PYTHON -c "import sys; \ 212 print ('.'.join(sys.version.split('.')[[:2]]))"` 213 fi 214 fi 215 216 # Make the versioning information available to the compiler 217 AC_DEFINE_UNQUOTED([HAVE_PYTHON], ["$ac_python_version"], 218 [If available, contains the Python version number currently in use.]) 219 220 # First, the library directory: 221 ac_python_libdir=`cat<<EOD | $PYTHON - 222 223# There should be only one 224import sysconfig 225e = sysconfig.get_config_var('LIBDIR') 226if e is not None: 227 print (e) 228EOD` 229 230 # Now, for the library: 231 ac_python_library=`cat<<EOD | $PYTHON - 232 233import sysconfig 234c = sysconfig.get_config_vars() 235if 'LDVERSION' in c: 236 print ('python'+c[['LDVERSION']]) 237else: 238 print ('python'+c[['VERSION']]) 239EOD` 240 241 # This small piece shamelessly adapted from PostgreSQL python macro; 242 # credits goes to momjian, I think. I'd like to put the right name 243 # in the credits, if someone can point me in the right direction... ? 244 # 245 if test -n "$ac_python_libdir" -a -n "$ac_python_library" 246 then 247 # use the official shared library 248 ac_python_library=`echo "$ac_python_library" | sed "s/^lib//"` 249 PYTHON_LIBS="-L$ac_python_libdir -l$ac_python_library" 250 else 251 # old way: use libpython from python_configdir 252 ac_python_libdir=`$PYTHON -c \ 253 "import sysconfig; \ 254 import os; \ 255 print (os.path.join(sysconfig.get_path('platstdlib'), 'config'));"` 256 PYTHON_LIBS="-L$ac_python_libdir -lpython$ac_python_version" 257 fi 258 259 if test -z "PYTHON_LIBS"; then 260 m4_ifvaln([$2],[$2],[ 261 AC_MSG_ERROR([ 262 Cannot determine location of your Python DSO. Please check it was installed with 263 dynamic libraries enabled, or try setting PYTHON_LIBS by hand. 264 ]) 265 ]) 266 fi 267 fi 268 AC_MSG_RESULT([$PYTHON_LIBS]) 269 AC_SUBST([PYTHON_LIBS]) 270 271 # 272 # Check for site packages 273 # 274 AC_MSG_CHECKING([for Python site-packages path]) 275 if test -z "$PYTHON_SITE_PKG"; then 276 PYTHON_SITE_PKG=`$PYTHON -c "import distutils.sysconfig; \ 277 print (distutils.sysconfig.get_python_lib(0,0));" 2>/dev/null || \ 278 $PYTHON -c "import sysconfig; \ 279 print (sysconfig.get_path('purelib'));"` 280 fi 281 AC_MSG_RESULT([$PYTHON_SITE_PKG]) 282 AC_SUBST([PYTHON_SITE_PKG]) 283 284 # 285 # libraries which must be linked in when embedding 286 # 287 AC_MSG_CHECKING(python extra libraries) 288 if test -z "$PYTHON_EXTRA_LIBS"; then 289 PYTHON_EXTRA_LIBS=`$PYTHON -c "import sysconfig; \ 290 conf = sysconfig.get_config_var; \ 291 print (conf('LIBS') + ' ' + conf('SYSLIBS'))"` 292 fi 293 AC_MSG_RESULT([$PYTHON_EXTRA_LIBS]) 294 AC_SUBST(PYTHON_EXTRA_LIBS) 295 296 # 297 # linking flags needed when embedding 298 # 299 AC_MSG_CHECKING(python extra linking flags) 300 if test -z "$PYTHON_EXTRA_LDFLAGS"; then 301 PYTHON_EXTRA_LDFLAGS=`$PYTHON -c "import sysconfig; \ 302 conf = sysconfig.get_config_var; \ 303 print (conf('LINKFORSHARED'))"` 304 fi 305 AC_MSG_RESULT([$PYTHON_EXTRA_LDFLAGS]) 306 AC_SUBST(PYTHON_EXTRA_LDFLAGS) 307 308 # 309 # final check to see if everything compiles alright 310 # 311 AC_MSG_CHECKING([consistency of all components of python development environment]) 312 # save current global flags 313 ac_save_LIBS="$LIBS" 314 ac_save_LDFLAGS="$LDFLAGS" 315 ac_save_CPPFLAGS="$CPPFLAGS" 316 LIBS="$ac_save_LIBS $PYTHON_LIBS $PYTHON_EXTRA_LIBS $PYTHON_EXTRA_LIBS" 317 LDFLAGS="$ac_save_LDFLAGS $PYTHON_EXTRA_LDFLAGS" 318 CPPFLAGS="$ac_save_CPPFLAGS $PYTHON_CPPFLAGS" 319 AC_LANG_PUSH([C]) 320 AC_LINK_IFELSE([ 321 AC_LANG_PROGRAM([[#include <Python.h>]], 322 [[Py_Initialize();]]) 323 ],[pythonexists=yes],[pythonexists=no]) 324 AC_LANG_POP([C]) 325 # turn back to default flags 326 CPPFLAGS="$ac_save_CPPFLAGS" 327 LIBS="$ac_save_LIBS" 328 LDFLAGS="$ac_save_LDFLAGS" 329 330 AC_MSG_RESULT([$pythonexists]) 331 332 if test ! "x$pythonexists" = "xyes"; then 333 m4_ifvaln([$2],[$2],[ 334 AC_MSG_FAILURE([ 335 Could not link test program to Python. Maybe the main Python library has been 336 installed in some non-standard library path. If so, pass it to configure, 337 via the LIBS environment variable. 338 Example: ./configure LIBS="-L/usr/non-standard-path/python/lib" 339 ============================================================================ 340 ERROR! 341 You probably have to install the development version of the Python package 342 for your distribution. The exact name of this package varies among them. 343 ============================================================================ 344 ]) 345 PYTHON_VERSION="" 346 ]) 347 fi 348 349 # 350 # all done! 351 # 352]) 353