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-29 09:59:13 +04:00
import Build , os , Options , Task , Utils , cc , TaskGen , fnmatch , re , shutil , Logs
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-03-19 11:49:59 +03:00
from samba_utils import SUBST_VARS_RECURSIVE
2010-02-20 16:24:28 +03:00
2010-02-26 14:21:50 +03:00
# bring in the other samba modules
2010-03-19 10:07:39 +03:00
from samba_optimisation import *
2010-02-26 14:21:50 +03:00
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-03-28 07:09:36 +04:00
from samba_bundled import *
2010-03-25 01:56:57 +03:00
import samba_conftests
2010-04-01 10:24:02 +04:00
# some systems have broken threading in python
if os . environ . get ( ' WAF_NOTHREADS ' ) == ' 1 ' :
import nothreads
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-22 08:37:47 +03:00
os . putenv ( ' PYTHONUNBUFFERED ' , ' 1 ' )
2010-03-17 12:12:16 +03:00
2010-02-22 03:59:06 +03:00
@conf
def SAMBA_BUILD_ENV ( conf ) :
2010-03-28 15:01:04 +04:00
''' create the samba build environment '''
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
2010-03-17 00:50:49 +03:00
for p in [ ' python ' , ' shared ' ] :
link_target = os . path . join ( conf . blddir , ' default/ ' + p )
if not os . path . lexists ( link_target ) :
os . symlink ( ' ../ ' + p , link_target )
2010-03-27 08:47:43 +03:00
# get perl to put the blib files in the build directory
blib_bld = os . path . join ( conf . blddir , ' default/pidl/blib ' )
blib_src = os . path . join ( conf . srcdir , ' pidl/blib ' )
mkdir_p ( blib_bld + ' /man1 ' )
mkdir_p ( blib_bld + ' /man3 ' )
2010-03-29 08:19:13 +04:00
if os . path . islink ( blib_src ) :
os . unlink ( blib_src )
2010-03-29 15:32:03 +04:00
elif os . path . exists ( blib_src ) :
2010-03-29 08:19:13 +04:00
shutil . rmtree ( blib_src )
os . symlink ( blib_bld , blib_src )
2010-03-27 08:47:43 +03:00
2010-03-17 12:12:16 +03:00
2010-03-17 12:32:15 +03:00
2010-03-17 12:12:16 +03:00
def ADD_INIT_FUNCTION ( bld , subsystem , target , init_function ) :
2010-03-28 15:01:04 +04:00
''' add an init_function to the list for a subsystem '''
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
2010-03-28 15:01:04 +04:00
2010-02-20 16:24:28 +03:00
#################################################################
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-03-27 01:46:50 +03:00
header_path = None ,
2010-03-27 10:14:06 +03:00
pc_files = 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 = ' ' ,
2010-03-18 15:47:48 +03:00
local_include = True ,
2010-03-25 01:23:10 +03:00
vars = None ,
2010-03-18 15:47:48 +03:00
install_path = None ,
install = True ,
2010-03-29 08:19:13 +04:00
needs_python = False ,
target_type = ' LIBRARY ' ,
2010-03-28 07:09:36 +04:00
bundled_extension = True ,
2010-03-29 08:19:13 +04:00
link_name = None ,
2010-03-18 15:47:48 +03:00
enabled = True ) :
2010-03-28 15:01:04 +04:00
''' define a Samba library '''
2010-03-18 15:47:48 +03:00
if not enabled :
SET_TARGET_TYPE ( bld , libname , ' DISABLED ' )
return
2010-02-23 06:43:06 +03:00
2010-03-25 01:23:10 +03:00
source = bld . EXPAND_VARIABLES ( source , vars = vars )
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-30 15:28:30 +04:00
if target_type != ' PYTHON ' and BUILTIN_LIBRARY ( bld , libname ) :
2010-03-21 03:04:57 +03:00
obj_target = libname
else :
obj_target = libname + ' .objlist '
2010-03-18 15:47:48 +03:00
# first create a target for building the object files for this library
# by separating in this way, we avoid recompiling the C files
# separately for the install library and the build library
bld . SAMBA_SUBSYSTEM ( obj_target ,
source = source ,
deps = deps ,
public_deps = public_deps ,
includes = includes ,
public_headers = public_headers ,
2010-03-27 01:46:50 +03:00
header_path = header_path ,
2010-03-18 15:47:48 +03:00
cflags = cflags ,
group = group ,
autoproto = autoproto ,
depends_on = depends_on ,
2010-03-29 08:19:13 +04:00
needs_python = needs_python ,
2010-03-18 15:47:48 +03:00
local_include = local_include )
2010-03-30 15:28:30 +04:00
if libname == obj_target :
2010-03-21 03:04:57 +03:00
return
2010-03-29 08:19:13 +04:00
if not SET_TARGET_TYPE ( bld , libname , target_type ) :
2010-03-21 03:04:57 +03:00
return
2010-03-18 15:47:48 +03:00
# the library itself will depend on that object target
2010-03-20 08:27:48 +03:00
deps + = ' ' + public_deps
2010-03-18 15:47:48 +03:00
deps = TO_LIST ( deps )
deps . append ( obj_target )
2010-03-09 00:17:43 +03:00
2010-04-01 05:30:56 +04:00
if target_type == ' PYTHON ' :
2010-03-29 08:19:13 +04:00
bundled_name = libname
else :
bundled_name = BUNDLED_NAME ( bld , libname , bundled_extension )
features = ' cc cshlib '
2010-04-01 05:30:56 +04:00
if target_type == ' PYTHON ' :
2010-03-29 08:19:13 +04:00
features + = ' pyext '
2010-04-01 05:30:56 +04:00
elif needs_python :
features + = ' pyembed '
2010-03-28 07:09:36 +04:00
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-29 08:19:13 +04:00
features = features + ' symlink_lib ' ,
2010-03-18 15:47:48 +03:00
source = [ ] ,
2010-03-28 07:09:36 +04:00
target = bundled_name ,
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 ,
2010-03-18 15:47:48 +03:00
samba_deps = deps ,
2010-03-20 08:27:48 +03:00
samba_includes = includes ,
local_include = local_include ,
2010-03-18 15:47:48 +03:00
vnum = vnum ,
2010-03-23 17:00:48 +03:00
install_path = None ,
2010-03-28 07:09:36 +04:00
ldflags = build_rpath ( bld ) ,
name = libname
2010-03-17 12:32:15 +03:00
)
2010-03-18 15:47:48 +03:00
2010-03-29 08:19:13 +04:00
if link_name :
t . link_name = link_name
2010-03-22 08:57:05 +03:00
# we don't need the double libraries if rpath is off
if ( bld . env . RPATH_ON_INSTALL == False and
bld . env . RPATH_ON_BUILD == False ) :
2010-03-28 07:09:36 +04:00
install_target = bundled_name
2010-03-22 08:57:05 +03:00
else :
2010-03-28 07:09:36 +04:00
install_target = bundled_name + ' .inst '
2010-04-01 02:49:46 +04:00
if install :
t . install_target = install_target
if install_path is None :
install_path = ' $ {LIBDIR} '
install_path = SUBST_VARS_RECURSIVE ( install_path , bld . env )
2010-03-22 08:57:05 +03:00
2010-04-01 05:30:56 +04:00
if Options . is_install and install and install_target != bundled_name :
2010-03-18 15:47:48 +03:00
# create a separate install library, which may have
# different rpath settings
t = bld (
2010-03-29 08:19:13 +04:00
features = features ,
2010-03-18 15:47:48 +03:00
source = [ ] ,
2010-03-22 08:57:05 +03:00
target = install_target ,
2010-03-18 15:47:48 +03:00
samba_cflags = CURRENT_CFLAGS ( bld , libname , cflags ) ,
depends_on = depends_on ,
samba_deps = deps ,
samba_includes = includes ,
local_include = local_include ,
vnum = vnum ,
2010-03-28 07:09:36 +04:00
install_as = bundled_name ,
2010-03-18 15:47:48 +03:00
install_path = None ,
2010-03-23 17:00:48 +03:00
ldflags = install_rpath ( bld )
2010-03-18 15:47:48 +03:00
)
2010-04-01 05:30:56 +04:00
if Options . is_install and install :
2010-03-29 08:19:13 +04:00
if realname :
install_name = realname
install_link = None
2010-03-30 08:32:06 +04:00
inst_name = install_target + ' .so '
2010-03-29 08:19:13 +04:00
elif vnum :
2010-03-18 15:47:48 +03:00
vnum_base = vnum . split ( ' . ' ) [ 0 ]
2010-03-28 07:09:36 +04:00
install_name = ' lib %s .so. %s ' % ( bundled_name , vnum )
install_link = ' lib %s .so. %s ' % ( bundled_name , vnum_base )
2010-03-30 08:32:06 +04:00
inst_name = ' lib %s .so ' % install_target
2010-03-18 15:47:48 +03:00
else :
2010-03-28 07:09:36 +04:00
install_name = ' lib %s .so ' % bundled_name
2010-03-18 15:47:48 +03:00
install_link = None
2010-03-30 08:32:06 +04:00
inst_name = ' lib %s .so ' % install_target
2010-03-18 15:47:48 +03:00
2010-03-29 08:19:13 +04:00
bld . install_as ( os . path . join ( install_path , install_name ) , inst_name )
2010-03-18 15:47:48 +03:00
if install_link :
bld . symlink_as ( os . path . join ( install_path , install_link ) , install_name )
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-03-27 01:46:50 +03:00
if public_headers is not None :
bld . PUBLIC_HEADERS ( public_headers , header_path = header_path )
2010-03-27 10:14:06 +03:00
if pc_files is not None :
2010-03-29 08:27:54 +04:00
bld . PKG_CONFIG_FILES ( pc_files , vnum = vnum )
2010-03-27 10:14:06 +03:00
2010-02-20 16:24:28 +03:00
Build . BuildContext . SAMBA_LIBRARY = SAMBA_LIBRARY
2010-03-18 15:47:48 +03:00
2010-02-20 16:24:28 +03:00
#################################################################
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-03-27 01:46:50 +03:00
header_path = 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-18 15:47:48 +03:00
needs_python = False ,
2010-03-25 01:23:10 +03:00
vars = None ,
2010-03-18 15:47:48 +03:00
install = True ,
install_path = None ) :
2010-03-28 15:01:04 +04:00
''' define a Samba binary '''
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-18 15:47:48 +03:00
features = ' cc cprogram '
2010-03-20 08:27:48 +03:00
if needs_python :
features + = ' pyembed '
2010-03-09 00:17:43 +03:00
2010-03-18 15:47:48 +03:00
obj_target = binname + ' .objlist '
2010-03-25 01:23:10 +03:00
source = bld . EXPAND_VARIABLES ( source , vars = vars )
2010-03-18 15:47:48 +03:00
# 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
bld . SAMBA_SUBSYSTEM ( obj_target ,
source = source ,
deps = deps ,
includes = includes ,
cflags = cflags ,
group = group ,
autoproto = autoproto ,
subsystem_name = subsystem_name ,
needs_python = needs_python ,
local_include = local_include )
2010-03-30 13:21:21 +04:00
bld . SET_BUILD_GROUP ( group )
2010-03-18 15:47:48 +03:00
# the library itself will depend on that object target
deps = TO_LIST ( deps )
deps . append ( obj_target )
2010-04-01 02:49:46 +04:00
t = bld (
2010-03-18 15:47:48 +03:00
features = features + ' symlink_bin ' ,
source = [ ] ,
2010-03-20 08:27:48 +03:00
target = binname ,
2010-03-17 12:12:16 +03:00
samba_cflags = CURRENT_CFLAGS ( bld , binname , cflags ) ,
2010-03-18 15:47:48 +03:00
samba_deps = deps ,
2010-03-20 08:27:48 +03:00
samba_includes = includes ,
local_include = local_include ,
samba_modules = modules ,
top = True ,
2010-03-18 15:47:48 +03:00
samba_subsystem = subsystem_name ,
2010-03-23 17:00:48 +03:00
install_path = None ,
ldflags = build_rpath ( bld )
2010-03-20 08:27:48 +03:00
)
2010-02-23 06:43:06 +03:00
2010-03-18 15:47:48 +03:00
if install_path is None :
2010-03-19 11:49:59 +03:00
install_path = ' $ {BINDIR} '
install_path = SUBST_VARS_RECURSIVE ( install_path , bld . env )
2010-03-18 15:47:48 +03:00
2010-03-22 08:57:05 +03:00
# we don't need the double binaries if rpath is off
if ( bld . env . RPATH_ON_INSTALL == False and
bld . env . RPATH_ON_BUILD == False ) :
install_target = binname
else :
install_target = binname + ' .inst '
2010-04-01 02:49:46 +04:00
if install :
t . install_target = install_target
2010-03-22 08:57:05 +03:00
2010-04-01 05:30:56 +04:00
if Options . is_install and install and install_target != binname :
2010-03-18 15:47:48 +03:00
# we create a separate 'install' binary, which
# will have different rpath settings
t = bld (
features = features ,
source = [ ] ,
2010-03-22 08:57:05 +03:00
target = install_target ,
2010-03-18 15:47:48 +03:00
samba_cflags = CURRENT_CFLAGS ( bld , binname , cflags ) ,
samba_deps = deps ,
samba_includes = includes ,
local_include = local_include ,
samba_modules = modules ,
top = True ,
samba_subsystem = subsystem_name ,
2010-03-23 17:00:48 +03:00
install_path = None ,
ldflags = install_rpath ( bld )
2010-03-18 15:47:48 +03:00
)
2010-04-01 05:30:56 +04:00
if Options . is_install and install :
2010-03-18 15:47:48 +03:00
bld . install_as ( os . path . join ( install_path , binname ) ,
2010-03-22 08:57:05 +03:00
install_target ,
2010-03-18 15:47:48 +03:00
chmod = 0755 )
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 )
2010-03-27 01:46:50 +03:00
if public_headers is not None :
bld . PUBLIC_HEADERS ( public_headers , header_path = header_path )
2010-03-20 08:27:48 +03:00
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
#################################################################
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 ,
2010-03-25 01:23:10 +03:00
vars = None ,
2010-03-20 08:27:48 +03:00
enabled = True ) :
2010-03-28 15:01:04 +04:00
''' define a Samba module. '''
2010-03-20 08:27:48 +03:00
2010-03-20 14:55:04 +03:00
# we add the init function regardless of whether the module
# is enabled or not, as we need to generate a null list if
# all disabled
bld . ADD_INIT_FUNCTION ( subsystem , modname , init_function )
2010-03-28 07:09:36 +04:00
if internal_module or BUILTIN_LIBRARY ( bld , modname ) :
2010-03-17 12:12:16 +03:00
# 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 )
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
2010-03-25 01:23:10 +03:00
source = bld . EXPAND_VARIABLES ( source , vars = vars )
2010-03-17 12:21:47 +03:00
# 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
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
#################################################################
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-03-27 01:46:50 +03:00
header_path = None ,
2010-02-24 09:38:12 +03:00
cflags = ' ' ,
2010-03-17 09:47:31 +03:00
cflags_end = None ,
2010-02-24 09:38:12 +03:00
group = ' main ' ,
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 ,
2010-03-25 01:23:10 +03:00
vars = None ,
2010-03-17 12:12:16 +03:00
needs_python = False ) :
2010-03-28 15:01:04 +04:00
''' define a Samba subsystem '''
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-25 01:23:10 +03:00
source = bld . EXPAND_VARIABLES ( source , vars = vars )
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
2010-03-17 09:47:31 +03:00
if cflags_end is not None :
t . samba_cflags . extend ( TO_LIST ( cflags_end ) )
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-27 01:46:50 +03:00
if public_headers is not None :
bld . PUBLIC_HEADERS ( public_headers , header_path = header_path )
2010-03-17 13:46:38 +03:00
return t
2010-03-17 13:53:29 +03:00
2010-03-27 01:46:50 +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 ,
2010-03-30 13:21:21 +04:00
group = ' generators ' , enabled = True ,
2010-03-27 05:55:38 +03:00
public_headers = None ,
header_path = None ,
2010-03-25 01:23:10 +03:00
vars = None ) :
2010-03-20 08:27:48 +03:00
''' A generic source generator target '''
if not SET_TARGET_TYPE ( bld , name , ' GENERATOR ' ) :
return
2010-03-21 05:13:53 +03:00
if not enabled :
2010-03-21 05:50:43 +03:00
return
2010-03-21 05:13:53 +03:00
2010-03-20 08:27:48 +03:00
bld . SET_BUILD_GROUP ( group )
2010-03-27 08:47:43 +03:00
t = bld (
2010-03-20 08:27:48 +03:00
rule = rule ,
2010-03-25 01:23:10 +03:00
source = bld . EXPAND_VARIABLES ( source , vars = vars ) ,
2010-03-20 08:27:48 +03:00
target = target ,
2010-03-27 12:00:01 +03:00
shell = isinstance ( rule , str ) ,
2010-03-24 14:10:24 +03:00
on_results = True ,
2010-03-20 08:27:48 +03:00
before = ' cc ' ,
2010-03-21 05:13:53 +03:00
ext_out = ' .c ' ,
name = name )
2010-03-27 05:55:38 +03:00
if public_headers is not None :
bld . PUBLIC_HEADERS ( public_headers , header_path = header_path )
2010-03-27 08:47:43 +03:00
return t
2010-03-20 08:27:48 +03:00
Build . BuildContext . SAMBA_GENERATOR = SAMBA_GENERATOR
2010-02-23 03:16:44 +03:00
def BUILD_SUBDIR ( bld , dir ) :
2010-03-28 15:01:04 +04:00
''' add a new set of build rules from a subdirectory '''
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 )
Build . BuildContext . BUILD_SUBDIR = BUILD_SUBDIR
2010-02-24 09:39:23 +03:00
@runonce
def SETUP_BUILD_GROUPS ( bld ) :
2010-03-28 15:01:04 +04:00
''' setup build groups used to ensure that the different build
phases happen consecutively '''
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-21 05:50:43 +03:00
bld . add_group ( ' build_compiler_source ' )
2010-03-17 13:53:29 +03:00
bld . add_group ( ' base_libraries ' )
2010-03-30 13:21:21 +04:00
bld . add_group ( ' generators ' )
bld . add_group ( ' compiler_prototypes ' )
bld . add_group ( ' compiler_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
def SET_BUILD_GROUP ( bld , group ) :
2010-03-28 15:01:04 +04:00
''' set the current build group '''
2010-02-24 09:39:23 +03:00
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
@conf
def ENABLE_TIMESTAMP_DEPENDENCIES ( conf ) :
2010-03-28 15:01:04 +04:00
""" use timestamps instead of file contents for deps
this currently doesn ' t work " " "
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 ( )
2010-03-20 08:27:48 +03:00
Utils . h_file = h_file
2010-03-17 12:12:16 +03:00
2010-03-28 15:01:04 +04:00
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
2010-03-25 06:21:22 +03:00
t = Task . simple_task_type ( ' symlink_lib ' , ' rm -f $ {LINK_TARGET} && ln -s $ {LINK_SOURCE} $ {LINK_TARGET} ' ,
shell = True , color = ' PINK ' , ext_in = ' .bin ' )
2010-03-17 12:12:16 +03:00
t . quiet = True
@feature ( ' symlink_lib ' )
@after ( ' apply_link ' )
def symlink_lib ( self ) :
2010-03-28 15:01:04 +04:00
''' symlink a shared lib '''
2010-03-17 12:12:16 +03:00
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 == ' ' :
2010-03-28 07:09:36 +04:00
link_target = ' %s /lib %s .so %s ' % ( LIB_PATH , self . target , soext )
2010-03-17 12:12:16 +03:00
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 )
2010-03-18 15:47:48 +03:00
2010-03-25 06:21:22 +03:00
t = Task . simple_task_type ( ' symlink_bin ' , ' rm -f $ {BIN_TARGET} && ln -s $ {SRC} $ {BIN_TARGET} ' ,
shell = True , color = ' PINK ' , ext_in = ' .bin ' )
2010-03-17 12:12:16 +03:00
t . quiet = True
2010-03-18 15:47:48 +03:00
@feature ( ' symlink_bin ' )
2010-03-17 12:12:16 +03:00
@after ( ' apply_link ' )
2010-03-18 15:47:48 +03:00
def symlink_bin ( self ) :
2010-03-28 15:01:04 +04:00
''' symlink a binary '''
2010-03-17 12:12:16 +03:00
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
2010-03-18 15:47:48 +03:00
tsk = self . create_task ( ' symlink_bin ' , self . link_task . outputs [ 0 ] )
2010-03-17 12:12:16 +03:00
tsk . env . BIN_TARGET = self . target
debug ( ' task_gen: BIN_TARGET for %s is %s ' , self . name , tsk . env . BIN_TARGET )
2010-03-26 05:25:10 +03:00
t = Task . simple_task_type ( ' copy_script ' , ' rm -f $ {LINK_TARGET} && ln -s $ { SRC[0].abspath(env)} $ {LINK_TARGET} ' ,
2010-03-25 06:21:22 +03:00
shell = True , color = ' PINK ' , ext_in = ' .bin ' )
2010-03-17 12:12:16 +03:00
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 ' ,
2010-03-18 15:47:48 +03:00
source = s ,
target = target ,
always = True ,
install_path = None )
2010-03-17 12:12:16 +03:00
t . env . LINK_TARGET = target
Build . BuildContext . SAMBA_SCRIPT = SAMBA_SCRIPT
2010-03-17 02:58:07 +03:00
2010-03-27 01:46:50 +03:00
2010-03-27 11:12:10 +03:00
def install_file ( bld , destdir , file , chmod = 0644 , flat = False ,
python_fixup = False , destname = None ) :
''' install a file '''
destdir = bld . EXPAND_VARIABLES ( destdir )
if not destname :
destname = file
if flat :
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
inst_file = file + ' .inst '
bld . SAMBA_GENERATOR ( ' python_ %s ' % destname ,
rule = " sed ' s| \ (sys.path.insert.* \ )bin/python \ (.* \ )$| \\ 1$ {PYTHONDIR} \\ 2|g ' < $ {SRC} > $ {TGT} " ,
source = file ,
target = inst_file )
file = inst_file
bld . install_as ( dest , file , chmod = chmod )
2010-03-27 01:46:50 +03:00
def INSTALL_FILES ( bld , destdir , files , chmod = 0644 , flat = False ,
2010-03-27 05:55:38 +03:00
python_fixup = False , destname = None ) :
2010-03-27 01:46:50 +03:00
''' install a set of files '''
2010-03-27 11:12:10 +03:00
for f in TO_LIST ( files ) :
install_file ( bld , destdir , f , chmod = chmod , flat = flat ,
python_fixup = python_fixup , destname = destname )
2010-03-27 01:46:50 +03:00
Build . BuildContext . INSTALL_FILES = INSTALL_FILES
def INSTALL_WILDCARD ( bld , destdir , pattern , chmod = 0644 , flat = False ,
2010-03-27 07:12:40 +03:00
python_fixup = False , exclude = None ) :
2010-03-27 01:46:50 +03:00
''' install a set of files matching a wildcard pattern '''
2010-03-27 07:12:40 +03:00
files = TO_LIST ( bld . path . ant_glob ( pattern ) )
if exclude :
for f in files [ : ] :
if fnmatch . fnmatch ( f , exclude ) :
files . remove ( f )
INSTALL_FILES ( bld , destdir , files , chmod = chmod , flat = flat , python_fixup = python_fixup )
2010-03-27 01:46:50 +03:00
Build . BuildContext . INSTALL_WILDCARD = INSTALL_WILDCARD
def PUBLIC_HEADERS ( bld , public_headers , header_path = None ) :
2010-03-27 05:55:38 +03:00
''' 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
'''
2010-03-27 01:46:50 +03:00
dest = ' $ {INCLUDEDIR} '
2010-03-27 05:55:38 +03:00
if isinstance ( header_path , str ) :
2010-03-27 01:46:50 +03:00
dest + = ' / ' + header_path
for h in TO_LIST ( public_headers ) :
2010-03-27 05:55:38 +03:00
hdest = dest
if isinstance ( header_path , list ) :
for ( p1 , dir ) in header_path :
found_match = False
lst = TO_LIST ( p1 )
for p2 in lst :
if fnmatch . fnmatch ( h , p2 ) :
if dir :
hdest = os . path . join ( hdest , dir )
found_match = True
break
if found_match : break
if h . find ( ' : ' ) != - 1 :
hs = h . split ( ' : ' )
INSTALL_FILES ( bld , hdest , hs [ 0 ] , flat = True , destname = hs [ 1 ] )
2010-03-27 01:46:50 +03:00
else :
2010-03-27 05:55:38 +03:00
INSTALL_FILES ( bld , hdest , h , flat = True )
2010-03-27 01:46:50 +03:00
Build . BuildContext . PUBLIC_HEADERS = PUBLIC_HEADERS
2010-03-27 10:14:06 +03:00
2010-03-27 12:00:01 +03:00
def subst_at_vars ( task ) :
''' substiture @VAR@ style variables in a file '''
src = task . inputs [ 0 ] . srcpath ( task . env )
tgt = task . outputs [ 0 ] . bldpath ( task . env )
f = open ( src , ' r ' )
s = f . read ( )
f . close ( )
# split on the vars
a = re . split ( ' (@ \ w+@) ' , s )
out = [ ]
for v in a :
if re . match ( ' @ \ w+@ ' , v ) :
vname = v [ 1 : - 1 ]
if not vname in task . env and vname . upper ( ) in task . env :
vname = vname . upper ( )
if not vname in task . env :
print " Unknown substitution %s in %s " % ( v , task . name )
raise
v = task . env [ vname ]
out . append ( v )
contents = ' ' . join ( out )
f = open ( tgt , ' w ' )
s = f . write ( contents )
f . close ( )
return 0
2010-03-29 08:27:54 +04:00
def PKG_CONFIG_FILES ( bld , pc_files , vnum = None ) :
2010-03-27 10:14:06 +03:00
''' install some pkg_config pc files '''
dest = ' $ {PKGCONFIGDIR} '
dest = bld . EXPAND_VARIABLES ( dest )
for f in TO_LIST ( pc_files ) :
2010-03-27 12:00:01 +03:00
base = os . path . basename ( f )
2010-03-29 08:27:54 +04:00
t = bld . SAMBA_GENERATOR ( ' PKGCONFIG_ %s ' % base ,
rule = subst_at_vars ,
source = f + ' .in ' ,
target = f )
if vnum :
t . env . PACKAGE_VERSION = vnum
2010-03-27 12:00:01 +03:00
INSTALL_FILES ( bld , dest , f , flat = True , destname = base )
2010-03-27 10:14:06 +03:00
Build . BuildContext . PKG_CONFIG_FILES = PKG_CONFIG_FILES
2010-03-29 01:30:29 +04:00
2010-03-29 09:59:13 +04:00
#############################################################
# give a nicer display when building different types of files
def progress_display ( self , msg , fname ) :
col1 = Logs . colors ( self . color )
col2 = Logs . colors . NORMAL
total = self . position [ 1 ]
n = len ( str ( total ) )
fs = ' [ %% %d d/ %% %d d] %s %% s %% s %% s \n ' % ( n , n , msg )
return fs % ( self . position [ 0 ] , self . position [ 1 ] , col1 , fname , col2 )
2010-03-29 01:30:29 +04:00
def link_display ( self ) :
if Options . options . progress_bar != 0 :
2010-03-29 09:59:13 +04:00
return Task . Task . old_display ( self )
2010-03-29 01:30:29 +04:00
fname = self . outputs [ 0 ] . bldpath ( self . env )
2010-03-29 09:59:13 +04:00
return progress_display ( self , ' Linking ' , fname )
2010-03-29 01:30:29 +04:00
Task . TaskBase . classes [ ' cc_link ' ] . display = link_display
2010-03-29 09:59:13 +04:00
def samba_display ( self ) :
if Options . options . progress_bar != 0 :
return Task . Task . old_display ( self )
fname = self . inputs [ 0 ] . bldpath ( self . env )
if fname [ 0 : 3 ] == ' ../ ' :
fname = fname [ 3 : ]
ext_loc = fname . rfind ( ' . ' )
if ext_loc == - 1 :
return Task . Task . old_display ( self )
ext = fname [ ext_loc : ]
ext_map = { ' .idl ' : ' Compiling IDL ' ,
' .et ' : ' Compiling ERRTABLE ' ,
' .asn1 ' : ' Compiling ASN1 ' ,
' .c ' : ' Compiling ' }
if ext in ext_map :
return progress_display ( self , ext_map [ ext ] , fname )
return Task . Task . old_display ( self )
Task . TaskBase . classes [ ' Task ' ] . old_display = Task . TaskBase . classes [ ' Task ' ] . display
Task . TaskBase . classes [ ' Task ' ] . display = samba_display