[988] | 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'")
|
---|