2010-02-20 16:24:28 +03:00
# a waf tool to add autoconf-like macros to the configure section
2010-02-20 16:40:26 +03:00
# and for SAMBA_ macros for building libraries, binaries etc
2010-02-20 16:24:28 +03:00
2010-03-17 12:12:16 +03:00
import Build , os , Options , Task , Utils
2010-02-20 16:24:28 +03:00
from Configure import conf
2010-03-17 12:21:47 +03:00
from Logs import debug
2010-02-20 16:24:28 +03:00
2010-02-26 14:21:50 +03:00
# bring in the other samba modules
from samba_utils import *
from samba_autoconf import *
2010-02-26 14:38:38 +03:00
from samba_patterns import *
2010-02-28 09:34:43 +03:00
from samba_pidl import *
2010-03-17 12:12:16 +03:00
from samba_errtable import *
2010-03-17 13:53:29 +03:00
from samba_asn1 import *
from samba_autoproto import *
2010-03-20 08:27:48 +03:00
from samba_python import *
from samba_deps import *
2010-02-23 04:18:04 +03:00
2010-02-26 14:21:50 +03:00
LIB_PATH = " shared "
2010-02-23 04:18:04 +03:00
2010-03-17 12:21:47 +03:00
2010-03-17 12:12:16 +03:00
2010-03-17 12:32:15 +03:00
#################################################################
# create the samba build environment
2010-02-22 03:59:06 +03:00
@conf
def SAMBA_BUILD_ENV ( conf ) :
2010-03-17 12:21:47 +03:00
conf . env [ ' BUILD_DIRECTORY ' ] = conf . blddir
2010-03-17 12:12:16 +03:00
mkdir_p ( os . path . join ( conf . blddir , LIB_PATH ) )
mkdir_p ( os . path . join ( conf . blddir , ' python/samba/dcerpc ' ) )
2010-03-16 08:41:14 +03:00
# this allows all of the bin/shared and bin/python targets
# to be expressed in terms of build directory paths
os . symlink ( ' ../python ' , os . path . join ( conf . blddir , ' default/python ' ) )
os . symlink ( ' ../shared ' , os . path . join ( conf . blddir , ' default/shared ' ) )
2010-03-17 12:12:16 +03:00
2010-03-17 12:32:15 +03:00
2010-03-17 12:26:03 +03:00
################################################################
# add an init_function to the list for a subsystem
2010-03-17 12:12:16 +03:00
def ADD_INIT_FUNCTION ( bld , subsystem , target , init_function ) :
2010-03-17 12:26:03 +03:00
if init_function is None :
return
bld . ASSERT ( subsystem is not None , " You must specify a subsystem for init_function ' %s ' " % init_function )
2010-02-23 11:23:18 +03:00
cache = LOCAL_CACHE ( bld , ' INIT_FUNCTIONS ' )
2010-02-23 04:18:04 +03:00
if not subsystem in cache :
2010-03-20 08:27:48 +03:00
cache [ subsystem ] = [ ]
2010-03-17 12:12:16 +03:00
cache [ subsystem ] . append ( { ' TARGET ' : target , ' INIT_FUNCTION ' : init_function } )
2010-03-17 12:26:03 +03:00
Build . BuildContext . ADD_INIT_FUNCTION = ADD_INIT_FUNCTION
2010-02-20 16:24:28 +03:00
#################################################################
# define a Samba library
2010-03-01 01:01:48 +03:00
def SAMBA_LIBRARY ( bld , libname , source ,
2010-02-23 00:04:00 +03:00
deps = ' ' ,
public_deps = ' ' ,
2010-03-20 08:27:48 +03:00
includes = ' ' ,
2010-02-23 03:17:06 +03:00
public_headers = None ,
2010-02-23 00:04:00 +03:00
vnum = None ,
2010-02-24 09:38:12 +03:00
cflags = ' ' ,
2010-03-17 12:12:16 +03:00
external_library = False ,
2010-02-26 14:25:31 +03:00
realname = None ,
2010-03-17 13:46:38 +03:00
autoproto = None ,
2010-03-17 13:53:29 +03:00
group = ' main ' ,
2010-03-20 08:27:48 +03:00
depends_on = ' ' ,
local_include = True ) :
2010-02-23 06:43:06 +03:00
2010-02-23 08:48:38 +03:00
# remember empty libraries, so we can strip the dependencies
2010-03-01 01:01:48 +03:00
if ( source == ' ' ) or ( source == [ ] ) :
2010-03-20 08:27:48 +03:00
SET_TARGET_TYPE ( bld , libname , ' EMPTY ' )
2010-02-23 08:48:38 +03:00
return
2010-03-20 08:27:48 +03:00
if not SET_TARGET_TYPE ( bld , libname , ' LIBRARY ' ) :
return
2010-03-17 13:53:29 +03:00
2010-03-20 08:27:48 +03:00
deps + = ' ' + public_deps
2010-03-09 00:17:43 +03:00
2010-03-17 13:53:29 +03:00
# this print below should show that we're runnig this code
2010-03-20 08:27:48 +03:00
bld . SET_BUILD_GROUP ( group )
2010-03-17 13:53:29 +03:00
t = bld (
2010-03-20 08:27:48 +03:00
features = ' cc cshlib symlink_lib ' ,
source = source ,
target = libname ,
2010-03-17 12:12:16 +03:00
samba_cflags = CURRENT_CFLAGS ( bld , libname , cflags ) ,
2010-03-20 08:27:48 +03:00
depends_on = depends_on ,
samba_deps = TO_LIST ( deps ) ,
samba_includes = includes ,
local_include = local_include ,
vnum = vnum
2010-03-17 12:32:15 +03:00
)
2010-03-20 08:27:48 +03:00
if autoproto is not None :
bld . SAMBA_AUTOPROTO ( autoproto , source )
2010-02-23 05:04:34 +03:00
2010-02-20 16:24:28 +03:00
Build . BuildContext . SAMBA_LIBRARY = SAMBA_LIBRARY
#################################################################
# define a Samba binary
2010-03-01 01:01:48 +03:00
def SAMBA_BINARY ( bld , binname , source ,
2010-02-23 00:04:00 +03:00
deps = ' ' ,
2010-03-17 13:53:29 +03:00
includes = ' ' ,
2010-02-23 03:17:06 +03:00
public_headers = None ,
2010-02-23 00:04:00 +03:00
modules = None ,
installdir = None ,
ldflags = None ,
2010-02-24 09:39:23 +03:00
cflags = ' ' ,
2010-02-23 01:04:44 +03:00
autoproto = None ,
2010-02-23 08:26:59 +03:00
use_hostcc = None ,
compiler = None ,
2010-03-17 12:12:16 +03:00
group = ' binaries ' ,
2010-03-20 08:27:48 +03:00
manpages = None ,
local_include = True ,
2010-03-17 12:12:16 +03:00
subsystem_name = None ,
2010-03-20 08:27:48 +03:00
needs_python = False ) :
2010-03-17 12:26:03 +03:00
2010-03-17 12:21:47 +03:00
if not SET_TARGET_TYPE ( bld , binname , ' BINARY ' ) :
return
2010-02-23 11:04:40 +03:00
2010-03-20 08:27:48 +03:00
features = ' cc cprogram copy_bin '
if needs_python :
features + = ' pyembed '
2010-03-09 00:17:43 +03:00
2010-02-24 09:39:23 +03:00
bld . SET_BUILD_GROUP ( group )
2010-02-20 16:24:28 +03:00
bld (
2010-03-20 08:27:48 +03:00
features = features ,
source = source ,
target = binname ,
2010-03-17 12:12:16 +03:00
samba_cflags = CURRENT_CFLAGS ( bld , binname , cflags ) ,
2010-03-20 08:27:48 +03:00
samba_deps = TO_LIST ( deps ) ,
samba_includes = includes ,
local_include = local_include ,
samba_modules = modules ,
top = True ,
2010-03-17 12:12:16 +03:00
samba_subsystem = subsystem_name
2010-03-20 08:27:48 +03:00
)
2010-02-23 06:43:06 +03:00
2010-03-17 12:12:16 +03:00
# 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 )
2010-03-20 08:27:48 +03:00
if autoproto is not None :
bld . SAMBA_AUTOPROTO ( autoproto , source )
Build . BuildContext . SAMBA_BINARY = SAMBA_BINARY
2010-02-23 05:04:34 +03:00
2010-02-23 00:04:00 +03:00
2010-03-17 12:26:03 +03:00
#################################################################
# define a Samba module.
2010-03-01 01:01:48 +03:00
def SAMBA_MODULE ( bld , modname , source ,
2010-02-23 00:04:00 +03:00
deps = ' ' ,
2010-03-20 08:27:48 +03:00
includes = ' ' ,
2010-03-17 12:26:03 +03:00
subsystem = None ,
init_function = None ,
2010-02-23 00:04:00 +03:00
autoproto = None ,
2010-03-20 08:27:48 +03:00
autoproto_extra_source = ' ' ,
2010-02-23 00:04:00 +03:00
aliases = None ,
2010-02-24 09:39:23 +03:00
cflags = ' ' ,
2010-03-17 12:12:16 +03:00
internal_module = True ,
2010-03-20 08:27:48 +03:00
local_include = True ,
enabled = True ) :
2010-03-17 12:12:16 +03:00
if internal_module :
# treat internal modules as subsystems for now
2010-03-20 08:27:48 +03:00
SAMBA_SUBSYSTEM ( bld , modname , source ,
deps = deps ,
includes = includes ,
autoproto = autoproto ,
autoproto_extra_source = autoproto_extra_source ,
cflags = cflags ,
local_include = local_include ,
enabled = enabled )
# even though we're treating it as a subsystem, we need to
# add it to the init_function list
# TODO: we should also create an implicit dependency
# between the subsystem target and this target
2010-03-17 12:12:16 +03:00
if enabled :
bld . ADD_INIT_FUNCTION ( subsystem , modname , init_function )
2010-03-20 08:27:48 +03:00
return
2010-03-17 12:21:47 +03:00
2010-03-20 08:27:48 +03:00
if not enabled :
SET_TARGET_TYPE ( bld , modname , ' DISABLED ' )
2010-03-17 12:21:47 +03:00
return
# remember empty modules, so we can strip the dependencies
2010-03-01 01:01:48 +03:00
if ( source == ' ' ) or ( source == [ ] ) :
2010-03-20 08:27:48 +03:00
SET_TARGET_TYPE ( bld , modname , ' EMPTY ' )
2010-03-17 12:21:47 +03:00
return
2010-03-20 08:27:48 +03:00
if not SET_TARGET_TYPE ( bld , modname , ' MODULE ' ) :
return
2010-03-17 12:12:16 +03:00
bld . ADD_INIT_FUNCTION ( subsystem , modname , init_function )
2010-03-20 08:27:48 +03:00
if subsystem is not None :
deps + = ' ' + subsystem
2010-03-17 12:21:47 +03:00
2010-02-24 09:39:23 +03:00
bld . SET_BUILD_GROUP ( ' main ' )
2010-03-17 12:21:47 +03:00
bld (
2010-03-20 08:27:48 +03:00
features = ' cc ' ,
source = source ,
target = modname ,
2010-03-17 12:12:16 +03:00
samba_cflags = CURRENT_CFLAGS ( bld , modname , cflags ) ,
2010-03-20 08:27:48 +03:00
samba_includes = includes ,
local_include = local_include ,
samba_deps = TO_LIST ( deps )
)
if autoproto is not None :
bld . SAMBA_AUTOPROTO ( autoproto , source + ' ' + autoproto_extra_source )
2010-03-17 12:26:03 +03:00
Build . BuildContext . SAMBA_MODULE = SAMBA_MODULE
2010-03-17 12:21:47 +03:00
2010-03-17 12:26:03 +03:00
#################################################################
# define a Samba subsystem
2010-03-01 01:01:48 +03:00
def SAMBA_SUBSYSTEM ( bld , modname , source ,
2010-02-23 00:04:00 +03:00
deps = ' ' ,
public_deps = ' ' ,
2010-03-20 08:27:48 +03:00
includes = ' ' ,
2010-02-23 03:17:06 +03:00
public_headers = None ,
2010-02-24 09:38:12 +03:00
cflags = ' ' ,
group = ' main ' ,
config_option = None ,
2010-03-17 13:46:38 +03:00
init_function_sentinal = None ,
2010-03-17 13:53:29 +03:00
heimdal_autoproto = None ,
2010-03-20 08:27:48 +03:00
heimdal_autoproto_options = None ,
2010-03-17 13:53:29 +03:00
heimdal_autoproto_private = None ,
autoproto = None ,
2010-03-20 08:27:48 +03:00
autoproto_extra_source = ' ' ,
depends_on = ' ' ,
local_include = True ,
local_include_first = True ,
2010-03-17 12:12:16 +03:00
subsystem_name = None ,
enabled = True ,
needs_python = False ) :
2010-03-20 08:27:48 +03:00
if not enabled :
SET_TARGET_TYPE ( bld , modname , ' DISABLED ' )
2010-03-17 12:21:47 +03:00
return
# remember empty subsystems, so we can strip the dependencies
2010-03-01 01:01:48 +03:00
if ( source == ' ' ) or ( source == [ ] ) :
2010-03-20 08:27:48 +03:00
SET_TARGET_TYPE ( bld , modname , ' EMPTY ' )
return
if not SET_TARGET_TYPE ( bld , modname , ' SUBSYSTEM ' ) :
2010-03-17 12:21:47 +03:00
return
2010-03-20 08:27:48 +03:00
deps + = ' ' + public_deps
2010-03-17 12:21:47 +03:00
2010-02-24 09:39:23 +03:00
bld . SET_BUILD_GROUP ( group )
2010-03-20 08:27:48 +03:00
2010-03-17 12:12:16 +03:00
features = ' cc '
if needs_python :
features + = ' pyext '
2010-03-17 13:46:38 +03:00
t = bld (
2010-03-17 12:12:16 +03:00
features = features ,
2010-03-20 08:27:48 +03:00
source = source ,
target = modname ,
2010-03-17 12:12:16 +03:00
samba_cflags = CURRENT_CFLAGS ( bld , modname , cflags ) ,
2010-03-20 08:27:48 +03:00
depends_on = depends_on ,
samba_deps = TO_LIST ( deps ) ,
samba_includes = includes ,
local_include = local_include ,
2010-03-17 12:12:16 +03:00
local_include_first = local_include_first ,
samba_subsystem = subsystem_name
2010-03-20 08:27:48 +03:00
)
2010-03-17 13:53:29 +03:00
if heimdal_autoproto is not None :
2010-03-20 08:27:48 +03:00
bld . HEIMDAL_AUTOPROTO ( heimdal_autoproto , source , options = heimdal_autoproto_options )
2010-03-17 13:53:29 +03:00
if heimdal_autoproto_private is not None :
bld . HEIMDAL_AUTOPROTO_PRIVATE ( heimdal_autoproto_private , source )
if autoproto is not None :
2010-03-20 08:27:48 +03:00
bld . SAMBA_AUTOPROTO ( autoproto , source + ' ' + autoproto_extra_source )
2010-03-17 13:46:38 +03:00
return t
2010-03-17 13:53:29 +03:00
2010-03-17 12:26:03 +03:00
Build . BuildContext . SAMBA_SUBSYSTEM = SAMBA_SUBSYSTEM
2010-03-20 08:27:48 +03:00
def SAMBA_GENERATOR ( bld , name , rule , source , target ,
group = ' build_source ' ) :
''' A generic source generator target '''
if not SET_TARGET_TYPE ( bld , name , ' GENERATOR ' ) :
return
bld . SET_BUILD_GROUP ( group )
bld (
rule = rule ,
source = source ,
target = target ,
before = ' cc ' ,
ext_out = ' .c ' )
Build . BuildContext . SAMBA_GENERATOR = SAMBA_GENERATOR
2010-02-23 03:16:44 +03:00
###############################################################
# add a new set of build rules from a subdirectory
2010-02-23 03:55:28 +03:00
# the @runonce decorator ensures we don't end up
# with duplicate rules
2010-02-23 03:16:44 +03:00
def BUILD_SUBDIR ( bld , dir ) :
2010-03-17 12:21:47 +03:00
path = os . path . normpath ( bld . curdir + ' / ' + dir )
cache = LOCAL_CACHE ( bld , ' SUBDIR_LIST ' )
if path in cache : return
cache [ path ] = True
debug ( " build: Processing subdirectory %s " % dir )
2010-02-23 03:16:44 +03:00
bld . add_subdirs ( dir )
2010-03-17 12:21:47 +03:00
2010-02-23 03:16:44 +03:00
Build . BuildContext . BUILD_SUBDIR = BUILD_SUBDIR
2010-03-17 12:38:03 +03:00
##########################################################
# 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
2010-02-24 09:39:23 +03:00
###########################################################
# setup build groups used to ensure that the different build
# phases happen consecutively
@runonce
def SETUP_BUILD_GROUPS ( bld ) :
2010-03-17 13:53:29 +03:00
bld . p_ln = bld . srcnode # we do want to see all targets!
2010-02-24 09:39:23 +03:00
bld . env [ ' USING_BUILD_GROUPS ' ] = True
bld . add_group ( ' setup ' )
2010-03-17 13:53:29 +03:00
bld . add_group ( ' base_libraries ' )
2010-02-24 09:39:23 +03:00
bld . add_group ( ' build_compilers ' )
bld . add_group ( ' build_source ' )
bld . add_group ( ' prototypes ' )
bld . add_group ( ' main ' )
2010-03-17 12:12:16 +03:00
bld . add_group ( ' binaries ' )
2010-02-24 09:39:23 +03:00
bld . add_group ( ' final ' )
Build . BuildContext . SETUP_BUILD_GROUPS = SETUP_BUILD_GROUPS
###########################################################
# set the current build group
def SET_BUILD_GROUP ( bld , group ) :
if not ' USING_BUILD_GROUPS ' in bld . env :
return
bld . set_group ( group )
Build . BuildContext . SET_BUILD_GROUP = SET_BUILD_GROUP
2010-03-17 12:38:03 +03:00
2010-03-20 08:27:48 +03:00
def h_file ( filename ) :
import stat
st = os . stat ( filename )
if stat . S_ISDIR ( st [ stat . ST_MODE ] ) : raise IOError ( ' not a file ' )
m = Utils . md5 ( )
m . update ( str ( st . st_mtime ) )
m . update ( str ( st . st_size ) )
m . update ( filename )
return m . digest ( )
@conf
def ENABLE_TIMESTAMP_DEPENDENCIES ( conf ) :
Utils . h_file = h_file
2010-03-17 12:12:16 +03:00
##############################
# 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