build: rewrote PIDL rules, breaking them into a separate waf tool
authorAndrew Tridgell <tridge@samba.org>
Sun, 28 Feb 2010 06:34:43 +0000 (17:34 +1100)
committerAndrew Tridgell <tridge@samba.org>
Tue, 6 Apr 2010 10:26:39 +0000 (20:26 +1000)
buildtools/wafsamba/samba_patterns.py
buildtools/wafsamba/samba_pidl.py [new file with mode: 0644]
buildtools/wafsamba/samba_utils.py
buildtools/wafsamba/wafsamba.py

index e6c7f4d3d294395a30d1d26b1a076dadbd39f8aa..f70689558669c51ffe99d775676145d0f01d226a 100644 (file)
@@ -7,15 +7,6 @@ from Logs import debug
 from TaskGen import extension
 from samba_utils import *
 
-##########################################################
-# create a node with a new name, based on an existing node
-def NEW_NODE(node, name):
-    ret = node.parent.find_or_declare([name])
-    ASSERT(node, ret is not None, "Unable to find new target with name '%s' from '%s'" % (
-            name, node.name))
-    return ret
-
-
 ################################################################################
 # a et task which calls out to compile_et to do the work
 Task.simple_task_type('et',
@@ -32,32 +23,6 @@ def process_et(self, node):
 
 
 
-################################################################################
-# a idl task which calls out to pidl to do the work
-Task.simple_task_type('idl', '../../pidl/pidl ${TGT[0].options} --header --ndr-parser --client --python --server --outputdir=${TGT[0].outputdir} -- ${SRC}', color='BLUE', ext_out='.c')
-
-@extension('.idl')
-def process_idl(self, node):
-    bname      = node.file_base()
-    gen_ndr    = "../gen_ndr/"
-    c_node     = NEW_NODE(node, gen_ndr + 'ndr_%s.c' % bname)
-    h1_node    = NEW_NODE(node, gen_ndr + '%s.h' % bname)
-    h2_node    = NEW_NODE(node, gen_ndr + 'ndr_%s.h' % bname)
-    s_node     = NEW_NODE(node, gen_ndr + 'ndr_%s_s.c' % bname)
-    cli_node   = NEW_NODE(node, gen_ndr + 'ndr_%s_c.c' % bname)
-    cli_h_node = NEW_NODE(node, gen_ndr + 'ndr_%s_c.h' % bname)
-    py_node    = NEW_NODE(node, gen_ndr + 'py_%s.c' % bname)
-
-    dname = os.path.dirname(node.bld_dir(self.env)) + "/gen_ndr"
-    c_node.outputdir = dname
-    c_node.options   = self.options
-
-    self.create_task('idl', node, [c_node, h1_node, h2_node, s_node, cli_node, cli_h_node, py_node])
-
-    # reinject the c node to the list of nodes to process
-    self.allnodes.append(c_node)
-
-
 
 
 ################################################################################
diff --git a/buildtools/wafsamba/samba_pidl.py b/buildtools/wafsamba/samba_pidl.py
new file mode 100644 (file)
index 0000000..d239bb0
--- /dev/null
@@ -0,0 +1,53 @@
+# waf build tool for building IDL files with pidl
+
+from TaskGen import taskgen, before
+import Build, os, string
+from samba_utils import *
+
+def SAMBA_PIDL(bld, directory, source, options=''):
+    '''Build a IDL file using pidl.
+       This will produce 7 output files'''
+
+    name = os.path.basename(string.replace(source, '.idl', ''))
+    name = "PIDL_%s" % name.upper()
+
+    if not SET_TARGET_TYPE(bld, name, 'PIDL'):
+        return
+
+    bld.SET_BUILD_GROUP('build_source')
+    t = bld(name=name, source=source, options=options)
+    t.mappings['.idl'] = process_pidl
+    t.env.PIDL = "../../pidl/pidl"
+    t.env.PIDL_BUILD_TYPES = '--header --ndr-parser --client --python --server'.split()
+    t.env.OPTIONS = options
+
+Build.BuildContext.SAMBA_PIDL = SAMBA_PIDL
+
+
+@taskgen
+def process_pidl(self, node, options=''):
+    '''Generate the list of output nodes for a given input IDL
+       file, and create the task to build them'''
+    bname       = node.file_base()
+    # the output of pidl needs to go in the gen_ndr directory
+    gen_ndr_dir = "../gen_ndr/"
+    c_node     = NEW_NODE(node, gen_ndr_dir + 'ndr_%s.c' % bname)
+    h1_node    = NEW_NODE(node, gen_ndr_dir + '%s.h' % bname)
+    h2_node    = NEW_NODE(node, gen_ndr_dir + 'ndr_%s.h' % bname)
+    s_node     = NEW_NODE(node, gen_ndr_dir + 'ndr_%s_s.c' % bname)
+    cli_node   = NEW_NODE(node, gen_ndr_dir + 'ndr_%s_c.c' % bname)
+    cli_h_node = NEW_NODE(node, gen_ndr_dir + 'ndr_%s_c.h' % bname)
+    py_node    = NEW_NODE(node, gen_ndr_dir + 'py_%s.c' % bname)
+    t = self.create_task('pidl', node, [c_node, h1_node, h2_node, s_node,
+                                        cli_node, cli_h_node, py_node])
+    # setup ${OUTPUTDIR} in the pidl rule, and make sure it exists
+    t.env.OUTPUTDIR = os.path.dirname(c_node.abspath(self.env))
+    if not os.path.isdir(t.env.OUTPUTDIR):
+        os.mkdir(t.env.OUTPUTDIR, 0777)
+
+
+# the pidl task itself
+import Task
+Task.simple_task_type('pidl',
+                      '${PIDL} ${PIDL_BUILD_TYPES} ${OPTIONS} --outputdir ${OUTPUTDIR} -- ${SRC}',
+                      color='BLUE', before='cc', shell=False)
index 412fbe38a7b97c636e20398ae199753c36df3a93..0c8a832c70c1435497de2c51131601b45b046cf9 100644 (file)
@@ -2,12 +2,47 @@
 # and for SAMBA_ macros for building libraries, binaries etc
 
 import Build, os, Logs, sys, Configure, Options, string, Task, Utils, optparse
+from TaskGen import feature, before
 from Configure import conf
 from Logs import debug
 from TaskGen import extension
 
 LIB_PATH="shared"
 
+
+##########################################################
+# create a node with a new name, based on an existing node
+def NEW_NODE(node, name):
+    ret = node.parent.find_or_declare([name])
+    ASSERT(node, ret is not None, "Unable to find new target with name '%s' from '%s'" % (
+            name, node.name))
+    return ret
+
+
+#############################################################
+# set a value in a local cache
+# return False if it's already set
+def SET_TARGET_TYPE(ctx, target, value):
+    cache = LOCAL_CACHE(ctx, 'TARGET_TYPE')
+    if target in cache:
+        ASSERT(ctx, cache[target] == value,
+               "Target '%s' re-defined as %s - was %s" % (target, value, cache[target]))
+        debug("task_gen: Skipping duplicate target %s (curdir=%s)" % (target, ctx.curdir))
+        return False
+    assumed = LOCAL_CACHE(ctx, 'ASSUMED_TARGET')
+    if target in assumed:
+        #if assumed[target] != value:
+        #    print "Target '%s' was assumed of type '%s' but is '%s'" % (target, assumed[target], value)
+        ASSERT(ctx, assumed[target] == value,
+               "Target '%s' was assumed of type '%s' but is '%s'" % (target, assumed[target], value))
+    predeclared = LOCAL_CACHE(ctx, 'PREDECLARED_TARGET')
+    if target in predeclared:
+        ASSERT(ctx, predeclared[target] == value,
+               "Target '%s' was predeclared of type '%s' but is '%s'" % (target, predeclared[target], value))
+    LOCAL_CACHE_SET(ctx, 'TARGET_TYPE', target, value)
+    debug("task_gen: Target '%s' created of type '%s' in %s" % (target, value, ctx.curdir))
+    return True
+
 ######################################################
 # this is used as a decorator to make functions only
 # run once. Based on the idea from
@@ -122,6 +157,19 @@ def ADD_COMMAND(opt, name, function):
 Options.Handler.ADD_COMMAND = ADD_COMMAND
 
 
+@feature('cprogram cc')
+@before('apply_core')
+def process_depends_on(self):
+    '''The new depends_on attribute for build rules
+       allow us to specify a dependency on output from
+       a source generation rule'''
+    if getattr(self , 'depends_on', None):
+        lst = self.to_list(self.depends_on)
+        for x in lst:
+            y = self.bld.name_to_obj(x, self.env)
+            y.post()
+
+
 #import TaskGen, Task
 #
 #old_post_run = Task.Task.post_run
index a33d5d4ada77f2b46559bee91edae417e9db0f1b..76bc3ba0117ea84d7a9f47cb49c7fde417634b3f 100644 (file)
@@ -10,35 +10,11 @@ from TaskGen import extension
 from samba_utils import *
 from samba_autoconf import *
 from samba_patterns import *
+from samba_pidl import *
 
 LIB_PATH="shared"
 
 
-#############################################################
-# set a value in a local cache
-# return False if it's already set
-def SET_TARGET_TYPE(ctx, target, value):
-    cache = LOCAL_CACHE(ctx, 'TARGET_TYPE')
-    if target in cache:
-        ASSERT(ctx, cache[target] == value,
-               "Target '%s' re-defined as %s - was %s" % (target, value, cache[target]))
-        debug("task_gen: Skipping duplicate target %s (curdir=%s)" % (target, ctx.curdir))
-        return False
-    assumed = LOCAL_CACHE(ctx, 'ASSUMED_TARGET')
-    if target in assumed:
-        #if assumed[target] != value:
-        #    print "Target '%s' was assumed of type '%s' but is '%s'" % (target, assumed[target], value)
-        ASSERT(ctx, assumed[target] == value,
-               "Target '%s' was assumed of type '%s' but is '%s'" % (target, assumed[target], value))
-    predeclared = LOCAL_CACHE(ctx, 'PREDECLARED_TARGET')
-    if target in predeclared:
-        ASSERT(ctx, predeclared[target] == value,
-               "Target '%s' was predeclared of type '%s' but is '%s'" % (target, predeclared[target], value))
-    LOCAL_CACHE_SET(ctx, 'TARGET_TYPE', target, value)
-    debug("task_gen: Target '%s' created of type '%s' in %s" % (target, value, ctx.curdir))
-    return True
-
-
 #################################################################
 # create the samba build environment
 @conf
@@ -131,7 +107,7 @@ def ADD_DEPENDENCIES(bld, name, deps):
             CHECK_TARGET_DEPENDENCY(bld, name)
             list2.append(d)
         except AssertionError:
-            debug("deps: Removing dependency %s from target %s" % (d, name))
+            sys.stderr.write("Removing dependency %s from target %s" % (d, name))
             del(lib_deps[name][d])
 
     # extract out the system dependencies
@@ -357,23 +333,6 @@ def SAMBA_ERRTABLE(bld, name, source,
     )
 Build.BuildContext.SAMBA_ERRTABLE = SAMBA_ERRTABLE
 
-#################################################################
-# define a PIDL target
-def SAMBA_PIDL(bld, directory, source, options=''):
-    name = os.path.basename(string.replace(source, '.idl', ''))
-    name = "%s/ndr_%s.o" % (directory, name)
-
-    if not SET_TARGET_TYPE(bld, name, 'PIDL'):
-        return
-
-    bld.SET_BUILD_GROUP('build_source')
-    bld(
-        features = 'cc',
-        source   = source,
-        target   = name,
-        options  = options
-    )
-Build.BuildContext.SAMBA_PIDL = SAMBA_PIDL