1 # waf build tool for building IDL files with pidl
4 from waflib
import Build
, Logs
, Utils
, Configure
, Errors
5 from waflib
.Configure
import conf
8 def SAMBA_CHECK_PYTHON(conf
, version
=(3,5,0)):
10 if conf
.env
.disable_python
:
13 # enable tool to build python extensions
14 if conf
.env
.HAVE_PYTHON_H
:
15 conf
.check_python_version(version
)
20 conf
.find_program('python3', var
='PYTHON',
21 mandatory
=not conf
.env
.disable_python
)
23 path_python
= conf
.find_program('python3')
25 conf
.env
.PYTHON_SPECIFIED
= (conf
.env
.PYTHON
!= path_python
)
26 conf
.check_python_version(version
)
28 interpreters
.append(conf
.env
['PYTHON'])
29 conf
.env
.python_interpreters
= interpreters
33 def SAMBA_CHECK_PYTHON_HEADERS(conf
):
34 if conf
.env
.disable_python
:
36 conf
.msg("python headers", "Check disabled due to --disable-python")
37 # we don't want PYTHONDIR in config.h, as otherwise changing
38 # --prefix causes a complete rebuild
39 conf
.env
.DEFINES
= [x
for x
in conf
.env
.DEFINES
40 if not x
.startswith('PYTHONDIR=')
41 and not x
.startswith('PYTHONARCHDIR=')]
45 if conf
.env
["python_headers_checked"] == []:
46 _check_python_headers(conf
)
47 conf
.env
["python_headers_checked"] = "yes"
50 conf
.msg("python headers", "using cache")
52 # we don't want PYTHONDIR in config.h, as otherwise changing
53 # --prefix causes a complete rebuild
54 conf
.env
.DEFINES
= [x
for x
in conf
.env
.DEFINES
55 if not x
.startswith('PYTHONDIR=')
56 and not x
.startswith('PYTHONARCHDIR=')]
58 def _check_python_headers(conf
):
59 conf
.check_python_headers()
61 if conf
.env
['PYTHON_VERSION'] > '3':
62 abi_pattern
= os
.path
.splitext(conf
.env
['pyext_PATTERN'])[0]
63 conf
.env
['PYTHON_SO_ABI_FLAG'] = abi_pattern
% ''
65 conf
.env
['PYTHON_SO_ABI_FLAG'] = ''
66 conf
.env
['PYTHON_LIBNAME_SO_ABI_FLAG'] = (
67 conf
.env
['PYTHON_SO_ABI_FLAG'].replace('_', '-'))
69 for lib
in conf
.env
['LINKFLAGS_PYEMBED']:
70 if lib
.startswith('-L'):
71 conf
.env
.append_unique('LIBPATH_PYEMBED', lib
[2:]) # strip '-L'
72 conf
.env
['LINKFLAGS_PYEMBED'].remove(lib
)
74 # same as in waf 1.5, keep only '-fno-strict-aliasing'
75 # and ignore defines such as NDEBUG _FORTIFY_SOURCE=2
76 conf
.env
.DEFINES_PYEXT
= []
77 conf
.env
.CFLAGS_PYEXT
= ['-fno-strict-aliasing']
81 def PYTHON_BUILD_IS_ENABLED(self
):
82 return self
.CONFIG_SET('HAVE_PYTHON_H')
84 Build
.BuildContext
.PYTHON_BUILD_IS_ENABLED
= PYTHON_BUILD_IS_ENABLED
87 def SAMBA_PYTHON(bld
, name
,
95 init_function_sentinel
=None,
100 '''build a python extension for Samba'''
102 # force-disable when we can't build python modules, so
103 # every single call doesn't need to pass this in.
104 if not bld
.PYTHON_BUILD_IS_ENABLED():
107 # Save time, no need to build python bindings when fuzzing
108 if bld
.env
.enable_fuzzing
:
111 # when we support static python modules we'll need to gather
112 # the list from all the SAMBA_PYTHON() targets
113 if init_function_sentinel
is not None:
114 cflags
+= ' -DSTATIC_LIBPYTHON_MODULES=%s' % init_function_sentinel
116 # From https://docs.python.org/2/c-api/arg.html:
117 # Starting with Python 2.5 the type of the length argument to
118 # PyArg_ParseTuple(), PyArg_ParseTupleAndKeywords() and PyArg_Parse()
119 # can be controlled by defining the macro PY_SSIZE_T_CLEAN before
120 # including Python.h. If the macro is defined, length is a Py_ssize_t
121 # rather than an int.
123 # Because <Python.h> if often included before includes.h/config.h
124 # This must be in the -D compiler options
125 cflags
+= ' -DPY_SSIZE_T_CLEAN=1'
127 source
= bld
.EXPAND_VARIABLES(source
, vars=vars)
129 if realname
is not None:
130 link_name
= 'python/%s' % realname
134 bld
.SAMBA_LIBRARY(name
,
137 public_deps
=public_deps
,
140 cflags_end
=cflags_end
,
141 local_include
=local_include
,
146 target_type
='PYTHON',
147 install_path
='${PYTHONARCHDIR}',
148 allow_undefined_symbols
=True,
152 Build
.BuildContext
.SAMBA_PYTHON
= SAMBA_PYTHON
155 def pyembed_libname(bld
, name
):
156 if bld
.env
['PYTHON_SO_ABI_FLAG']:
157 return name
+ bld
.env
['PYTHON_SO_ABI_FLAG']
161 Build
.BuildContext
.pyembed_libname
= pyembed_libname