]>
Commit | Line | Data |
---|---|---|
45a596fb | 1 | #!/usr/bin/env python |
72e1a39e AT |
2 | |
3 | srcdir = '.' | |
4 | blddir = 'bin' | |
5 | ||
6 | APPNAME='samba' | |
7 | VERSION=None | |
8 | ||
921b927d | 9 | import sys, os, tempfile |
72e1a39e | 10 | sys.path.insert(0, srcdir+"/buildtools/wafsamba") |
5e082120 | 11 | import wafsamba, Options, samba_dist, samba_git, Scripting, Utils, samba_version |
72e1a39e AT |
12 | |
13 | ||
14 | samba_dist.DIST_DIRS('.') | |
7c2bf8d2 | 15 | samba_dist.DIST_BLACKLIST('.gitignore .bzrignore source4/selftest/provisions') |
72e1a39e | 16 | |
72e1a39e | 17 | # install in /usr/local/samba by default |
71a168eb | 18 | default_prefix = Options.default_prefix = '/usr/local/samba' |
72e1a39e | 19 | |
27503cea AB |
20 | # This callback optionally takes a list of paths as arguments: |
21 | # --with-system_mitkrb5 /path/to/krb5 /another/path | |
22 | def system_mitkrb5_callback(option, opt, value, parser): | |
23 | setattr(parser.values, option.dest, True) | |
24 | value = [] | |
25 | for arg in parser.rargs: | |
26 | # stop on --foo like options | |
27 | if arg[:2] == "--" and len(arg) > 2: | |
28 | break | |
29 | value.append(arg) | |
30 | if len(value)>0: | |
31 | del parser.rargs[:len(value)] | |
32 | setattr(parser.values, option.dest, value) | |
33 | ||
72e1a39e AT |
34 | def set_options(opt): |
35 | opt.BUILTIN_DEFAULT('NONE') | |
36 | opt.PRIVATE_EXTENSION_DEFAULT('samba4') | |
37 | opt.RECURSE('lib/replace') | |
35a9c23a | 38 | opt.RECURSE('dynconfig') |
8420a36d | 39 | opt.RECURSE('lib/ldb') |
47b7c6fc | 40 | opt.RECURSE('selftest') |
72e1a39e | 41 | opt.RECURSE('source4/lib/tls') |
81190f91 | 42 | opt.RECURSE('source4/dsdb/samdb/ldb_modules') |
72e1a39e | 43 | opt.RECURSE('pidl') |
f180e1ab | 44 | opt.RECURSE('source3') |
b9902793 | 45 | opt.RECURSE('lib/util') |
e94422a8 | 46 | opt.RECURSE('ctdb') |
72e1a39e | 47 | |
2ddf89a2 | 48 | opt.add_option('--with-system-mitkrb5', |
27503cea AB |
49 | help='enable system MIT krb5 build (includes Samba 4 client and Samba 3 code base).'+ |
50 | 'You may specify list of paths where Kerberos is installed (e.g. /usr/local /usr/kerberos) to search krb5-config', | |
51 | action='callback', callback=system_mitkrb5_callback, dest='with_system_mitkrb5', default=False) | |
2ddf89a2 AB |
52 | |
53 | opt.add_option('--without-ad-dc', | |
23aac203 AB |
54 | help='disable AD DC functionality (enables Samba 4 client and Samba 3 code base).', |
55 | action='store_true', dest='without_ad_dc', default=False) | |
2ddf89a2 | 56 | |
71dcc76b AB |
57 | opt.add_option('--with-ntvfs-fileserver', |
58 | help='enable the depricated NTVFS file server from the original Samba4 branch (default if --enable-selftest specicifed). Conflicts with --with-system-mitkrb5 and --without-ad-dc', | |
59 | action='store_true', dest='with_ntvfs_fileserver') | |
60 | ||
61 | opt.add_option('--without-ntvfs-fileserver', | |
62 | help='disable the depricated NTVFS file server from the original Samba4 branch', | |
63 | action='store_false', dest='with_ntvfs_fileserver') | |
64 | ||
d47c1245 | 65 | opt.add_option('--with-pie', |
b48ceef1 DD |
66 | help=("Build Position Independent Executables " + |
67 | "(default if supported by compiler)"), | |
68 | action="store_true", dest='enable_pie') | |
d47c1245 DD |
69 | opt.add_option('--without-pie', |
70 | help=("Disable Position Independent Executable builds"), | |
71 | action="store_false", dest='enable_pie') | |
72 | ||
191e6b94 AS |
73 | opt.add_option('--with-relro', |
74 | help=("Build with full RELocation Read-Only (RELRO)" + | |
75 | "(default if supported by compiler)"), | |
76 | action="store_true", dest='enable_relro') | |
77 | opt.add_option('--without-relro', | |
78 | help=("Disable RELRO builds"), | |
79 | action="store_false", dest='enable_relro') | |
80 | ||
aa8c8a7b | 81 | gr = opt.option_group('developer options') |
7b43053a | 82 | |
72e1a39e AT |
83 | opt.tool_options('python') # options for disabling pyc or pyo compilation |
84 | # enable options related to building python extensions | |
85 | ||
86 | ||
87 | def configure(conf): | |
88 | version = samba_version.load_version(env=conf.env) | |
89 | ||
90 | conf.DEFINE('CONFIG_H_IS_FROM_SAMBA', 1) | |
91 | conf.DEFINE('_SAMBA_BUILD_', version.MAJOR, add_to_cflags=True) | |
92 | conf.DEFINE('HAVE_CONFIG_H', 1, add_to_cflags=True) | |
93 | ||
94 | if Options.options.developer: | |
95 | conf.ADD_CFLAGS('-DDEVELOPER -DDEBUG_PASSWORD') | |
30e11d55 | 96 | conf.env.DEVELOPER = True |
72e1a39e | 97 | |
d526f861 | 98 | conf.ADD_EXTRA_INCLUDES('#include/public #source4 #lib #source4/lib #source4/include #include #lib/replace') |
72e1a39e | 99 | |
469e2fc3 | 100 | conf.env.replace_add_global_pthread = True |
72e1a39e AT |
101 | conf.RECURSE('lib/replace') |
102 | ||
7bf9e937 | 103 | conf.SAMBA_CHECK_PERL(mandatory=True) |
72e1a39e AT |
104 | conf.find_program('xsltproc', var='XSLTPROC') |
105 | ||
a549b45e | 106 | conf.SAMBA_CHECK_PYTHON(mandatory=True, version=(2, 6, 0)) |
72e1a39e AT |
107 | conf.SAMBA_CHECK_PYTHON_HEADERS(mandatory=True) |
108 | ||
109 | if sys.platform == 'darwin' and not conf.env['HAVE_ENVIRON_DECL']: | |
110 | # Mac OSX needs to have this and it's also needed that the python is compiled with this | |
111 | # otherwise you face errors about common symbols | |
112 | if not conf.CHECK_SHLIB_W_PYTHON("Checking if -fno-common is needed"): | |
113 | conf.ADD_CFLAGS('-fno-common') | |
114 | if not conf.CHECK_SHLIB_W_PYTHON("Checking if -undefined dynamic_lookup is not need"): | |
115 | conf.env.append_value('shlib_LINKFLAGS', ['-undefined', 'dynamic_lookup']) | |
2a789c84 AB |
116 | |
117 | if sys.platform == 'darwin': | |
118 | conf.ADD_LDFLAGS('-framework CoreFoundation') | |
119 | ||
72e1a39e AT |
120 | if int(conf.env['PYTHON_VERSION'][0]) >= 3: |
121 | raise Utils.WafError('Python version 3.x is not supported by Samba yet') | |
122 | ||
35a9c23a | 123 | conf.RECURSE('dynconfig') |
f46b79bd IC |
124 | |
125 | if conf.CHECK_FOR_THIRD_PARTY(): | |
e50342f3 | 126 | conf.RECURSE('third_party') |
f46b79bd | 127 | else: |
ba8ee8c9 IC |
128 | if not conf.CHECK_ZLIB(): |
129 | raise Utils.WafError('zlib development packages have not been found.\nIf third_party is installed, check that it is in the proper place.') | |
130 | else: | |
38de110b IC |
131 | conf.define('USING_SYSTEM_ZLIB',1) |
132 | ||
133 | if not conf.CHECK_POPT(): | |
134 | raise Utils.WafError('popt development packages have not been found.\nIf third_party is installed, check that it is in the proper place.') | |
135 | else: | |
136 | conf.define('USING_SYSTEM_POPT', 1) | |
ba8ee8c9 | 137 | |
8420a36d | 138 | conf.RECURSE('lib/ldb') |
2ddf89a2 | 139 | |
7feb650a AS |
140 | if not (Options.options.without_ad_dc): |
141 | conf.DEFINE('AD_DC_BUILD_IS_ENABLED', 1) | |
142 | ||
2ddf89a2 AB |
143 | if Options.options.with_system_mitkrb5: |
144 | conf.PROCESS_SEPARATE_RULE('system_mitkrb5') | |
23aac203 | 145 | if not (Options.options.without_ad_dc or Options.options.with_system_mitkrb5): |
2ddf89a2 | 146 | conf.DEFINE('AD_DC_BUILD_IS_ENABLED', 1) |
71dcc76b | 147 | |
4291fdcf AB |
148 | # Only process heimdal_build for non-MIT KRB5 builds |
149 | # When MIT KRB5 checks are done as above, conf.env.KRB5_VENDOR will be set | |
150 | # to the lowcased output of 'krb5-config --vendor'. | |
151 | # If it is not set or the output is 'heimdal', we are dealing with | |
152 | # system-provided or embedded Heimdal build | |
153 | if conf.CONFIG_GET('KRB5_VENDOR') in (None, 'heimdal'): | |
1fedb0ae | 154 | conf.RECURSE('source4/heimdal_build') |
72e1a39e | 155 | conf.RECURSE('source4/lib/tls') |
81190f91 | 156 | conf.RECURSE('source4/dsdb/samdb/ldb_modules') |
72e1a39e AT |
157 | conf.RECURSE('source4/ntvfs/sysdep') |
158 | conf.RECURSE('lib/util') | |
72e1a39e AT |
159 | conf.RECURSE('lib/util/charset') |
160 | conf.RECURSE('source4/auth') | |
72e1a39e | 161 | conf.RECURSE('nsswitch') |
72e1a39e | 162 | conf.RECURSE('libcli/smbreadline') |
8443e15e | 163 | conf.RECURSE('lib/crypto') |
72e1a39e | 164 | conf.RECURSE('pidl') |
47b7c6fc | 165 | conf.RECURSE('selftest') |
c0a463d9 AS |
166 | if conf.CONFIG_GET('ENABLE_SELFTEST'): |
167 | conf.RECURSE('lib/nss_wrapper') | |
168 | conf.RECURSE('lib/resolv_wrapper') | |
169 | conf.RECURSE('lib/socket_wrapper') | |
170 | conf.RECURSE('lib/uid_wrapper') | |
71dcc76b AB |
171 | if Options.options.with_ntvfs_fileserver != False: |
172 | if not (Options.options.without_ad_dc or Options.options.with_system_mitkrb5): | |
173 | conf.DEFINE('WITH_NTVFS_FILESERVER', 1) | |
174 | if Options.options.with_ntvfs_fileserver == False: | |
175 | if not (Options.options.without_ad_dc or Options.options.with_system_mitkrb5): | |
176 | raise Utils.WafError('--without-ntvfs-fileserver conflicts with --enable-selftest while building the AD DC') | |
177 | ||
178 | if Options.options.with_ntvfs_fileserver == True: | |
179 | if Options.options.without_ad_dc: | |
180 | raise Utils.WafError('--with-ntvfs-fileserver conflicts with --without-ad-dc') | |
181 | if Options.options.with_system_mitkrb5: | |
182 | raise Utils.WafError('--with-ntvfs-fileserver conflicts with --with-system-mitkrb5') | |
183 | conf.DEFINE('WITH_NTVFS_FILESERVER', 1) | |
14f99167 | 184 | conf.RECURSE('source3') |
3ba74c83 | 185 | conf.RECURSE('lib/texpect') |
69c0c43d | 186 | if conf.env.with_ctdb: |
e94422a8 | 187 | conf.RECURSE('ctdb') |
1862aa6c | 188 | conf.RECURSE('lib/socket') |
72e1a39e | 189 | |
86afe83d | 190 | conf.SAMBA_CHECK_UNDEFINED_SYMBOL_FLAGS() |
3a88d49d | 191 | |
72e1a39e AT |
192 | # gentoo always adds this. We want our normal build to be as |
193 | # strict as the strictest OS we support, so adding this here | |
194 | # allows us to find problems on our development hosts faster. | |
195 | # It also results in faster load time. | |
577034b3 | 196 | |
b0f41c07 | 197 | conf.env.asneeded_ldflags = conf.ADD_LDFLAGS('-Wl,--as-needed', testflags=True) |
72e1a39e AT |
198 | |
199 | if not conf.CHECK_NEED_LC("-lc not needed"): | |
200 | conf.ADD_LDFLAGS('-lc', testflags=False) | |
201 | ||
52113b3b AB |
202 | if not conf.CHECK_CODE('#include "tests/summary.c"', |
203 | define='SUMMARY_PASSES', | |
204 | addmain=False, | |
52113b3b AB |
205 | msg='Checking configure summary'): |
206 | raise Utils.WafError('configure summary failed') | |
72e1a39e | 207 | |
b48ceef1 DD |
208 | if Options.options.enable_pie != False: |
209 | if Options.options.enable_pie == True: | |
210 | need_pie = True | |
211 | else: | |
212 | # not specified, only build PIEs if supported by compiler | |
213 | need_pie = False | |
214 | if conf.check_cc(cflags='-fPIE', ldflags='-pie', mandatory=need_pie, | |
215 | msg="Checking compiler for PIE support"): | |
1ef2f39c | 216 | conf.env['ENABLE_PIE'] = True |
72e1a39e | 217 | |
191e6b94 AS |
218 | if Options.options.enable_relro != False: |
219 | if Options.options.enable_relro == True: | |
220 | need_relro = True | |
221 | else: | |
222 | # not specified, only build RELROs if supported by compiler | |
223 | need_relro = False | |
224 | if conf.check_cc(cflags='', ldflags='-Wl,-z,relro,-z,now', mandatory=need_relro, | |
225 | msg="Checking compiler for full RELRO support"): | |
226 | conf.env['ENABLE_RELRO'] = True | |
227 | ||
aa8c8a7b AB |
228 | conf.SAMBA_CONFIG_H('include/config.h') |
229 | ||
72e1a39e AT |
230 | def etags(ctx): |
231 | '''build TAGS file using etags''' | |
232 | import Utils | |
233 | source_root = os.path.dirname(Utils.g_module.root_path) | |
e43b745f | 234 | cmd = 'rm -f %s/TAGS && (find %s -name "*.[ch]" | egrep -v \.inst\. | xargs -n 100 etags -a)' % (source_root, source_root) |
72e1a39e | 235 | print("Running: %s" % cmd) |
a0ab8cb5 BB |
236 | status = os.system(cmd) |
237 | if os.WEXITSTATUS(status): | |
238 | raise Utils.WafError('etags failed') | |
72e1a39e AT |
239 | |
240 | def ctags(ctx): | |
241 | "build 'tags' file using ctags" | |
242 | import Utils | |
243 | source_root = os.path.dirname(Utils.g_module.root_path) | |
d5dcb9ee | 244 | cmd = 'ctags --python-kinds=-i $(find %s -name "*.[ch]" | grep -v "*_proto\.h" | egrep -v \.inst\.) $(find %s -name "*.py")' % (source_root, source_root) |
72e1a39e | 245 | print("Running: %s" % cmd) |
a0ab8cb5 BB |
246 | status = os.system(cmd) |
247 | if os.WEXITSTATUS(status): | |
248 | raise Utils.WafError('ctags failed') | |
72e1a39e | 249 | |
5e082120 | 250 | |
72e1a39e AT |
251 | # putting this here enabled build in the list |
252 | # of commands in --help | |
253 | def build(bld): | |
254 | '''build all targets''' | |
d2bc45e7 | 255 | samba_version.load_version(env=bld.env, is_install=bld.is_install) |
72e1a39e AT |
256 | |
257 | ||
258 | def pydoctor(ctx): | |
259 | '''build python apidocs''' | |
af087626 JV |
260 | bp = os.path.abspath('bin/python') |
261 | mpaths = {} | |
9dfc5216 | 262 | modules = ['talloc', 'tdb', 'ldb'] |
8bf60364 | 263 | for m in modules: |
af087626 JV |
264 | f = os.popen("PYTHONPATH=%s python -c 'import %s; print %s.__file__'" % (bp, m, m), 'r') |
265 | try: | |
266 | mpaths[m] = f.read().strip() | |
267 | finally: | |
268 | f.close() | |
8bf60364 JV |
269 | mpaths['main'] = bp |
270 | cmd = ('PYTHONPATH=%(main)s pydoctor --introspect-c-modules --project-name=Samba ' | |
271 | '--project-url=http://www.samba.org --make-html --docformat=restructuredtext ' | |
272 | '--add-package bin/python/samba ' + ''.join('--add-module %s ' % n for n in modules)) | |
273 | cmd = cmd % mpaths | |
72e1a39e | 274 | print("Running: %s" % cmd) |
a0ab8cb5 BB |
275 | status = os.system(cmd) |
276 | if os.WEXITSTATUS(status): | |
277 | raise Utils.WafError('pydoctor failed') | |
72e1a39e | 278 | |
0e9b0925 JV |
279 | |
280 | def pep8(ctx): | |
281 | '''run pep8 validator''' | |
282 | cmd='PYTHONPATH=bin/python pep8 -r bin/python/samba' | |
283 | print("Running: %s" % cmd) | |
a0ab8cb5 BB |
284 | status = os.system(cmd) |
285 | if os.WEXITSTATUS(status): | |
286 | raise Utils.WafError('pep8 failed') | |
0e9b0925 JV |
287 | |
288 | ||
72e1a39e AT |
289 | def wafdocs(ctx): |
290 | '''build wafsamba apidocs''' | |
291 | from samba_utils import recursive_dirlist | |
292 | os.system('pwd') | |
293 | list = recursive_dirlist('../buildtools/wafsamba', '.', pattern='*.py') | |
294 | ||
295 | cmd='PYTHONPATH=bin/python pydoctor --project-name=wafsamba --project-url=http://www.samba.org --make-html --docformat=restructuredtext' | |
296 | print(list) | |
297 | for f in list: | |
298 | cmd += ' --add-module %s' % f | |
299 | print("Running: %s" % cmd) | |
a0ab8cb5 BB |
300 | status = os.system(cmd) |
301 | if os.WEXITSTATUS(status): | |
302 | raise Utils.WafError('wafdocs failed') | |
72e1a39e AT |
303 | |
304 | ||
305 | def dist(): | |
306 | '''makes a tarball for distribution''' | |
f48f65e6 BB |
307 | sambaversion = samba_version.load_version(env=None) |
308 | ||
0f7aae85 AI |
309 | os.system("make -C ctdb/doc") |
310 | samba_dist.DIST_FILES('ctdb/doc:ctdb/doc', extend=True) | |
311 | ||
6895875b MA |
312 | os.system(srcdir + "/release-scripts/build-manpages-nogit") |
313 | samba_dist.DIST_FILES('bin/docs:docs', extend=True) | |
314 | ||
f48f65e6 BB |
315 | if sambaversion.IS_SNAPSHOT: |
316 | # write .distversion file and add to tar | |
3b3d7bb6 AB |
317 | if not os.path.isdir(blddir): |
318 | os.makedirs(blddir) | |
921b927d | 319 | distversionf = tempfile.NamedTemporaryFile(mode='w', prefix='.distversion',dir=blddir) |
f48f65e6 BB |
320 | for field in sambaversion.vcs_fields: |
321 | distveroption = field + '=' + str(sambaversion.vcs_fields[field]) | |
322 | distversionf.write(distveroption + '\n') | |
921b927d | 323 | distversionf.flush() |
3821defe | 324 | samba_dist.DIST_FILES('%s:.distversion' % distversionf.name, extend=True) |
921b927d AB |
325 | |
326 | samba_dist.dist() | |
f48f65e6 | 327 | distversionf.close() |
921b927d AB |
328 | else: |
329 | samba_dist.dist() | |
f48f65e6 | 330 | |
72e1a39e AT |
331 | |
332 | def distcheck(): | |
333 | '''test that distribution tarball builds and installs''' | |
334 | samba_version.load_version(env=None) | |
335 | import Scripting | |
336 | d = Scripting.distcheck | |
ec3d1f09 | 337 | d() |
72e1a39e AT |
338 | |
339 | def wildcard_cmd(cmd): | |
340 | '''called on a unknown command''' | |
341 | from samba_wildcard import run_named_build_task | |
342 | run_named_build_task(cmd) | |
343 | ||
344 | def main(): | |
345 | from samba_wildcard import wildcard_main | |
5e082120 | 346 | |
72e1a39e AT |
347 | wildcard_main(wildcard_cmd) |
348 | Scripting.main = main | |
349 | ||
350 | def reconfigure(ctx): | |
351 | '''reconfigure if config scripts have changed''' | |
352 | import samba_utils | |
353 | samba_utils.reconfigure(ctx) | |
5e082120 JV |
354 | |
355 | ||
356 | if os.path.isdir(os.path.join(srcdir, ".git")): | |
357 | # Check if there are submodules that are checked out but out of date. | |
358 | for submodule, status in samba_git.read_submodule_status(srcdir): | |
359 | if status == "out-of-date": | |
360 | raise Utils.WafError("some submodules are out of date. Please run 'git submodule update'") |