diff options
author | Andrew Tridgell <tridge@samba.org> | 2010-02-26 22:21:50 +1100 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 2010-04-06 20:26:38 +1000 |
commit | 5ad6369cd0b132935cc874c942ffffa0c4405101 (patch) | |
tree | 0e7f53926bcaa6a00f6ad53b86949d0ed18c059b /buildtools | |
parent | ec6049c93d0c1bc7f5dff1c7d87c58eca2114ab9 (diff) | |
download | samba-5ad6369cd0b132935cc874c942ffffa0c4405101.tar.gz samba-5ad6369cd0b132935cc874c942ffffa0c4405101.tar.bz2 samba-5ad6369cd0b132935cc874c942ffffa0c4405101.zip |
build: started to split up wafsamba.py into separate modules
Diffstat (limited to 'buildtools')
-rw-r--r-- | buildtools/wafsamba/samba_autoconf.py | 137 | ||||
-rw-r--r-- | buildtools/wafsamba/samba_utils.py | 133 | ||||
-rw-r--r-- | buildtools/wafsamba/wafsamba.py | 242 |
3 files changed, 274 insertions, 238 deletions
diff --git a/buildtools/wafsamba/samba_autoconf.py b/buildtools/wafsamba/samba_autoconf.py new file mode 100644 index 0000000000..e6f5985e15 --- /dev/null +++ b/buildtools/wafsamba/samba_autoconf.py @@ -0,0 +1,137 @@ +# a waf tool to add autoconf-like macros to the configure section + +import Build, os, Logs, sys, Configure, Options +import string, Task, Utils, optparse +from Configure import conf +from Logs import debug +from TaskGen import extension +from samba_utils import * + +#################################################### +# some autoconf like helpers, to make the transition +# to waf a bit easier for those used to autoconf +# m4 files +@runonce +@conf +def DEFINE(conf, d, v): + conf.define(d, v, quote=False) + conf.env.append_value('CCDEFINES', d + '=' + str(v)) + +@runonce +def CHECK_HEADER(conf, h): + if conf.check(header_name=h): + conf.env.hlist.append(h) + +@conf +def CHECK_HEADERS(conf, list): + for hdr in list.split(): + CHECK_HEADER(conf, hdr) + +@conf +def CHECK_TYPES(conf, list): + for t in list.split(): + conf.check(type_name=t, header_name=conf.env.hlist) + +@conf +def CHECK_TYPE_IN(conf, t, hdr): + if conf.check(header_name=hdr): + conf.check(type_name=t, header_name=hdr) + +@conf +def CHECK_TYPE(conf, t, alternate): + if not conf.check(type_name=t, header_name=conf.env.hlist): + conf.DEFINE(t, alternate) + +@conf +def CHECK_VARIABLE(conf, v): + hdrs='' + for h in conf.env.hlist: + hdrs += '#include <%s>\n' % h + if conf.check(fragment= + '%s\nint main(void) {void *_x; _x=(void *)&%s; return 0;}\n' % (hdrs, v), + execute=0, + msg="Checking for variable %s" % v): + conf.DEFINE('HAVE_%s' % v.upper(), 1) + +@runonce +def CHECK_FUNC(conf, f): + conf.check(function_name=f, header_name=conf.env.hlist) + + +@conf +def CHECK_FUNCS(conf, list): + for f in list.split(): + CHECK_FUNC(conf, f) + + +################################################# +# return True if a configuration option was found +@conf +def CONFIG_SET(conf, option): + return (option in conf.env) and (conf.env[option] != ()) +Build.BuildContext.CONFIG_SET = CONFIG_SET + + +########################################################### +# check that the functions in 'list' are available in 'library' +# if they are, then make that library available as a dependency +# +# if the library is not available and mandatory==True, then +# raise an error. +# +# If the library is not available and mandatory==False, then +# add the library to the list of dependencies to remove from +# build rules +@conf +def CHECK_FUNCS_IN(conf, list, library, mandatory=False): + if not conf.check(lib=library, uselib_store=library): + conf.ASSERT(not mandatory, + "Mandatory library '%s' not found for functions '%s'" % (library, list)) + # if it isn't a mandatory library, then remove it from dependency lists + LOCAL_CACHE_SET(conf, 'EMPTY_TARGETS', library.upper(), True) + return + for f in list.split(): + conf.check(function_name=f, lib=library, header_name=conf.env.hlist) + conf.env['LIB_' + library.upper()] = library + LOCAL_CACHE_SET(conf, 'TARGET_TYPE', library, 'SYSLIB') + + +################################################# +# write out config.h in the right directory +@conf +def SAMBA_CONFIG_H(conf, path=None): + if os.path.normpath(conf.curdir) != os.path.normpath(os.environ.get('PWD')): + return + if path is None: + conf.write_config_header('config.h', top=True) + else: + conf.write_config_header(path) + + +############################################################## +# setup a configurable path +@conf +def CONFIG_PATH(conf, name, default): + if not name in conf.env: + conf.env[name] = conf.env['PREFIX'] + default + conf.define(name, conf.env[name], quote=True) + +############################################################## +# add some CFLAGS to the command line +@conf +def ADD_CFLAGS(conf, flags): + if not 'EXTRA_CFLAGS' in conf.env: + conf.env['EXTRA_CFLAGS'] = [] + conf.env['EXTRA_CFLAGS'].extend(flags.split()) + + +############################################################## +# work out the current flags. local flags are added first +def CURRENT_CFLAGS(bld, cflags): + if not 'EXTRA_CFLAGS' in bld.env: + list = [] + else: + list = bld.env['EXTRA_CFLAGS']; + ret = cflags.split() + ret.extend(list) + return ret diff --git a/buildtools/wafsamba/samba_utils.py b/buildtools/wafsamba/samba_utils.py new file mode 100644 index 0000000000..412fbe38a7 --- /dev/null +++ b/buildtools/wafsamba/samba_utils.py @@ -0,0 +1,133 @@ +# a waf tool to add autoconf-like macros to the configure section +# and for SAMBA_ macros for building libraries, binaries etc + +import Build, os, Logs, sys, Configure, Options, string, Task, Utils, optparse +from Configure import conf +from Logs import debug +from TaskGen import extension + +LIB_PATH="shared" + +###################################################### +# this is used as a decorator to make functions only +# run once. Based on the idea from +# http://stackoverflow.com/questions/815110/is-there-a-decorator-to-simply-cache-function-return-values +runonce_ret = {} +def runonce(function): + def wrapper(*args): + if args in runonce_ret: + return runonce_ret[args] + else: + ret = function(*args) + runonce_ret[args] = ret + return ret + return wrapper + + + +################################################################ +# magic rpath handling +# +# we want a different rpath when installing and when building +# Note that this should really check if rpath is available on this platform +# and it should also honor an --enable-rpath option +def set_rpath(bld): + if Options.is_install: + if bld.env['RPATH_ON_INSTALL']: + bld.env['RPATH'] = ['-Wl,-rpath=%s/lib' % bld.env.PREFIX] + else: + bld.env['RPATH'] = [] + else: + rpath = os.path.normpath('%s/%s' % (bld.env['BUILD_DIRECTORY'], LIB_PATH)) + bld.env.append_value('RPATH', '-Wl,-rpath=%s' % rpath) +Build.BuildContext.set_rpath = set_rpath + + +############################################################# +# return a named build cache dictionary, used to store +# state inside the following functions +@conf +def LOCAL_CACHE(ctx, name): + if name in ctx.env: + return ctx.env[name] + ctx.env[name] = {} + return ctx.env[name] + + +############################################################# +# set a value in a local cache +@conf +def LOCAL_CACHE_SET(ctx, cachename, key, value): + cache = LOCAL_CACHE(ctx, cachename) + cache[key] = value + +############################################################# +# a build assert call +@conf +def ASSERT(ctx, expression, msg): + if not expression: + sys.stderr.write("ERROR: %s\n" % msg) + raise AssertionError +Build.BuildContext.ASSERT = ASSERT + +################################################################ +# create a list of files by pre-pending each with a subdir name +def SUBDIR(bld, subdir, list): + ret = '' + for l in list.split(): + ret = ret + subdir + '/' + l + ' ' + return ret +Build.BuildContext.SUBDIR = SUBDIR + +############################################## +# remove .. elements from a path list +def NORMPATH(bld, ilist): + return " ".join([os.path.normpath(p) for p in ilist.split(" ")]) +Build.BuildContext.NORMPATH = NORMPATH + +####################################################### +# d1 += d2 +def dict_concat(d1, d2): + for t in d2: + if t not in d1: + d1[t] = d2[t] + +############################################################ +# this overrides the 'waf -v' debug output to be in a nice +# unix like format instead of a python list. +# Thanks to ita on #waf for this +def exec_command(self, cmd, **kw): + import Utils, Logs + _cmd = cmd + if isinstance(cmd, list): + _cmd = ' '.join(cmd) + debug('runner: %s' % _cmd) + if self.log: + self.log.write('%s\n' % cmd) + kw['log'] = self.log + try: + if not kw.get('cwd', None): + kw['cwd'] = self.cwd + except AttributeError: + self.cwd = kw['cwd'] = self.bldnode.abspath() + return Utils.exec_command(cmd, **kw) +Build.BuildContext.exec_command = exec_command + + +########################################################## +# add a new top level command to waf +def ADD_COMMAND(opt, name, function): + Utils.g_module.__dict__[name] = function + opt.name = function +Options.Handler.ADD_COMMAND = ADD_COMMAND + + +#import TaskGen, Task +# +#old_post_run = Task.Task.post_run +#def new_post_run(self): +# self.cached = True +# return old_post_run(self) +# +#for y in ['cc', 'cxx']: +# TaskGen.classes[y].post_run = new_post_run diff --git a/buildtools/wafsamba/wafsamba.py b/buildtools/wafsamba/wafsamba.py index 54c1235ef3..5d5d4e5de3 100644 --- a/buildtools/wafsamba/wafsamba.py +++ b/buildtools/wafsamba/wafsamba.py @@ -6,189 +6,12 @@ from Configure import conf from Logs import debug from TaskGen import extension -LIB_PATH="shared" - -###################################################### -# this is used as a decorator to make functions only -# run once. Based on the idea from -# http://stackoverflow.com/questions/815110/is-there-a-decorator-to-simply-cache-function-return-values -runonce_ret = {} -def runonce(function): - def wrapper(*args): - if args in runonce_ret: - return runonce_ret[args] - else: - ret = function(*args) - runonce_ret[args] = ret - return ret - return wrapper - - -#################################################### -# some autoconf like helpers, to make the transition -# to waf a bit easier for those used to autoconf -# m4 files -@runonce -@conf -def DEFINE(conf, d, v): - conf.define(d, v, quote=False) - conf.env.append_value('CCDEFINES', d + '=' + str(v)) - -@runonce -def CHECK_HEADER(conf, h): - if conf.check(header_name=h): - conf.env.hlist.append(h) - -@conf -def CHECK_HEADERS(conf, list): - for hdr in list.split(): - CHECK_HEADER(conf, hdr) - -@conf -def CHECK_TYPES(conf, list): - for t in list.split(): - conf.check(type_name=t, header_name=conf.env.hlist) - -@conf -def CHECK_TYPE_IN(conf, t, hdr): - if conf.check(header_name=hdr): - conf.check(type_name=t, header_name=hdr) - -@conf -def CHECK_TYPE(conf, t, alternate): - if not conf.check(type_name=t, header_name=conf.env.hlist): - conf.DEFINE(t, alternate) - -@conf -def CHECK_VARIABLE(conf, v): - hdrs='' - for h in conf.env.hlist: - hdrs += '#include <%s>\n' % h - if conf.check(fragment= - '%s\nint main(void) {void *_x; _x=(void *)&%s; return 0;}\n' % (hdrs, v), - execute=0, - msg="Checking for variable %s" % v): - conf.DEFINE('HAVE_%s' % v.upper(), 1) - -@runonce -def CHECK_FUNC(conf, f): - conf.check(function_name=f, header_name=conf.env.hlist) - - -@conf -def CHECK_FUNCS(conf, list): - for f in list.split(): - CHECK_FUNC(conf, f) - - -################################################# -# return True if a configuration option was found -@conf -def CONFIG_SET(conf, option): - return (option in conf.env) and (conf.env[option] != ()) -Build.BuildContext.CONFIG_SET = CONFIG_SET - - -########################################################### -# check that the functions in 'list' are available in 'library' -# if they are, then make that library available as a dependency -# -# if the library is not available and mandatory==True, then -# raise an error. -# -# If the library is not available and mandatory==False, then -# add the library to the list of dependencies to remove from -# build rules -@conf -def CHECK_FUNCS_IN(conf, list, library, mandatory=False): - if not conf.check(lib=library, uselib_store=library): - conf.ASSERT(not mandatory, - "Mandatory library '%s' not found for functions '%s'" % (library, list)) - # if it isn't a mandatory library, then remove it from dependency lists - LOCAL_CACHE_SET(conf, 'EMPTY_TARGETS', library.upper(), True) - return - for f in list.split(): - conf.check(function_name=f, lib=library, header_name=conf.env.hlist) - conf.env['LIB_' + library.upper()] = library - LOCAL_CACHE_SET(conf, 'TARGET_TYPE', library, 'SYSLIB') - - -################################################# -# write out config.h in the right directory -@conf -def SAMBA_CONFIG_H(conf, path=None): - if os.path.normpath(conf.curdir) != os.path.normpath(os.environ.get('PWD')): - return - if path is None: - conf.write_config_header('config.h', top=True) - else: - conf.write_config_header(path) - - -############################################################## -# setup a configurable path -@conf -def CONFIG_PATH(conf, name, default): - if not name in conf.env: - conf.env[name] = conf.env['PREFIX'] + default - conf.define(name, conf.env[name], quote=True) - -############################################################## -# add some CFLAGS to the command line -@conf -def ADD_CFLAGS(conf, flags): - if not 'EXTRA_CFLAGS' in conf.env: - conf.env['EXTRA_CFLAGS'] = [] - conf.env['EXTRA_CFLAGS'].extend(flags.split()) - - -############################################################## -# work out the current flags. local flags are added first -def CURRENT_CFLAGS(bld, cflags): - if not 'EXTRA_CFLAGS' in bld.env: - list = [] - else: - list = bld.env['EXTRA_CFLAGS']; - ret = cflags.split() - ret.extend(list) - return ret - - -################################################################ -# magic rpath handling -# -# we want a different rpath when installing and when building -# Note that this should really check if rpath is available on this platform -# and it should also honor an --enable-rpath option -def set_rpath(bld): - if Options.is_install: - if bld.env['RPATH_ON_INSTALL']: - bld.env['RPATH'] = ['-Wl,-rpath=%s/lib' % bld.env.PREFIX] - else: - bld.env['RPATH'] = [] - else: - rpath = os.path.normpath('%s/%s' % (bld.env['BUILD_DIRECTORY'], LIB_PATH)) - bld.env.append_value('RPATH', '-Wl,-rpath=%s' % rpath) -Build.BuildContext.set_rpath = set_rpath - - -############################################################# -# return a named build cache dictionary, used to store -# state inside the following functions -@conf -def LOCAL_CACHE(ctx, name): - if name in ctx.env: - return ctx.env[name] - ctx.env[name] = {} - return ctx.env[name] +# bring in the other samba modules +from samba_utils import * +from samba_autoconf import * +LIB_PATH="shared" -############################################################# -# set a value in a local cache -@conf -def LOCAL_CACHE_SET(ctx, cachename, key, value): - cache = LOCAL_CACHE(ctx, cachename) - cache[key] = value ############################################################# # set a value in a local cache @@ -215,24 +38,6 @@ def SET_TARGET_TYPE(ctx, target, value): return True -############################################################# -# a build assert call -@conf -def ASSERT(ctx, expression, msg): - if not expression: - sys.stderr.write("ERROR: %s\n" % msg) - raise AssertionError -Build.BuildContext.ASSERT = ASSERT - -################################################################ -# create a list of files by pre-pending each with a subdir name -def SUBDIR(bld, subdir, list): - ret = '' - for l in list.split(): - ret = ret + subdir + '/' + l + ' ' - return ret -Build.BuildContext.SUBDIR = SUBDIR - ################################################################# # create the samba build environment @conf @@ -260,13 +65,6 @@ def ADD_INIT_FUNCTION(bld, subsystem, init_function): cache[subsystem] += '%s,' % init_function Build.BuildContext.ADD_INIT_FUNCTION = ADD_INIT_FUNCTION -####################################################### -# d1 += d2 -def dict_concat(d1, d2): - for t in d2: - if t not in d1: - d1[t] = d2[t] - ################################################################ # recursively build the dependency list for a target def FULL_DEPENDENCIES(bld, cache, target, chain, path): @@ -788,28 +586,6 @@ def BUILD_SUBDIR(bld, dir): Build.BuildContext.BUILD_SUBDIR = BUILD_SUBDIR -############################################################ -# this overrides the 'waf -v' debug output to be in a nice -# unix like format instead of a python list. -# Thanks to ita on #waf for this -def exec_command(self, cmd, **kw): - import Utils, Logs - _cmd = cmd - if isinstance(cmd, list): - _cmd = ' '.join(cmd) - debug('runner: %s' % _cmd) - if self.log: - self.log.write('%s\n' % cmd) - kw['log'] = self.log - try: - if not kw.get('cwd', None): - kw['cwd'] = self.cwd - except AttributeError: - self.cwd = kw['cwd'] = self.bldnode.abspath() - return Utils.exec_command(cmd, **kw) -Build.BuildContext.exec_command = exec_command - - ########################################################## # add a new top level command to waf def ADD_COMMAND(opt, name, function): @@ -840,13 +616,3 @@ def SET_BUILD_GROUP(bld, group): bld.set_group(group) Build.BuildContext.SET_BUILD_GROUP = SET_BUILD_GROUP - -#import TaskGen, Task -# -#old_post_run = Task.Task.post_run -#def new_post_run(self): -# self.cached = True -# return old_post_run(self) -# -#for y in ['cc', 'cxx']: -# TaskGen.classes[y].post_run = new_post_run |