summaryrefslogtreecommitdiff
path: root/buildtools/wafsamba/wafsamba.py
diff options
context:
space:
mode:
Diffstat (limited to 'buildtools/wafsamba/wafsamba.py')
-rw-r--r--buildtools/wafsamba/wafsamba.py174
1 files changed, 127 insertions, 47 deletions
diff --git a/buildtools/wafsamba/wafsamba.py b/buildtools/wafsamba/wafsamba.py
index e90bd35ef4..5b63c1eef9 100644
--- a/buildtools/wafsamba/wafsamba.py
+++ b/buildtools/wafsamba/wafsamba.py
@@ -1,16 +1,16 @@
# 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
+import Build, os, Options, Task, Utils
from Configure import conf
from Logs import debug
-from TaskGen import extension
# bring in the other samba modules
from samba_utils import *
from samba_autoconf import *
from samba_patterns import *
from samba_pidl import *
+from samba_errtable import *
from samba_asn1 import *
from samba_autoproto import *
from samba_python import *
@@ -19,25 +19,26 @@ from samba_deps import *
LIB_PATH="shared"
+
#################################################################
# create the samba build environment
@conf
def SAMBA_BUILD_ENV(conf):
- libpath="%s/%s" % (conf.blddir, LIB_PATH)
conf.env['BUILD_DIRECTORY'] = conf.blddir
- if not os.path.exists(libpath):
- os.mkdir(libpath)
+ mkdir_p(os.path.join(conf.blddir, LIB_PATH))
+ mkdir_p(os.path.join(conf.blddir, 'python/samba/dcerpc'))
+
################################################################
# add an init_function to the list for a subsystem
-def ADD_INIT_FUNCTION(bld, subsystem, init_function):
+def ADD_INIT_FUNCTION(bld, subsystem, target, init_function):
if init_function is None:
return
bld.ASSERT(subsystem is not None, "You must specify a subsystem for init_function '%s'" % init_function)
cache = LOCAL_CACHE(bld, 'INIT_FUNCTIONS')
if not subsystem in cache:
cache[subsystem] = []
- cache[subsystem].append(init_function)
+ cache[subsystem].append( { 'TARGET':target, 'INIT_FUNCTION':init_function } )
Build.BuildContext.ADD_INIT_FUNCTION = ADD_INIT_FUNCTION
@@ -50,7 +51,7 @@ def SAMBA_LIBRARY(bld, libname, source,
public_headers=None,
vnum=None,
cflags='',
- output_type=None,
+ external_library=False,
realname=None,
autoproto=None,
group='main',
@@ -73,7 +74,7 @@ def SAMBA_LIBRARY(bld, libname, source,
features = 'cc cshlib symlink_lib',
source = source,
target = libname,
- ccflags = CURRENT_CFLAGS(bld, libname, cflags),
+ samba_cflags = CURRENT_CFLAGS(bld, libname, cflags),
depends_on = depends_on,
samba_deps = TO_LIST(deps),
samba_includes = includes,
@@ -98,10 +99,10 @@ def SAMBA_BINARY(bld, binname, source,
autoproto=None,
use_hostcc=None,
compiler=None,
- group='main',
+ group='binaries',
manpages=None,
local_include=True,
- subsystem=None,
+ subsystem_name=None,
needs_python=False):
if not SET_TARGET_TYPE(bld, binname, 'BINARY'):
@@ -116,39 +117,27 @@ def SAMBA_BINARY(bld, binname, source,
features = features,
source = source,
target = binname,
- ccflags = CURRENT_CFLAGS(bld, binname, cflags),
+ samba_cflags = CURRENT_CFLAGS(bld, binname, cflags),
samba_deps = TO_LIST(deps),
samba_includes = includes,
local_include = local_include,
samba_modules = modules,
top = True,
- samba_subsystem= subsystem
+ samba_subsystem= subsystem_name
)
+ # setup the subsystem_name as an alias for the real
+ # binary name, so it can be found when expanding
+ # subsystem dependencies
+ if subsystem_name is not None:
+ bld.TARGET_ALIAS(subsystem_name, binname)
+
if autoproto is not None:
bld.SAMBA_AUTOPROTO(autoproto, source)
Build.BuildContext.SAMBA_BINARY = SAMBA_BINARY
#################################################################
-# define a Samba ET target
-def SAMBA_ERRTABLE(bld, name, source,
- options='',
- directory=''):
-# print "Skipping ERRTABLE rule for %s with source=%s" % (name, source)
-# return
- if not SET_TARGET_TYPE(bld, name, 'ET'):
- return
- bld.SET_BUILD_GROUP('build_source')
- bld(
- features = 'cc',
- source = source,
- target = name,
- includes = '# #source4/heimdal_build #source4 #lib/replace'
- )
-Build.BuildContext.SAMBA_ERRTABLE = SAMBA_ERRTABLE
-
-#################################################################
# define a Samba module.
def SAMBA_MODULE(bld, modname, source,
deps='',
@@ -159,12 +148,12 @@ def SAMBA_MODULE(bld, modname, source,
autoproto_extra_source='',
aliases=None,
cflags='',
- output_type=None,
+ internal_module=True,
local_include=True,
enabled=True):
- if output_type == 'MERGED_OBJ':
- # treat merged object modules as subsystems for now
+ if internal_module:
+ # treat internal modules as subsystems for now
SAMBA_SUBSYSTEM(bld, modname, source,
deps=deps,
includes=includes,
@@ -177,7 +166,8 @@ def SAMBA_MODULE(bld, modname, source,
# add it to the init_function list
# TODO: we should also create an implicit dependency
# between the subsystem target and this target
- bld.ADD_INIT_FUNCTION(subsystem, init_function)
+ if enabled:
+ bld.ADD_INIT_FUNCTION(subsystem, modname, init_function)
return
if not enabled:
@@ -193,7 +183,7 @@ def SAMBA_MODULE(bld, modname, source,
return
- bld.ADD_INIT_FUNCTION(subsystem, init_function)
+ bld.ADD_INIT_FUNCTION(subsystem, modname, init_function)
if subsystem is not None:
deps += ' ' + subsystem
@@ -203,7 +193,7 @@ def SAMBA_MODULE(bld, modname, source,
features = 'cc',
source = source,
target = modname,
- ccflags = CURRENT_CFLAGS(bld, modname, cflags),
+ samba_cflags = CURRENT_CFLAGS(bld, modname, cflags),
samba_includes = includes,
local_include = local_include,
samba_deps = TO_LIST(deps)
@@ -234,18 +224,14 @@ def SAMBA_SUBSYSTEM(bld, modname, source,
depends_on='',
local_include=True,
local_include_first=True,
- enabled=True):
+ subsystem_name=None,
+ enabled=True,
+ needs_python=False):
if not enabled:
SET_TARGET_TYPE(bld, modname, 'DISABLED')
return
- # if the caller specifies a config_option, then we create a blank
- # subsystem if that configuration option was found at configure time
- if (config_option is not None) and bld.CONFIG_SET(config_option):
- SET_TARGET_TYPE(bld, modname, 'EMPTY')
- return
-
# remember empty subsystems, so we can strip the dependencies
if (source == '') or (source == []):
SET_TARGET_TYPE(bld, modname, 'EMPTY')
@@ -258,16 +244,21 @@ def SAMBA_SUBSYSTEM(bld, modname, source,
bld.SET_BUILD_GROUP(group)
+ features = 'cc'
+ if needs_python:
+ features += ' pyext'
+
t = bld(
- features = 'cc',
+ features = features,
source = source,
target = modname,
- ccflags = CURRENT_CFLAGS(bld, modname, cflags),
+ samba_cflags = CURRENT_CFLAGS(bld, modname, cflags),
depends_on = depends_on,
samba_deps = TO_LIST(deps),
samba_includes = includes,
local_include = local_include,
- local_include_first = local_include_first
+ local_include_first = local_include_first,
+ samba_subsystem= subsystem_name
)
if heimdal_autoproto is not None:
@@ -334,6 +325,7 @@ def SETUP_BUILD_GROUPS(bld):
bld.add_group('build_source')
bld.add_group('prototypes')
bld.add_group('main')
+ bld.add_group('binaries')
bld.add_group('final')
Build.BuildContext.SETUP_BUILD_GROUPS = SETUP_BUILD_GROUPS
@@ -360,3 +352,91 @@ def h_file(filename):
@conf
def ENABLE_TIMESTAMP_DEPENDENCIES(conf):
Utils.h_file = h_file
+
+
+##############################
+# handle the creation of links for libraries and binaries
+# note that we use a relative symlink path to allow the whole tree
+# to me moved/copied elsewhere without breaking the links
+t = Task.simple_task_type('symlink_lib', 'ln -sf ${LINK_SOURCE} ${LINK_TARGET}',
+ color='PINK', ext_in='.bin')
+t.quiet = True
+
+@feature('symlink_lib')
+@after('apply_link')
+def symlink_lib(self):
+ tsk = self.create_task('symlink_lib', self.link_task.outputs[0])
+
+ # calculat the link target and put it in the environment
+ soext=""
+ vnum = getattr(self, 'vnum', None)
+ if vnum is not None:
+ soext = '.' + vnum.split('.')[0]
+
+ link_target = getattr(self, 'link_name', '')
+ if link_target == '':
+ link_target = '%s/lib%s.so%s' % (LIB_PATH, self.sname, soext)
+
+
+ link_source = os_path_relpath(self.link_task.outputs[0].abspath(self.env),
+ os.path.join(self.env.BUILD_DIRECTORY, link_target))
+
+ tsk.env.LINK_TARGET = link_target
+ tsk.env.LINK_SOURCE = link_source[3:]
+ debug('task_gen: LINK for %s is %s -> %s',
+ self.name, tsk.env.LINK_SOURCE, tsk.env.LINK_TARGET)
+
+# for binaries we need to copy the executable to avoid the rpath changing
+# in the local bin/ directory on install
+t = Task.simple_task_type('copy_bin', 'rm -f ${BIN_TARGET} && cp ${SRC} ${BIN_TARGET}', color='PINK',
+ ext_in='.bin', shell=True)
+t.quiet = True
+
+@feature('copy_bin')
+@after('apply_link')
+def copy_bin(self):
+ if Options.is_install:
+ # we don't want to copy the install binary, as
+ # that has the install rpath, not the build rpath
+ # The rpath of the binaries in bin/default/foo/blah is different
+ # during the install phase, as distros insist on not using rpath in installed binaries
+ return
+ tsk = self.create_task('copy_bin', self.link_task.outputs[0])
+
+ tsk.env.BIN_TARGET = self.target
+ debug('task_gen: BIN_TARGET for %s is %s', self.name, tsk.env.BIN_TARGET)
+
+
+
+
+t = Task.simple_task_type('copy_script', 'ln -sf ${SRC[0].abspath(env)} ${LINK_TARGET}',
+ color='PINK', ext_in='.bin', shell=True)
+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'''
+
+ source = bld.path.ant_glob(pattern)
+
+ bld.SET_BUILD_GROUP('build_source')
+ for s in TO_LIST(source):
+ iname = s
+ if installname != 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)
+ t.env.LINK_TARGET = target
+
+Build.BuildContext.SAMBA_SCRIPT = SAMBA_SCRIPT