X-Git-Url: http://git.samba.org/?a=blobdiff_plain;f=buildtools%2Fwafsamba%2Fwafsamba.py;h=bd2ca89f62ab858ed5b754cdcd0b8e3793871ba0;hb=82e583b04b04e560c121163850d70c52d2fce78d;hp=83972def10ff8103560f0a237415828e1a08be4f;hpb=066a93d41cbb2ecbbcc63646c11a28d7ca291c76;p=obnox%2Fsamba%2Fsamba-obnox.git diff --git a/buildtools/wafsamba/wafsamba.py b/buildtools/wafsamba/wafsamba.py index 83972def10f..bd2ca89f62a 100644 --- a/buildtools/wafsamba/wafsamba.py +++ b/buildtools/wafsamba/wafsamba.py @@ -16,11 +16,14 @@ from samba_patterns import * from samba_pidl import * from samba_autoproto import * from samba_python import * +from samba_perl import * from samba_deps import * from samba_bundled import * +from samba_third_party import * import samba_install import samba_conftests import samba_abi +import samba_headers import tru64cc import irixcc import hpuxcc @@ -30,6 +33,7 @@ import samba_wildcard import stale_files import symbols import pkgconfig +import configure_file # some systems have broken threading in python if os.environ.get('WAF_NOTHREADS') == '1': @@ -37,7 +41,7 @@ if os.environ.get('WAF_NOTHREADS') == '1': LIB_PATH="shared" -os.putenv('PYTHONUNBUFFERED', '1') +os.environ['PYTHONUNBUFFERED'] = '1' if Constants.HEXVERSION < 0x105019: @@ -62,10 +66,10 @@ def SAMBA_BUILD_ENV(conf): # this allows all of the bin/shared and bin/python targets # to be expressed in terms of build directory paths mkdir_p(os.path.join(conf.blddir, 'default')) - for p in ['python','shared', 'modules']: - link_target = os.path.join(conf.blddir, 'default/' + p) + for (source, target) in [('shared', 'shared'), ('modules', 'modules'), ('python', 'python_modules')]: + link_target = os.path.join(conf.blddir, 'default/' + target) if not os.path.lexists(link_target): - os.symlink('../' + p, link_target) + os.symlink('../' + source, link_target) # get perl to put the blib files in the build directory blib_bld = os.path.join(conf.blddir, 'default/pidl/blib') @@ -97,6 +101,7 @@ def SAMBA_LIBRARY(bld, libname, source, public_deps='', includes='', public_headers=None, + public_headers_install=True, header_path=None, pc_files=None, vnum=None, @@ -105,10 +110,13 @@ def SAMBA_LIBRARY(bld, libname, source, ldflags='', external_library=False, realname=None, + keep_underscore=False, autoproto=None, - group='libraries', + autoproto_extra_source='', + group='main', depends_on='', local_include=True, + global_include=True, vars=None, subdir=None, install_path=None, @@ -125,9 +133,13 @@ def SAMBA_LIBRARY(bld, libname, source, private_library=False, grouping_library=False, allow_undefined_symbols=False, + allow_warnings=False, enabled=True): '''define a Samba library''' + if LIB_MUST_BE_PRIVATE(bld, libname): + private_library=True + if not enabled: SET_TARGET_TYPE(bld, libname, 'DISABLED') return @@ -160,14 +172,19 @@ def SAMBA_LIBRARY(bld, libname, source, public_deps = public_deps, includes = includes, public_headers = public_headers, + public_headers_install = public_headers_install, header_path = header_path, cflags = cflags, group = subsystem_group, autoproto = autoproto, + autoproto_extra_source=autoproto_extra_source, depends_on = depends_on, hide_symbols = hide_symbols, - pyext = pyext or (target_type == "PYTHON"), - local_include = local_include) + allow_warnings = allow_warnings, + pyembed = pyembed, + pyext = pyext, + local_include = local_include, + global_include = global_include) if BUILTIN_LIBRARY(bld, libname): return @@ -184,22 +201,32 @@ def SAMBA_LIBRARY(bld, libname, source, link_name = bld.map_shlib_extension(link_name, python=(target_type=='PYTHON')) # we don't want any public libraries without version numbers - if not private_library and vnum is None and soname is None and target_type != 'PYTHON' and not realname: - raise Utils.WafError("public library '%s' must have a vnum" % libname) + if (not private_library and target_type != 'PYTHON' and not realname): + if vnum is None and soname is None: + raise Utils.WafError("public library '%s' must have a vnum" % + libname) + if pc_files is None: + raise Utils.WafError("public library '%s' must have pkg-config file" % + libname) + if public_headers is None: + raise Utils.WafError("public library '%s' must have header files" % + libname) if target_type == 'PYTHON' or realname or not private_library: - bundled_name = libname.replace('_', '-') + if keep_underscore: + bundled_name = libname + else: + bundled_name = libname.replace('_', '-') else: - bundled_name = PRIVATE_NAME(bld, libname, bundled_extension, private_library) + bundled_name = PRIVATE_NAME(bld, libname, bundled_extension, + private_library) ldflags = TO_LIST(ldflags) features = 'cc cshlib symlink_lib install_lib' - if target_type == 'PYTHON': + if pyext: features += ' pyext' - if pyext or pyembed: - # this is quite strange. we should add pyext feature for pyext - # but that breaks the build. This may be a bug in the waf python tool + if pyembed: features += ' pyembed' if abi_directory: @@ -217,11 +244,17 @@ def SAMBA_LIBRARY(bld, libname, source, vscript = "%s.vscript" % libname bld.ABI_VSCRIPT(libname, abi_directory, version, vscript, abi_match) - fullname = bld.env.shlib_PATTERN % bundled_name - bld.add_manual_dependency(bld.path.find_or_declare(fullname), bld.path.find_or_declare(vscript)) + fullname = apply_pattern(bundled_name, bld.env.shlib_PATTERN) + fullpath = bld.path.find_or_declare(fullname) + vscriptpath = bld.path.find_or_declare(vscript) + if not fullpath: + raise Utils.WafError("unable to find fullpath for %s" % fullname) + if not vscriptpath: + raise Utils.WafError("unable to find vscript path for %s" % vscript) + bld.add_manual_dependency(fullpath, vscriptpath) if Options.is_install: # also make the .inst file depend on the vscript - instname = bld.env.shlib_PATTERN % (bundled_name + '.inst') + instname = apply_pattern(bundled_name + '.inst', bld.env.shlib_PATTERN) bld.add_manual_dependency(bld.path.find_or_declare(instname), bld.path.find_or_declare(vscript)) vscript = os.path.join(bld.path.abspath(bld.env), vscript) @@ -236,6 +269,7 @@ def SAMBA_LIBRARY(bld, libname, source, samba_includes = includes, version_script = vscript, local_include = local_include, + global_include = global_include, vnum = vnum, soname = soname, install_path = None, @@ -256,11 +290,12 @@ def SAMBA_LIBRARY(bld, libname, source, if link_name: t.link_name = link_name - if pc_files is not None: + if pc_files is not None and not private_library: bld.PKG_CONFIG_FILES(pc_files, vnum=vnum) - if manpages is not None and 'XSLTPROC_MANPAGES' in bld.env and bld.env['XSLTPROC_MANPAGES']: - bld.MANPAGES(manpages) + if (manpages is not None and 'XSLTPROC_MANPAGES' in bld.env and + bld.env['XSLTPROC_MANPAGES']): + bld.MANPAGES(manpages, install) Build.BuildContext.SAMBA_LIBRARY = SAMBA_LIBRARY @@ -279,9 +314,10 @@ def SAMBA_BINARY(bld, binname, source, use_hostcc=False, use_global_deps=True, compiler=None, - group='binaries', + group='main', manpages=None, local_include=True, + global_include=True, subsystem_name=None, pyembed=False, vars=None, @@ -314,6 +350,15 @@ def SAMBA_BINARY(bld, binname, source, else: subsystem_group = group + # only specify PIE flags for binaries + pie_cflags = cflags + pie_ldflags = TO_LIST(ldflags) + if bld.env['ENABLE_PIE'] is True: + pie_cflags += ' -fPIE' + pie_ldflags.extend(TO_LIST('-pie')) + if bld.env['ENABLE_RELRO'] is True: + pie_ldflags.extend(TO_LIST('-Wl,-z,relro,-z,now')) + # first create a target for building the object files for this binary # by separating in this way, we avoid recompiling the C files # separately for the install binary and the build binary @@ -321,11 +366,12 @@ def SAMBA_BINARY(bld, binname, source, source = source, deps = deps, includes = includes, - cflags = cflags, + cflags = pie_cflags, group = subsystem_group, autoproto = autoproto, subsystem_name = subsystem_name, local_include = local_include, + global_include = global_include, use_hostcc = use_hostcc, pyext = pyembed, use_global_deps= use_global_deps) @@ -343,17 +389,18 @@ def SAMBA_BINARY(bld, binname, source, samba_deps = deps, samba_includes = includes, local_include = local_include, + global_include = global_include, samba_modules = modules, top = True, samba_subsystem= subsystem_name, install_path = None, samba_inst_path= install_path, samba_install = install, - samba_ldflags = TO_LIST(ldflags) + samba_ldflags = pie_ldflags ) if manpages is not None and 'XSLTPROC_MANPAGES' in bld.env and bld.env['XSLTPROC_MANPAGES']: - bld.MANPAGES(manpages) + bld.MANPAGES(manpages, install) Build.BuildContext.SAMBA_BINARY = SAMBA_BINARY @@ -370,11 +417,14 @@ def SAMBA_MODULE(bld, modname, source, cflags='', internal_module=True, local_include=True, + global_include=True, vars=None, subdir=None, enabled=True, pyembed=False, - allow_undefined_symbols=False + manpages=None, + allow_undefined_symbols=False, + allow_warnings=False ): '''define a Samba module.''' @@ -383,6 +433,9 @@ def SAMBA_MODULE(bld, modname, source, source = bld.SUBDIR(subdir, source) if internal_module or BUILTIN_LIBRARY(bld, modname): + # Do not create modules for disabled subsystems + if subsystem and GET_TARGET_TYPE(bld, subsystem) == 'DISABLED': + return bld.SAMBA_SUBSYSTEM(modname, source, deps=deps, includes=includes, @@ -390,6 +443,8 @@ def SAMBA_MODULE(bld, modname, source, autoproto_extra_source=autoproto_extra_source, cflags=cflags, local_include=local_include, + global_include=global_include, + allow_warnings=allow_warnings, enabled=enabled) bld.ADD_INIT_FUNCTION(subsystem, modname, init_function) @@ -399,6 +454,10 @@ def SAMBA_MODULE(bld, modname, source, SET_TARGET_TYPE(bld, modname, 'DISABLED') return + # Do not create modules for disabled subsystems + if subsystem and GET_TARGET_TYPE(bld, subsystem) == 'DISABLED': + return + obj_target = modname + '.objlist' realname = modname @@ -426,11 +485,14 @@ def SAMBA_MODULE(bld, modname, source, realname = realname, autoproto = autoproto, local_include=local_include, + global_include=global_include, vars=vars, link_name=build_link_name, install_path="${MODULESDIR}/%s" % subsystem, pyembed=pyembed, - allow_undefined_symbols=allow_undefined_symbols + manpages=manpages, + allow_undefined_symbols=allow_undefined_symbols, + allow_warnings=allow_warnings ) @@ -443,16 +505,18 @@ def SAMBA_SUBSYSTEM(bld, modname, source, public_deps='', includes='', public_headers=None, + public_headers_install=True, header_path=None, cflags='', cflags_end=None, group='main', - init_function_sentinal=None, + init_function_sentinel=None, autoproto=None, autoproto_extra_source='', depends_on='', local_include=True, local_include_first=True, + global_include=True, subsystem_name=None, enabled=True, use_hostcc=False, @@ -460,7 +524,9 @@ def SAMBA_SUBSYSTEM(bld, modname, source, vars=None, subdir=None, hide_symbols=False, - pyext=False): + allow_warnings=False, + pyext=False, + pyembed=False): '''define a Samba subsystem''' if not enabled: @@ -487,20 +553,25 @@ def SAMBA_SUBSYSTEM(bld, modname, source, features = 'cc' if pyext: features += ' pyext' + if pyembed: + features += ' pyembed' t = bld( features = features, source = source, target = modname, - samba_cflags = CURRENT_CFLAGS(bld, modname, cflags, hide_symbols=hide_symbols), + samba_cflags = CURRENT_CFLAGS(bld, modname, cflags, + allow_warnings=allow_warnings, + hide_symbols=hide_symbols), depends_on = depends_on, samba_deps = TO_LIST(deps), samba_includes = includes, local_include = local_include, local_include_first = local_include_first, + global_include = global_include, samba_subsystem= subsystem_name, samba_use_hostcc = use_hostcc, - samba_use_global_deps = use_global_deps + samba_use_global_deps = use_global_deps, ) if cflags_end is not None: @@ -509,7 +580,8 @@ def SAMBA_SUBSYSTEM(bld, modname, source, if autoproto is not None: bld.SAMBA_AUTOPROTO(autoproto, source + TO_LIST(autoproto_extra_source)) if public_headers is not None: - bld.PUBLIC_HEADERS(public_headers, header_path=header_path) + bld.PUBLIC_HEADERS(public_headers, header_path=header_path, + public_headers_install=public_headers_install) return t @@ -519,8 +591,10 @@ Build.BuildContext.SAMBA_SUBSYSTEM = SAMBA_SUBSYSTEM def SAMBA_GENERATOR(bld, name, rule, source='', target='', group='generators', enabled=True, public_headers=None, + public_headers_install=True, header_path=None, vars=None, + dep_vars=[], always=False): '''A generic source generator target''' @@ -530,6 +604,9 @@ def SAMBA_GENERATOR(bld, name, rule, source='', target='', if not enabled: return + dep_vars.append('ruledeps') + dep_vars.append('SAMBA_GENERATOR_VARS') + bld.SET_BUILD_GROUP(group) t = bld( rule=rule, @@ -540,14 +617,19 @@ def SAMBA_GENERATOR(bld, name, rule, source='', target='', before='cc', ext_out='.c', samba_type='GENERATOR', - dep_vars = [rule] + (vars or []), + dep_vars = dep_vars, name=name) + if vars is None: + vars = {} + t.env.SAMBA_GENERATOR_VARS = vars + if always: t.always = True if public_headers is not None: - bld.PUBLIC_HEADERS(public_headers, header_path=header_path) + bld.PUBLIC_HEADERS(public_headers, header_path=header_path, + public_headers_install=public_headers_install) return t Build.BuildContext.SAMBA_GENERATOR = SAMBA_GENERATOR @@ -569,10 +651,9 @@ def SETUP_BUILD_GROUPS(bld): bld.add_group('build_compilers') bld.add_group('build_source') bld.add_group('prototypes') + bld.add_group('headers') bld.add_group('main') bld.add_group('symbolcheck') - bld.add_group('libraries') - bld.add_group('binaries') bld.add_group('syslibcheck') bld.add_group('final') Build.BuildContext.SETUP_BUILD_GROUPS = SETUP_BUILD_GROUPS @@ -603,17 +684,6 @@ def ENABLE_TIMESTAMP_DEPENDENCIES(conf): Utils.h_file = h_file - -t = Task.simple_task_type('copy_script', 'rm -f "${LINK_TARGET}" && ln -s "${SRC[0].abspath(env)}" ${LINK_TARGET}', - shell=True, color='PINK', ext_in='.bin') -t.quiet = True - -@feature('copy_script') -@before('apply_link') -def copy_script(self): - tsk = self.create_task('copy_script', self.allnodes[0]) - tsk.env.TARGET = self.target - def SAMBA_SCRIPT(bld, name, pattern, installdir, installname=None): '''used to copy scripts from the source tree into the build directory for use by selftest''' @@ -623,20 +693,22 @@ def SAMBA_SCRIPT(bld, name, pattern, installdir, installname=None): bld.SET_BUILD_GROUP('build_source') for s in TO_LIST(source): iname = s - if installname != None: + if installname is not None: iname = installname target = os.path.join(installdir, iname) tgtdir = os.path.dirname(os.path.join(bld.srcnode.abspath(bld.env), '..', target)) mkdir_p(tgtdir) - t = bld(features='copy_script', - source = s, - target = target, - always = True, - install_path = None) - t.env.LINK_TARGET = target - + link_src = os.path.normpath(os.path.join(bld.curdir, s)) + link_dst = os.path.join(tgtdir, os.path.basename(iname)) + if os.path.islink(link_dst) and os.readlink(link_dst) == link_src: + continue + if os.path.exists(link_dst): + os.unlink(link_dst) + Logs.info("symlink: %s -> %s/%s" % (s, installdir, iname)) + os.symlink(link_src, link_dst) Build.BuildContext.SAMBA_SCRIPT = SAMBA_SCRIPT + def copy_and_fix_python_path(task): pattern='sys.path.insert(0, "bin/python")' if task.env["PYTHONARCHDIR"] in sys.path and task.env["PYTHONDIR"] in sys.path: @@ -647,21 +719,60 @@ def copy_and_fix_python_path(task): replacement="""sys.path.insert(0, "%s") sys.path.insert(1, "%s")""" % (task.env["PYTHONARCHDIR"], task.env["PYTHONDIR"]) + if task.env["PYTHON"][0] == "/": + replacement_shebang = "#!%s\n" % task.env["PYTHON"] + else: + replacement_shebang = "#!/usr/bin/env %s\n" % task.env["PYTHON"] + installed_location=task.outputs[0].bldpath(task.env) source_file = open(task.inputs[0].srcpath(task.env)) installed_file = open(installed_location, 'w') + lineno = 0 for line in source_file: newline = line - if pattern in line: + if (lineno == 0 and task.env["PYTHON_SPECIFIED"] is True and + line[:2] == "#!"): + newline = replacement_shebang + elif pattern in line: newline = line.replace(pattern, replacement) installed_file.write(newline) + lineno = lineno + 1 + installed_file.close() + os.chmod(installed_location, 0755) + return 0 + +def copy_and_fix_perl_path(task): + pattern='use lib "$RealBin/lib";' + + replacement = "" + if not task.env["PERL_LIB_INSTALL_DIR"] in task.env["PERL_INC"]: + replacement = 'use lib "%s";' % task.env["PERL_LIB_INSTALL_DIR"] + + if task.env["PERL"][0] == "/": + replacement_shebang = "#!%s\n" % task.env["PERL"] + else: + replacement_shebang = "#!/usr/bin/env %s\n" % task.env["PERL"] + + installed_location=task.outputs[0].bldpath(task.env) + source_file = open(task.inputs[0].srcpath(task.env)) + installed_file = open(installed_location, 'w') + lineno = 0 + for line in source_file: + newline = line + if lineno == 0 and task.env["PERL_SPECIFIED"] == True and line[:2] == "#!": + newline = replacement_shebang + elif pattern in line: + newline = line.replace(pattern, replacement) + installed_file.write(newline) + lineno = lineno + 1 installed_file.close() os.chmod(installed_location, 0755) return 0 def install_file(bld, destdir, file, chmod=MODE_644, flat=False, - python_fixup=False, destname=None, base_name=None): + python_fixup=False, perl_fixup=False, + destname=None, base_name=None): '''install a file''' destdir = bld.EXPAND_VARIABLES(destdir) if not destname: @@ -670,10 +781,20 @@ def install_file(bld, destdir, file, chmod=MODE_644, flat=False, destname = os.path.basename(destname) dest = os.path.join(destdir, destname) if python_fixup: - # fixup the python path it will use to find Samba modules + # fix the path python will use to find Samba modules inst_file = file + '.inst' bld.SAMBA_GENERATOR('python_%s' % destname, rule=copy_and_fix_python_path, + dep_vars=["PYTHON","PYTHON_SPECIFIED","PYTHONDIR","PYTHONARCHDIR"], + source=file, + target=inst_file) + file = inst_file + if perl_fixup: + # fix the path perl will use to find Samba modules + inst_file = file + '.inst' + bld.SAMBA_GENERATOR('perl_%s' % destname, + rule=copy_and_fix_perl_path, + dep_vars=["PERL","PERL_SPECIFIED","PERL_LIB_INSTALL_DIR"], source=file, target=inst_file) file = inst_file @@ -683,12 +804,13 @@ def install_file(bld, destdir, file, chmod=MODE_644, flat=False, def INSTALL_FILES(bld, destdir, files, chmod=MODE_644, flat=False, - python_fixup=False, destname=None, base_name=None): + python_fixup=False, perl_fixup=False, + destname=None, base_name=None): '''install a set of files''' for f in TO_LIST(files): install_file(bld, destdir, f, chmod=chmod, flat=flat, - python_fixup=python_fixup, destname=destname, - base_name=base_name) + python_fixup=python_fixup, perl_fixup=perl_fixup, + destname=destname, base_name=base_name) Build.BuildContext.INSTALL_FILES = INSTALL_FILES @@ -720,162 +842,7 @@ def INSTALL_DIRS(bld, destdir, dirs): Build.BuildContext.INSTALL_DIRS = INSTALL_DIRS -re_header = re.compile('#include[ \t]*"([^"]+)"', re.I | re.M) -class header_task(Task.Task): - """ - The public headers (the one installed on the system) have both - different paths and contents, so the rename is not enough. - - Intermediate .inst.h files are created because path manipulation - may be slow. The substitution is thus performed only once. - """ - - name = 'header' - color = 'PINK' - vars = ['INCLUDEDIR', 'HEADER_DEPS'] - - def run(self): - txt = self.inputs[0].read(self.env) - - # hard-coded string, but only present in samba4 (I promise, you won't feel a thing) - txt = txt.replace('#if _SAMBA_BUILD_ == 4', '#if 1\n') - - # use a regexp to substitute the #include lines in the files - map = self.generator.bld.hnodemap - dirnodes = self.generator.bld.hnodedirs - def repl(m): - if m.group(1): - s = m.group(1) - - # pokemon headers: gotta catch'em all! - fin = s - if s.startswith('bin/default'): - node = self.generator.bld.srcnode.find_resource(s.replace('bin/default/', '')) - if not node: - Logs.warn('could not find the public header for %r' % s) - elif node.id in map: - fin = map[node.id] - else: - Logs.warn('could not find the public header replacement for build header %r' % s) - else: - # this part is more difficult since the path may be relative to anything - for dirnode in dirnodes: - node = dirnode.find_resource(s) - if node: - if node.id in map: - fin = map[node.id] - break - else: - Logs.warn('could not find the public header replacement for source header %r %r' % (s, node)) - else: - Logs.warn('-> could not find the public header for %r' % s) - - return "#include <%s>" % fin - return '' - - txt = re_header.sub(repl, txt) - - # and write the output file - f = None - try: - f = open(self.outputs[0].abspath(self.env), 'w') - f.write(txt) - finally: - if f: - f.close() - -@TaskGen.feature('pubh') -def make_public_headers(self): - """ - collect the public headers to process and to install, then - create the substitutions (name and contents) - """ - - if not self.bld.is_install: - # install time only (lazy) - return - - # keep two variables - # hnodedirs: list of folders for searching the headers - # hnodemap: node ids and replacement string (node objects are unique) - try: - self.bld.hnodedirs.append(self.path) - except AttributeError: - self.bld.hnodemap = {} - self.bld.hnodedirs = [self.bld.srcnode, self.path] - - for k in 'source4 source4/include lib/talloc lib/tevent/ source4/lib/ldb/include/'.split(): - node = self.bld.srcnode.find_dir(k) - if node: - self.bld.hnodedirs.append(node) - - header_path = getattr(self, 'header_path', None) or '' - - for x in self.to_list(self.headers): - - # too complicated, but what was the original idea? - if isinstance(header_path, list): - add_dir = '' - for (p1, dir) in header_path: - lst = self.to_list(p1) - for p2 in lst: - if fnmatch.fnmatch(x, p2): - add_dir = dir - break - else: - continue - break - inst_path = add_dir - else: - inst_path = header_path - - dest = '' - name = x - if x.find(':') != -1: - s = x.split(':') - name = s[0] - dest = s[1] - - inn = self.path.find_resource(name) - - if not inn: - raise ValueError("could not find the public header %r in %r" % (name, self.path)) - out = inn.change_ext('.inst.h') - self.create_task('header', inn, out) - - if not dest: - dest = inn.name - - if inst_path: - inst_path = inst_path + '/' - inst_path = inst_path + dest - - self.bld.install_as('${INCLUDEDIR}/%s' % inst_path, out, self.env) - - self.bld.hnodemap[inn.id] = inst_path - - # create a hash (not md5) to make sure the headers are re-created if something changes - val = 0 - lst = list(self.bld.hnodemap.keys()) - lst.sort() - for k in lst: - val = hash((val, k, self.bld.hnodemap[k])) - self.bld.env.HEADER_DEPS = val - -def PUBLIC_HEADERS(bld, public_headers, header_path=None): - '''install some headers - - header_path may either be a string that is added to the INCLUDEDIR, - or it can be a dictionary of wildcard patterns which map to destination - directories relative to INCLUDEDIR - ''' - bld.SET_BUILD_GROUP('final') - ret = bld(features=['pubh'], headers=public_headers, header_path=header_path) - return ret -Build.BuildContext.PUBLIC_HEADERS = PUBLIC_HEADERS - - -def MANPAGES(bld, manpages): +def MANPAGES(bld, manpages, install): '''build and install manual pages''' bld.env.MAN_XSL = 'http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl' for m in manpages.split(): @@ -884,11 +851,33 @@ def MANPAGES(bld, manpages): source=source, target=m, group='final', - rule='${XSLTPROC} -o ${TGT} --nonet ${MAN_XSL} ${SRC}' + rule='${XSLTPROC} --xinclude -o ${TGT} --nonet ${MAN_XSL} ${SRC}' ) - bld.INSTALL_FILES('${MANDIR}/man%s' % m[-1], m, flat=True) + if install: + bld.INSTALL_FILES('${MANDIR}/man%s' % m[-1], m, flat=True) Build.BuildContext.MANPAGES = MANPAGES +def SAMBAMANPAGES(bld, manpages, extra_source=None): + '''build and install manual pages''' + bld.env.SAMBA_EXPAND_XSL = bld.srcnode.abspath() + '/docs-xml/xslt/expand-sambadoc.xsl' + bld.env.SAMBA_MAN_XSL = bld.srcnode.abspath() + '/docs-xml/xslt/man.xsl' + bld.env.SAMBA_CATALOGS = 'file:///etc/xml/catalog file:///usr/local/share/xml/catalog file://' + bld.srcnode.abspath() + '/bin/default/docs-xml/build/catalog.xml' + + for m in manpages.split(): + source = m + '.xml' + if extra_source is not None: + source = [source, extra_source] + bld.SAMBA_GENERATOR(m, + source=source, + target=m, + group='final', + rule='''XML_CATALOG_FILES="${SAMBA_CATALOGS}" + export XML_CATALOG_FILES + ${XSLTPROC} --xinclude --stringparam noreference 0 -o ${TGT}.xml --nonet ${SAMBA_EXPAND_XSL} ${SRC[0].abspath(env)} + ${XSLTPROC} --nonet -o ${TGT} ${SAMBA_MAN_XSL} ${TGT}.xml''' + ) + bld.INSTALL_FILES('${MANDIR}/man%s' % m[-1], m, flat=True) +Build.BuildContext.SAMBAMANPAGES = SAMBAMANPAGES ############################################################# # give a nicer display when building different types of files