From 8f062f4a0f781b351e361ce07d0701f312069851 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 17 Mar 2010 20:31:46 +1100 Subject: [PATCH] build: neater way to find libreplace and start on tevent waf build --- lib/replace/wafsamba.py | 67 +++++++++++++++++++++++++++++++---------- lib/replace/wscript | 24 +++++++++++++-- lib/talloc/wscript | 14 ++++++--- lib/tdb/wscript | 25 +++++++++------ lib/tevent/wscript | 30 ++++++++++++++++++ 5 files changed, 128 insertions(+), 32 deletions(-) create mode 100644 lib/tevent/wscript diff --git a/lib/replace/wafsamba.py b/lib/replace/wafsamba.py index 07eb1c9cfc5..f0f4910d155 100644 --- a/lib/replace/wafsamba.py +++ b/lib/replace/wafsamba.py @@ -16,13 +16,13 @@ def DEFUN(conf, d, v): @conf def CHECK_HEADERS(conf, list): - for hdr in list.rsplit(' '): + for hdr in list.split(): if conf.check(header_name=hdr): conf.env.hlist.append(hdr) @conf def CHECK_TYPES(conf, list): - for t in list.rsplit(' '): + for t in list.split(): conf.check(type_name=t, header_name=conf.env.hlist) @conf @@ -37,15 +37,24 @@ def CHECK_TYPE(conf, t, alternate): @conf def CHECK_FUNCS(conf, list): - for f in list.rsplit(' '): + for f in list.split(): conf.check(function_name=f, header_name=conf.env.hlist) @conf def CHECK_FUNCS_IN(conf, list, library): if conf.check(lib=library, uselib_store=library): - for f in list.rsplit(' '): + for f in list.split(): conf.check(function_name=f, lib=library, header_name=conf.env.hlist) +################################################# +# write out config.h in the right directory +@conf +def SAMBA_CONFIG_H(conf): + import os + if os.path.normpath(conf.curdir) == os.path.normpath(conf.srcdir): + conf.write_config_header('config.h') + + ################################################################ # magic rpath handling # @@ -60,6 +69,16 @@ def set_rpath(bld): bld.env.append_value('RPATH', '-Wl,-rpath=build/default') Build.BuildContext.set_rpath = set_rpath + +################################################################ +# 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 + ################################################################ # this will contain the set of includes needed per Samba library Build.BuildContext.SAMBA_LIBRARY_INCLUDES = {} @@ -72,7 +91,7 @@ Build.BuildContext.SAMBA_LIBRARY_DEPS = {} # return a include list for a set of library dependencies def SAMBA_LIBRARY_INCLUDE_LIST(bld, libdeps): ret = bld.curdir + ' ' - for l in libdeps.rsplit(' '): + for l in libdeps.split(): if l in bld.SAMBA_LIBRARY_INCLUDES: ret = ret + bld.SAMBA_LIBRARY_INCLUDES[l] + ' ' return ret @@ -81,13 +100,15 @@ Build.BuildContext.SAMBA_LIBRARY_INCLUDE_LIST = SAMBA_LIBRARY_INCLUDE_LIST ################################################################# # define a Samba library -def SAMBA_LIBRARY(bld, libname, source_list, libdeps='', include_list=''): - ilist = bld.SAMBA_LIBRARY_INCLUDE_LIST(libdeps) + include_list +def SAMBA_LIBRARY(bld, libname, source_list, + libdeps='', include_list='.', vnum=None): + ilist = bld.SAMBA_LIBRARY_INCLUDE_LIST(libdeps) + bld.SUBDIR(bld.curdir, include_list) bld( features = 'cc cshlib', source = source_list, target=libname, - includes=ilist) + includes='. ' + ilist, + vnum=vnum) bld.SAMBA_LIBRARY_INCLUDES[libname] = ilist Build.BuildContext.SAMBA_LIBRARY = SAMBA_LIBRARY @@ -99,19 +120,19 @@ def SAMBA_BINARY(bld, binname, source_list, libdeps='', include_list=''): source = source_list, target = binname, uselib_local = libdeps, - includes = bld.SAMBA_LIBRARY_INCLUDE_LIST(libdeps) + include_list) + includes = '. ' + bld.SAMBA_LIBRARY_INCLUDE_LIST(libdeps) + include_list) Build.BuildContext.SAMBA_BINARY = SAMBA_BINARY ############################################################ -# this overrides the normal -v debug output to be in a nice -# unix like format. Thanks to ita on #waf for this +# 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 - from Logs import debug + import Utils, Logs _cmd = cmd if isinstance(cmd, list): _cmd = ' '.join(cmd) - debug('runner: %s' % _cmd) + Logs.debug('runner: %s' % _cmd) if self.log: self.log.write('%s\n' % cmd) kw['log'] = self.log @@ -121,6 +142,20 @@ def exec_command(self, cmd, **kw): except AttributeError: self.cwd = kw['cwd'] = self.bldnode.abspath() return Utils.exec_command(cmd, **kw) - -import Build Build.BuildContext.exec_command = exec_command + + +###################################################### +# 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 diff --git a/lib/replace/wscript b/lib/replace/wscript index 6fc49e57dc8..e4eebdf6de5 100644 --- a/lib/replace/wscript +++ b/lib/replace/wscript @@ -1,7 +1,7 @@ srcdir = '.' blddir = 'build' -import Options, os +import Options, os, wafsamba def set_options(opt): opt.tool_options('compiler_cc') @@ -9,6 +9,7 @@ def set_options(opt): help=("Disable use of rpath"), action="store_true", dest='disable_rpath', default=False) +@wafsamba.runonce def configure(conf): conf.env.hlist = [] @@ -20,7 +21,7 @@ def configure(conf): conf.DEFUN('_XOPEN_SOURCE_EXTENDED', 1) conf.DEFUN('LIBREPLACE_NETWORK_CHECKS', 1) - conf.CHECK_HEADERS('unistd.h sys/types.h stdlib.h stdio.h') + conf.CHECK_HEADERS('unistd.h sys/types.h stdlib.h stdio.h stddef.h') conf.CHECK_HEADERS('sys/wait.h sys/stat.h malloc.h grp.h') conf.CHECK_HEADERS('crypt.h dlfcn.h dl.h standards.h stdbool.h stdint.h') conf.CHECK_HEADERS('sys/select.h setjmp.h utime.h sys/syslog.h syslog.h') @@ -31,6 +32,9 @@ def configure(conf): conf.CHECK_HEADERS('sys/uio.h ifaddrs.h direct.h dirent.h') conf.CHECK_HEADERS('windows.h winsock2.h ws2tcpip.h') + if 'HAVE_STDDEF_H' in conf.env and 'HAVE_STDLIB_H' in conf.env: + conf.DEFUN('STDC_HEADERS', 1) + conf.check(type_name='long long') conf.CHECK_TYPES('intptr_t uintptr_t ptrdiff_t') conf.CHECK_TYPES('comparison_fn_t socklen_t bool') @@ -68,6 +72,20 @@ def configure(conf): conf.CHECK_FUNCS_IN('dlopen dlsym dlerror dlclose', 'dl') + conf.check_cc(fragment=''' + #include + va_list ap1,ap2; + va_copy(ap1,ap2); + int main(void) + { return 0; }''', + define_name="HAVE_VA_COPY", + execute=0, + link=0, + define_ret=0, + quote=0, + msg="Checking for va_copy") + + # we could also put code fragments like this in separate files, # for example in test/snprintf.c conf.check_cc(fragment=''' @@ -110,7 +128,7 @@ main() { foo("hello"); } quote=0, msg="Checking for C99 vsnprintf") - conf.write_config_header('config.h') + conf.SAMBA_CONFIG_H() def build(bld): bld.set_rpath() diff --git a/lib/talloc/wscript b/lib/talloc/wscript index bcbb844a971..989a8a8b41c 100644 --- a/lib/talloc/wscript +++ b/lib/talloc/wscript @@ -1,18 +1,24 @@ +VERSION = '2.0.1' + srcdir = '.' blddir = 'build' +LIBREPLACE_DIR='../replace' + def set_options(opt): - opt.recurse('../replace') + opt.recurse(LIBREPLACE_DIR) def configure(conf): - conf.recurse('../replace') + conf.sub_config(LIBREPLACE_DIR) + conf.SAMBA_CONFIG_H() def build(bld): - bld.recurse('../replace') + bld.add_subdirs(LIBREPLACE_DIR) bld.SAMBA_LIBRARY('talloc', 'talloc.c', - 'replace') + libdeps='replace', + vnum=VERSION) bld.SAMBA_BINARY('talloc_testsuite', 'testsuite.c testsuite_main.c', diff --git a/lib/tdb/wscript b/lib/tdb/wscript index 4115593de63..c746af6def0 100644 --- a/lib/tdb/wscript +++ b/lib/tdb/wscript @@ -1,23 +1,30 @@ +VERSION='1.2.1' + srcdir = '.' blddir = 'build' +LIBREPLACE_DIR='../replace' + def set_options(opt): - opt.recurse('../talloc') + opt.recurse(LIBREPLACE_DIR) def configure(conf): - conf.recurse('../talloc') + conf.sub_config(LIBREPLACE_DIR) + conf.SAMBA_CONFIG_H() def build(bld): - bld.recurse('../talloc') + bld.add_subdirs(LIBREPLACE_DIR) - COMMON_SOURCE = '''common/check.c common/error.c common/tdb.c common/traverse.c - common/freelistcheck.c common/lock.c common/dump.c common/freelist.c - common/io.c common/open.c common/transaction.c''' + COMMON_SRC = bld.SUBDIR('common', + '''check.c error.c tdb.c traverse.c + freelistcheck.c lock.c dump.c freelist.c + io.c open.c transaction.c''') bld.SAMBA_LIBRARY('tdb', - COMMON_SOURCE, - 'replace talloc', - 'include') + COMMON_SRC, + libdeps='replace talloc', + include_list='include', + vnum=VERSION) bld.SAMBA_BINARY('tdbtorture', 'tools/tdbtorture.c', diff --git a/lib/tevent/wscript b/lib/tevent/wscript new file mode 100644 index 00000000000..87d6037aea2 --- /dev/null +++ b/lib/tevent/wscript @@ -0,0 +1,30 @@ +VERSION = '0.9.8' + +srcdir = '.' +blddir = 'build' + +LIBREPLACE_DIR='../replace' + +def set_options(opt): + opt.recurse(LIBREPLACE_DIR) + +def configure(conf): + conf.sub_config(LIBREPLACE_DIR) + + conf.CHECK_HEADERS('sys/epoll.h') + conf.CHECK_FUNCS('epoll_create') + + conf.SAMBA_CONFIG_H() + +def build(bld): + bld.add_subdirs(LIBREPLACE_DIR) + + SRC = '''tevent.c tevent_debug.c tevent_epoll.c tevent_fd.c tevent_immediate.c + tevent_queue.c tevent_req.c tevent_select.c + tevent_signal.c tevent_standard.c tevent_timed.c tevent_util.c tevent_wakeup.c''' + + + bld.SAMBA_LIBRARY('tevent', + SRC, + libdeps='replace talloc', + vnum=VERSION) -- 2.34.1