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