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=`$PYTHON -c "import sys; \ 101 ver = sys.version.split ()[[0]]; \ 102 print (ver >= '2.1.0')"` 103 if test "$ac_supports_python_ver" != "True"; then 104 if test -z "$PYTHON_NOVERSIONCHECK"; then 105 AC_MSG_RESULT([no]) 106 AC_MSG_FAILURE([ 107This version of the AC@&t@_PYTHON_DEVEL macro 108doesn't work properly with versions of Python before 1092.1.0. You may need to re-run configure, setting the 110variables PYTHON_CPPFLAGS, PYTHON_LIBS, PYTHON_SITE_PKG, 111PYTHON_EXTRA_LIBS and PYTHON_EXTRA_LDFLAGS by hand. 112Moreover, to disable this check, set PYTHON_NOVERSIONCHECK 113to something else than an empty string. 114]) 115 else 116 AC_MSG_RESULT([skip at user request]) 117 fi 118 else 119 AC_MSG_RESULT([yes]) 120 fi 121 122 # 123 # If the macro parameter ``version'' is set, honour it. 124 # A Python shim class, VPy, is used to implement correct version comparisons via 125 # string expressions, since e.g. a naive textual ">= 2.7.3" won't work for 126 # Python 2.7.10 (the ".1" being evaluated as less than ".3"). 127 # 128 if test -n "$1"; then 129 AC_MSG_CHECKING([for a version of Python $1]) 130 cat << EOF > ax_python_devel_vpy.py 131class VPy: 132 def vtup(self, s): 133 return tuple(map(int, s.strip().replace("rc", ".").split("."))) 134 def __init__(self): 135 import sys 136 self.vpy = tuple(sys.version_info) 137 def __eq__(self, s): 138 return self.vpy == self.vtup(s) 139 def __ne__(self, s): 140 return self.vpy != self.vtup(s) 141 def __lt__(self, s): 142 return self.vpy < self.vtup(s) 143 def __gt__(self, s): 144 return self.vpy > self.vtup(s) 145 def __le__(self, s): 146 return self.vpy <= self.vtup(s) 147 def __ge__(self, s): 148 return self.vpy >= self.vtup(s) 149EOF 150 ac_supports_python_ver=`$PYTHON -c "import ax_python_devel_vpy; \ 151 ver = ax_python_devel_vpy.VPy(); \ 152 print (ver $1)"` 153 rm -rf ax_python_devel_vpy*.py* __pycache__/ax_python_devel_vpy*.py* 154 if test "$ac_supports_python_ver" = "True"; then 155 AC_MSG_RESULT([yes]) 156 else 157 AC_MSG_RESULT([no]) 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 fi 165 fi 166 167 # 168 # Check for Python include path 169 # 170 # 171 AC_MSG_CHECKING([for Python include path]) 172 if test -z "$PYTHON_CPPFLAGS"; then 173 python_path=`$PYTHON -c "import sysconfig; \ 174 print (sysconfig.get_path('include'));"` 175 plat_python_path=`$PYTHON -c "import sysconfig; \ 176 print (sysconfig.get_path('platinclude'));"` 177 if test -n "${python_path}"; then 178 if test "${plat_python_path}" != "${python_path}"; then 179 python_path="-I$python_path -I$plat_python_path" 180 else 181 python_path="-I$python_path" 182 fi 183 fi 184 PYTHON_CPPFLAGS=$python_path 185 fi 186 AC_MSG_RESULT([$PYTHON_CPPFLAGS]) 187 AC_SUBST([PYTHON_CPPFLAGS]) 188 189 # 190 # Check for Python library path 191 # 192 AC_MSG_CHECKING([for Python library path]) 193 if test -z "$PYTHON_LIBS"; then 194 # (makes two attempts to ensure we've got a version number 195 # from the interpreter) 196 ac_python_version=`cat<<EOD | $PYTHON - 197 198# join all versioning strings, on some systems 199# major/minor numbers could be in different list elements 200from sysconfig import * 201e = get_config_var('VERSION') 202if e is not None: 203 print(e) 204EOD` 205 206 if test -z "$ac_python_version"; then 207 if test -n "$PYTHON_VERSION"; then 208 ac_python_version=$PYTHON_VERSION 209 else 210 ac_python_version=`$PYTHON -c "import sys; \ 211 print ('.'.join(sys.version.split('.')[[:2]]))"` 212 fi 213 fi 214 215 # Make the versioning information available to the compiler 216 AC_DEFINE_UNQUOTED([HAVE_PYTHON], ["$ac_python_version"], 217 [If available, contains the Python version number currently in use.]) 218 219 # First, the library directory: 220 ac_python_libdir=`cat<<EOD | $PYTHON - 221 222# There should be only one 223import sysconfig 224e = sysconfig.get_config_var('LIBDIR') 225if e is not None: 226 print (e) 227EOD` 228 229 # Now, for the library: 230 ac_python_library=`cat<<EOD | $PYTHON - 231 232import sysconfig 233c = sysconfig.get_config_vars() 234if 'LDVERSION' in c: 235 print ('python'+c[['LDVERSION']]) 236else: 237 print ('python'+c[['VERSION']]) 238EOD` 239 240 # This small piece shamelessly adapted from PostgreSQL python macro; 241 # credits goes to momjian, I think. I'd like to put the right name 242 # in the credits, if someone can point me in the right direction... ? 243 # 244 if test -n "$ac_python_libdir" -a -n "$ac_python_library" 245 then 246 # use the official shared library 247 ac_python_library=`echo "$ac_python_library" | sed "s/^lib//"` 248 PYTHON_LIBS="-L$ac_python_libdir -l$ac_python_library" 249 else 250 # old way: use libpython from python_configdir 251 ac_python_libdir=`$PYTHON -c \ 252 "import sysconfig; \ 253 import os; \ 254 print (os.path.join(sysconfig.get_path('platstdlib'), 'config'));"` 255 PYTHON_LIBS="-L$ac_python_libdir -lpython$ac_python_version" 256 fi 257 258 if test -z "PYTHON_LIBS"; then 259 m4_ifvaln([$2],[$2],[ 260 AC_MSG_ERROR([ 261 Cannot determine location of your Python DSO. Please check it was installed with 262 dynamic libraries enabled, or try setting PYTHON_LIBS by hand. 263 ]) 264 ]) 265 fi 266 fi 267 AC_MSG_RESULT([$PYTHON_LIBS]) 268 AC_SUBST([PYTHON_LIBS]) 269 270 # 271 # Check for site packages 272 # 273 AC_MSG_CHECKING([for Python site-packages path]) 274 if test -z "$PYTHON_SITE_PKG"; then 275 PYTHON_SITE_PKG=`$PYTHON -c "import distutils.sysconfig; \ 276 print (distutils.sysconfig.get_python_lib(0,0));" 2>/dev/null || \ 277 $PYTHON -c "import sysconfig; \ 278 print (sysconfig.get_path('purelib'));"` 279 fi 280 AC_MSG_RESULT([$PYTHON_SITE_PKG]) 281 AC_SUBST([PYTHON_SITE_PKG]) 282 283 # 284 # libraries which must be linked in when embedding 285 # 286 AC_MSG_CHECKING(python extra libraries) 287 if test -z "$PYTHON_EXTRA_LIBS"; then 288 PYTHON_EXTRA_LIBS=`$PYTHON -c "import sysconfig; \ 289 conf = sysconfig.get_config_var; \ 290 print (conf('LIBS') + ' ' + conf('SYSLIBS'))"` 291 fi 292 AC_MSG_RESULT([$PYTHON_EXTRA_LIBS]) 293 AC_SUBST(PYTHON_EXTRA_LIBS) 294 295 # 296 # linking flags needed when embedding 297 # 298 AC_MSG_CHECKING(python extra linking flags) 299 if test -z "$PYTHON_EXTRA_LDFLAGS"; then 300 PYTHON_EXTRA_LDFLAGS=`$PYTHON -c "import sysconfig; \ 301 conf = sysconfig.get_config_var; \ 302 print (conf('LINKFORSHARED'))"` 303 fi 304 AC_MSG_RESULT([$PYTHON_EXTRA_LDFLAGS]) 305 AC_SUBST(PYTHON_EXTRA_LDFLAGS) 306 307 # 308 # final check to see if everything compiles alright 309 # 310 AC_MSG_CHECKING([consistency of all components of python development environment]) 311 # save current global flags 312 ac_save_LIBS="$LIBS" 313 ac_save_LDFLAGS="$LDFLAGS" 314 ac_save_CPPFLAGS="$CPPFLAGS" 315 LIBS="$ac_save_LIBS $PYTHON_LIBS $PYTHON_EXTRA_LIBS $PYTHON_EXTRA_LIBS" 316 LDFLAGS="$ac_save_LDFLAGS $PYTHON_EXTRA_LDFLAGS" 317 CPPFLAGS="$ac_save_CPPFLAGS $PYTHON_CPPFLAGS" 318 AC_LANG_PUSH([C]) 319 AC_LINK_IFELSE([ 320 AC_LANG_PROGRAM([[#include <Python.h>]], 321 [[Py_Initialize();]]) 322 ],[pythonexists=yes],[pythonexists=no]) 323 AC_LANG_POP([C]) 324 # turn back to default flags 325 CPPFLAGS="$ac_save_CPPFLAGS" 326 LIBS="$ac_save_LIBS" 327 LDFLAGS="$ac_save_LDFLAGS" 328 329 AC_MSG_RESULT([$pythonexists]) 330 331 if test ! "x$pythonexists" = "xyes"; then 332 m4_ifvaln([$2],[$2],[ 333 AC_MSG_FAILURE([ 334 Could not link test program to Python. Maybe the main Python library has been 335 installed in some non-standard library path. If so, pass it to configure, 336 via the LIBS environment variable. 337 Example: ./configure LIBS="-L/usr/non-standard-path/python/lib" 338 ============================================================================ 339 ERROR! 340 You probably have to install the development version of the Python package 341 for your distribution. The exact name of this package varies among them. 342 ============================================================================ 343 ]) 344 PYTHON_VERSION="" 345 ]) 346 fi 347 348 # 349 # all done! 350 # 351]) 352