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-04-15 02:55:26 +04:00
import Build , os , Options , Task , Utils , cc , TaskGen , fnmatch , re , shutil , Logs , Constants
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-06-15 03:24:20 +04:00
TaskGen . task_gen . apply_verif = Utils . nada
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 *
2010-05-28 09:20:03 +04:00
from samba_version import *
2010-02-26 14:21:50 +03:00
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 13:53:29 +03:00
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-04-01 15:19:32 +04:00
import samba_install
2010-03-25 01:56:57 +03:00
import samba_conftests
2010-04-18 06:43:15 +04:00
import samba_abi
2010-04-02 14:32:42 +04:00
import tru64cc
2010-04-03 02:19:57 +04:00
import irixcc
import generic_cc
2010-04-04 04:06:34 +04:00
import samba_dist
2010-05-04 12:08:43 +04:00
import samba_wildcard
2010-10-14 09:24:50 +04:00
import stale_files
2010-10-30 04:07:40 +04:00
import symbols
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-04-15 02:55:26 +04:00
2010-10-06 11:55:38 +04:00
if Constants . HEXVERSION < 0x105019 :
2010-04-15 02:55:26 +04:00
Logs . error ( '''
Please use the version of waf that comes with Samba , not
a system installed version . See http : / / wiki . samba . org / index . php / Waf
2010-04-15 03:14:10 +04:00
for details .
Alternatively , please use . / autogen - waf . sh , and then
run . / configure and make as usual . That will call the right version of waf .
2010-04-15 02:55:26 +04:00
''' )
sys . exit ( 1 )
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-04-08 15:46:20 +04:00
conf . env . BUILD_DIRECTORY = conf . blddir
2010-03-17 12:12:16 +03:00
mkdir_p ( os . path . join ( conf . blddir , LIB_PATH ) )
2010-09-05 22:16:50 +04:00
mkdir_p ( os . path . join ( conf . blddir , " modules " ) )
2010-03-17 12:12:16 +03:00
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-04-24 22:02:44 +04:00
mkdir_p ( os . path . join ( conf . blddir , ' default ' ) )
2010-09-04 04:18:31 +04:00
for p in [ ' python ' , ' shared ' , ' modules ' ] :
2010-03-17 00:50:49 +03:00
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 )
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-10-27 04:54:56 +04:00
soname = 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-10-30 04:07:40 +04:00
group = ' libraries ' ,
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-10-10 06:25:50 +04:00
pyembed = False ,
2010-10-21 08:25:44 +04:00
pyext = False ,
2010-03-29 08:19:13 +04:00
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-04-18 06:43:15 +04:00
abi_file = None ,
abi_match = None ,
hide_symbols = False ,
2010-05-31 14:08:01 +04:00
manpages = None ,
2010-10-20 11:17:13 +04:00
private_library = False ,
2010-10-21 04:22:36 +04:00
grouping_library = False ,
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-04-25 15:00:44 +04:00
if ( ( source == ' ' ) or ( source == [ ] ) ) and deps == ' ' and public_deps == ' ' :
2010-03-20 08:27:48 +03:00
SET_TARGET_TYPE ( bld , libname , ' EMPTY ' )
2010-02-23 08:48:38 +03:00
return
2010-06-18 11:45:15 +04:00
if 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
2010-10-30 04:07:40 +04:00
if group == ' libraries ' :
subsystem_group = ' main '
else :
subsystem_group = group
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 ,
2010-10-30 04:07:40 +04:00
group = subsystem_group ,
2010-03-18 15:47:48 +03:00
autoproto = autoproto ,
depends_on = depends_on ,
2010-04-18 06:43:15 +04:00
hide_symbols = hide_symbols ,
2010-10-21 08:25:44 +04:00
pyext = pyext or ( target_type == " PYTHON " ) ,
2010-03-18 15:47:48 +03:00
local_include = local_include )
2010-06-18 11:45:15 +04:00
if BUILTIN_LIBRARY ( bld , libname ) :
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-10-17 14:58:22 +04:00
realname = bld . map_shlib_extension ( realname , python = ( target_type == ' PYTHON ' ) )
link_name = bld . map_shlib_extension ( link_name , python = ( target_type == ' PYTHON ' ) )
2010-10-20 11:17:13 +04:00
# we don't want any public libraries without version numbers
2010-10-27 04:54:56 +04:00
if not private_library and vnum is None and soname is None and target_type != ' PYTHON ' and not realname :
2010-10-20 11:17:13 +04:00
raise Utils . WafError ( " public library ' %s ' must have a vnum " % libname )
2010-10-21 04:22:36 +04:00
if target_type == ' PYTHON ' or realname or not private_library :
2010-10-24 22:26:09 +04:00
bundled_name = libname . replace ( ' _ ' , ' - ' )
2010-03-29 08:19:13 +04:00
else :
2010-10-24 01:26:43 +04:00
bundled_name = PRIVATE_NAME ( bld , libname , bundled_extension , private_library )
2010-03-29 08:19:13 +04:00
2010-10-24 11:54:40 +04:00
if private_library :
if vnum :
Logs . error ( " vnum is invalid for private libraries " )
sys . exit ( 1 )
2010-10-26 21:25:35 +04:00
vnum = Utils . g_module . VERSION
2010-10-24 11:54:40 +04:00
2010-04-01 15:19:32 +04:00
features = ' cc cshlib symlink_lib install_lib '
2010-04-01 05:30:56 +04:00
if target_type == ' PYTHON ' :
2010-03-29 08:19:13 +04:00
features + = ' pyext '
2010-10-21 10:44:32 +04:00
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
2010-04-01 05:30:56 +04:00
features + = ' pyembed '
2010-04-18 06:43:15 +04:00
if abi_file :
features + = ' abi_check '
if abi_file :
abi_file = os . path . join ( bld . curdir , abi_file )
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-04-01 15:19:32 +04:00
features = features ,
2010-03-18 15:47:48 +03:00
source = [ ] ,
2010-03-28 07:09:36 +04:00
target = bundled_name ,
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-10-27 04:54:56 +04:00
soname = soname ,
2010-03-23 17:00:48 +03:00
install_path = None ,
2010-04-01 15:19:32 +04:00
samba_inst_path = install_path ,
2010-05-31 14:08:01 +04:00
name = libname ,
2010-04-01 15:19:32 +04:00
samba_realname = realname ,
2010-04-18 06:43:15 +04:00
samba_install = install ,
abi_file = abi_file ,
2010-06-13 22:52:47 +04:00
abi_match = abi_match ,
2010-10-21 04:22:36 +04:00
private_library = private_library ,
grouping_library = grouping_library
2010-03-17 12:32:15 +03:00
)
2010-03-18 15:47:48 +03:00
2010-04-26 13:04:33 +04:00
if realname and not link_name :
link_name = ' shared/ %s ' % realname
2010-03-29 08:19:13 +04:00
if link_name :
t . link_name = link_name
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-06-24 10:02:43 +04:00
if manpages is not None and ' XSLTPROC_MANPAGES ' in bld . env and bld . env [ ' XSLTPROC_MANPAGES ' ] :
2010-05-31 14:17:33 +04:00
bld . MANPAGES ( manpages )
2010-05-31 14:08:01 +04: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 ,
ldflags = None ,
2010-02-24 09:39:23 +03:00
cflags = ' ' ,
2010-02-23 01:04:44 +03:00
autoproto = None ,
2010-04-12 11:30:12 +04:00
use_hostcc = False ,
2010-04-12 12:16:54 +04:00
use_global_deps = True ,
2010-02-23 08:26:59 +03:00
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-10-10 06:25:50 +04:00
pyembed = False ,
2010-03-25 01:23:10 +03:00
vars = None ,
2010-03-18 15:47:48 +03:00
install = True ,
2010-04-29 01:47:19 +04:00
install_path = None ,
enabled = True ) :
2010-03-28 15:01:04 +04:00
''' define a Samba binary '''
2010-03-17 12:26:03 +03:00
2010-04-29 01:47:19 +04:00
if not enabled :
SET_TARGET_TYPE ( bld , binname , ' DISABLED ' )
return
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-04-01 15:19:32 +04:00
features = ' cc cprogram symlink_bin install_bin '
2010-10-10 06:25:50 +04:00
if pyembed :
2010-03-20 08:27:48 +03:00
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-04-25 06:41:41 +04:00
source = unique_list ( TO_LIST ( source ) )
2010-03-25 01:23:10 +03:00
2010-10-30 04:07:40 +04:00
if group == ' binaries ' :
subsystem_group = ' main '
else :
subsystem_group = group
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 ,
2010-10-30 04:07:40 +04:00
group = subsystem_group ,
2010-03-18 15:47:48 +03:00
autoproto = autoproto ,
subsystem_name = subsystem_name ,
2010-04-12 11:30:12 +04:00
local_include = local_include ,
2010-04-12 12:16:54 +04:00
use_hostcc = use_hostcc ,
2010-10-11 03:09:26 +04:00
pyext = pyembed ,
2010-04-12 12:16:54 +04:00
use_global_deps = use_global_deps )
2010-03-18 15:47:48 +03:00
2010-03-30 13:21:21 +04:00
bld . SET_BUILD_GROUP ( group )
2010-04-01 15:19:32 +04:00
# the binary itself will depend on that object target
2010-03-18 15:47:48 +03:00
deps = TO_LIST ( deps )
deps . append ( obj_target )
2010-04-01 02:49:46 +04:00
t = bld (
2010-04-01 15:19:32 +04:00
features = features ,
2010-03-18 15:47:48 +03:00
source = [ ] ,
2010-03-20 08:27:48 +03:00
target = binname ,
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 ,
2010-04-01 15:19:32 +04:00
samba_inst_path = install_path ,
samba_install = install
2010-03-20 08:27:48 +03:00
)
2010-02-23 06:43:06 +03:00
2010-06-24 10:02:43 +04:00
if manpages is not None and ' XSLTPROC_MANPAGES ' in bld . env and bld . env [ ' XSLTPROC_MANPAGES ' ] :
2010-05-31 14:17:33 +04:00
bld . MANPAGES ( manpages )
2010-05-31 03:35:43 +04:00
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-10-10 23:22:02 +04:00
enabled = True ,
pyembed = True ,
) :
2010-03-28 15:01:04 +04:00
''' define a Samba module. '''
2010-03-20 08:27:48 +03:00
2010-06-15 03:24:20 +04:00
source = bld . EXPAND_VARIABLES ( source , vars = vars )
2010-06-15 22:35:22 +04:00
if internal_module or BUILTIN_LIBRARY ( bld , modname ) :
bld . SAMBA_SUBSYSTEM ( modname , source ,
2010-06-15 03:24:20 +04:00
deps = deps ,
includes = includes ,
autoproto = autoproto ,
autoproto_extra_source = autoproto_extra_source ,
cflags = cflags ,
local_include = local_include ,
enabled = enabled )
2010-06-10 15:02:59 +04:00
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
2010-10-21 01:27:07 +04:00
if aliases is not None :
# if we have aliases, then create a private base library, and a set
# of modules on top of that library
2010-10-11 00:52:35 +04:00
if init_function :
cflags + = " -D %s =samba_init_module " % init_function
2010-10-21 01:27:07 +04:00
basename = modname + ' -base '
bld . SAMBA_LIBRARY ( basename ,
2010-09-04 05:42:37 +04:00
source ,
deps = deps ,
cflags = cflags ,
autoproto = autoproto ,
local_include = local_include ,
vars = vars ,
2010-10-10 23:22:02 +04:00
pyembed = pyembed ,
2010-10-21 01:27:07 +04:00
private_library = True
2010-09-04 05:42:37 +04:00
)
2010-03-20 08:27:48 +03:00
2010-10-21 01:27:07 +04:00
aliases = TO_LIST ( aliases )
aliases . append ( modname )
for alias in aliases :
bld . SAMBA_MODULE ( alias ,
source = [ ] ,
internal_module = False ,
subsystem = subsystem ,
init_function = init_function ,
deps = basename )
return
obj_target = modname + ' .objlist '
realname = modname
if subsystem is not None :
deps + = ' ' + subsystem
while realname . startswith ( " lib " + subsystem + " _ " ) :
realname = realname [ len ( " lib " + subsystem + " _ " ) : ]
while realname . startswith ( subsystem + " _ " ) :
realname = realname [ len ( subsystem + " _ " ) : ]
realname = bld . make_libname ( realname )
while realname . startswith ( " lib " ) :
realname = realname [ len ( " lib " ) : ]
build_link_name = " modules/ %s / %s " % ( subsystem , realname )
if init_function :
cflags + = " -D %s =samba_init_module " % init_function
bld . SAMBA_LIBRARY ( modname ,
source ,
deps = deps ,
cflags = cflags ,
realname = realname ,
autoproto = autoproto ,
local_include = local_include ,
vars = vars ,
link_name = build_link_name ,
install_path = " $ {MODULESDIR} / %s " % subsystem ,
pyembed = pyembed ,
)
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
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-04-12 11:30:12 +04:00
use_hostcc = False ,
2010-04-12 12:16:54 +04:00
use_global_deps = True ,
2010-03-25 01:23:10 +03:00
vars = None ,
2010-04-18 06:43:15 +04:00
hide_symbols = False ,
2010-10-10 23:22:02 +04:00
pyext = 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-04-25 15:00:44 +04:00
if ( ( source == ' ' ) or ( source == [ ] ) ) and deps == ' ' and public_deps == ' ' :
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-04-25 06:41:41 +04:00
source = unique_list ( TO_LIST ( source ) )
2010-03-25 01:23:10 +03:00
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 '
2010-10-10 23:22:02 +04:00
if pyext :
features + = ' pyext '
2010-03-17 12:12:16 +03:00
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-04-18 06:43:15 +04:00
samba_cflags = CURRENT_CFLAGS ( bld , modname , cflags , hide_symbols = hide_symbols ) ,
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 ,
2010-04-12 11:30:12 +04:00
samba_subsystem = subsystem_name ,
2010-04-12 12:16:54 +04:00
samba_use_hostcc = use_hostcc ,
samba_use_global_deps = use_global_deps
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 autoproto is not None :
2010-04-25 06:41:41 +04:00
bld . SAMBA_AUTOPROTO ( autoproto , source + TO_LIST ( 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-04-05 05:25:20 +04: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-06-28 06:07:55 +04:00
vars = None ,
always = False ) :
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
2010-06-28 06:07:55 +04:00
if always :
t . always = True
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-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-10-30 04:07:40 +04:00
bld . add_group ( ' symbolcheck ' )
bld . add_group ( ' libraries ' )
2010-03-17 12:12:16 +03:00
bld . add_group ( ' binaries ' )
2010-10-30 04:07:40 +04:00
bld . add_group ( ' syslibcheck ' )
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-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-10-06 13:11:01 +04:00
def install_file ( bld , destdir , file , chmod = MODE_644 , flat = False ,
2010-04-01 17:13:26 +04:00
python_fixup = False , destname = None , base_name = None ) :
2010-03-27 11:12:10 +03:00
''' 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 '
2010-09-09 00:45:12 +04:00
if bld . env [ " PYTHONDIR " ] not in sys . path :
regex = " s| \ (sys.path.insert.* \ )bin/python \ (.* \ )$| \\ 1$ {PYTHONDIR} \\ 2|g "
else :
# Eliminate updating sys.path if the target python dir is already
# in python path.
regex = " s|sys.path.insert.*bin/python.*$||g "
2010-03-27 11:12:10 +03:00
bld . SAMBA_GENERATOR ( ' python_ %s ' % destname ,
2010-09-09 00:45:12 +04:00
rule = " sed ' %s ' < $ {SRC} > $ {TGT} " % regex ,
2010-03-27 11:12:10 +03:00
source = file ,
target = inst_file )
file = inst_file
2010-04-01 17:13:26 +04:00
if base_name :
file = os . path . join ( base_name , file )
2010-03-27 11:12:10 +03:00
bld . install_as ( dest , file , chmod = chmod )
2010-10-06 13:11:01 +04:00
def INSTALL_FILES ( bld , destdir , files , chmod = MODE_644 , flat = False ,
2010-04-01 17:13:26 +04:00
python_fixup = False , destname = None , base_name = 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 ,
2010-04-01 17:13:26 +04:00
python_fixup = python_fixup , destname = destname ,
base_name = base_name )
2010-03-27 01:46:50 +03:00
Build . BuildContext . INSTALL_FILES = INSTALL_FILES
2010-10-06 13:11:01 +04:00
def INSTALL_WILDCARD ( bld , destdir , pattern , chmod = MODE_644 , flat = False ,
2010-04-01 17:13:26 +04:00
python_fixup = False , exclude = None , trim_path = 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 ) )
2010-04-01 17:13:26 +04:00
if trim_path :
files2 = [ ]
for f in files :
files2 . append ( os_path_relpath ( f , trim_path ) )
files = files2
2010-03-27 07:12:40 +03:00
if exclude :
for f in files [ : ] :
if fnmatch . fnmatch ( f , exclude ) :
files . remove ( f )
2010-04-01 17:13:26 +04:00
INSTALL_FILES ( bld , destdir , files , chmod = chmod , flat = flat ,
python_fixup = python_fixup , base_name = trim_path )
2010-03-27 01:46:50 +03:00
Build . BuildContext . INSTALL_WILDCARD = INSTALL_WILDCARD
2010-04-19 15:00:36 +04:00
def INSTALL_DIRS ( bld , destdir , dirs ) :
''' install a set of directories '''
2010-04-19 15:54:40 +04:00
destdir = bld . EXPAND_VARIABLES ( destdir )
dirs = bld . EXPAND_VARIABLES ( dirs )
2010-04-19 15:00:36 +04:00
for d in TO_LIST ( dirs ) :
bld . install_dir ( os . path . join ( destdir , d ) )
Build . BuildContext . INSTALL_DIRS = INSTALL_DIRS
2010-05-20 00:13:03 +04:00
re_header = re . compile ( ' #include[ \t ]* " ([^ " ]+) " ' , re . I | re . M )
class header_task ( Task . Task ) :
2010-05-24 04:26:36 +04:00
"""
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 .
"""
2010-05-20 00:13:03 +04:00
name = ' header '
color = ' PINK '
vars = [ ' INCLUDEDIR ' , ' HEADER_DEPS ' ]
2010-05-24 04:26:36 +04:00
2010-05-20 00:13:03 +04:00
def run ( self ) :
txt = self . inputs [ 0 ] . read ( self . env )
2010-05-24 04:26:36 +04:00
# hard-coded string, but only present in samba4 (I promise, you won't feel a thing)
2010-05-20 00:13:03 +04:00
txt = txt . replace ( ' #if _SAMBA_BUILD_ == 4 ' , ' #if 1 \n ' )
2010-05-24 04:26:36 +04:00
# use a regexp to substitute the #include lines in the files
map = self . generator . bld . hnodemap
dirnodes = self . generator . bld . hnodedirs
2010-05-20 00:13:03 +04:00
def repl ( m ) :
if m . group ( 1 ) :
s = m . group ( 1 )
2010-05-24 04:26:36 +04:00
# 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
2010-05-20 00:13:03 +04:00
return ' '
txt = re_header . sub ( repl , txt )
2010-05-24 04:26:36 +04:00
# and write the output file
2010-05-20 00:13:03 +04:00
f = None
try :
f = open ( self . outputs [ 0 ] . abspath ( self . env ) , ' w ' )
f . write ( txt )
finally :
if f :
f . close ( )
2010-05-24 04:26:36 +04:00
@TaskGen.feature ( ' pubh ' )
def make_public_headers ( self ) :
2010-05-20 00:13:03 +04:00
"""
2010-05-24 04:26:36 +04:00
collect the public headers to process and to install , then
create the substitutions ( name and contents )
2010-05-20 00:13:03 +04:00
"""
if not self . bld . is_install :
# install time only (lazy)
return
2010-05-24 04:26:36 +04:00
# 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 )
2010-05-20 00:13:03 +04:00
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 )
2010-05-24 04:26:36 +04:00
2010-05-20 00:13:03 +04:00
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 )
2010-05-24 04:26:36 +04:00
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
2010-03-27 01:46:50 +03:00
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-05-20 00:13:03 +04:00
bld . SET_BUILD_GROUP ( ' final ' )
ret = bld ( features = [ ' pubh ' ] , headers = public_headers , header_path = header_path )
return ret
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 = [ ]
2010-05-07 13:41:50 +04:00
done_var = { }
2010-04-03 16:26:21 +04:00
back_sub = [ ( ' PREFIX ' , ' $ {prefix} ' ) , ( ' EXEC_PREFIX ' , ' $ {exec_prefix} ' ) ]
2010-03-27 12:00:01 +03:00
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 :
2010-04-09 15:12:02 +04:00
Logs . error ( " Unknown substitution %s in %s " % ( v , task . name ) )
sys . exit ( 1 )
2010-04-03 16:26:21 +04:00
v = SUBST_VARS_RECURSIVE ( task . env [ vname ] , task . env )
# now we back substitute the allowed pc vars
for ( b , m ) in back_sub :
s = task . env [ b ]
if s == v [ 0 : len ( s ) ] :
2010-05-07 13:41:50 +04:00
if not b in done_var :
# we don't want to substitute the first usage
done_var [ b ] = True
else :
v = m + v [ len ( s ) : ]
break
2010-03-27 12:00:01 +03:00
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-05-31 14:17:33 +04:00
def MANPAGES ( bld , manpages ) :
''' build and install manual pages '''
bld . env . MAN_XSL = ' http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl '
for m in manpages . split ( ) :
source = m + ' .xml '
bld . SAMBA_GENERATOR ( m ,
source = source ,
target = m ,
2010-05-31 19:51:21 +04:00
group = ' final ' ,
2010-06-24 10:02:43 +04:00
rule = ' $ {XSLTPROC} -o $ {TGT} --nonet $ {MAN_XSL} $ {SRC} '
2010-05-31 14:17:33 +04:00
)
bld . INSTALL_FILES ( ' $ {MANDIR} /man %s ' % m [ - 1 ] , m , flat = True )
Build . BuildContext . MANPAGES = MANPAGES
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 )
2010-04-02 06:06:35 +04:00
targets = LOCAL_CACHE ( self , ' TARGET_TYPE ' )
if self . name in targets :
target_type = targets [ self . name ]
type_map = { ' GENERATOR ' : ' Generating ' ,
' PROTOTYPE ' : ' Generating '
}
if target_type in type_map :
return progress_display ( self , type_map [ target_type ] , self . name )
2010-10-29 04:53:15 +04:00
if len ( self . inputs ) == 0 :
return Task . Task . old_display ( self )
2010-03-29 09:59:13 +04:00
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
2010-10-30 16:51:20 +04:00
@after ( ' apply_link ' )
@feature ( ' cshlib ' )
def apply_bundle_remove_dynamiclib_patch ( self ) :
if self . env [ ' MACBUNDLE ' ] or getattr ( self , ' mac_bundle ' , False ) :
if not getattr ( self , ' vnum ' , None ) :
try :
self . env [ ' LINKFLAGS ' ] . remove ( ' -dynamiclib ' )
self . env [ ' LINKFLAGS ' ] . remove ( ' -single_module ' )
except ValueError :
pass