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
2011-01-05 14:16:15 +03:00
import Build , os , sys , 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
2011-03-03 05:23:13 +03:00
import samba_headers
2010-04-02 14:32:42 +04:00
import tru64cc
2010-04-03 02:19:57 +04:00
import irixcc
2010-12-07 23:42:15 +03:00
import hpuxcc
2010-04-03 02:19:57 +04:00
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-11-03 03:14:40 +03:00
import pkgconfig
2012-09-06 14:14:34 +04:00
import configure_file
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
2011-02-21 08:46:58 +03:00
os . environ [ ' 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 .
2011-02-07 06:43:52 +03:00
Alternatively , please 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-11-05 04:30:01 +03:00
mkdir_p ( os . path . join ( conf . blddir , LIB_PATH , " private " ) )
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 ' ) )
2013-03-02 03:58:50 +04:00
for ( source , target ) in [ ( ' shared ' , ' shared ' ) , ( ' modules ' , ' modules ' ) , ( ' python ' , ' python_modules ' ) ] :
link_target = os . path . join ( conf . blddir , ' default/ ' + target )
2010-03-17 00:50:49 +03:00
if not os . path . lexists ( link_target ) :
2013-03-02 03:58:50 +04:00
os . symlink ( ' ../ ' + source , link_target )
2010-03-17 00:50:49 +03:00
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 ,
2011-03-03 09:18:58 +03:00
public_headers_install = True ,
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-12-08 06:52:43 +03:00
ldflags = ' ' ,
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 ,
2011-07-07 16:03:30 +04:00
autoproto_extra_source = ' ' ,
build: Remove binaries and libraries build groups
Build groups are used in Samba to ensure that even if the dependency
chain for a target is not perfect, that it builds reliably. This
matters most in the early build stages, where we are building the asn1
compiler and autogenerating files.
Once we get to the main stage, dependencies between C files, libraries
and binaries are much clearer, because the C compiler and linker takes
these as inputs anyway.
Groups were added to our waf build for stability during early
development, as dependency information was first imported from the
previous autoconf/perl based build system.
I don't think we need this distinction in the main build of C files
into .o, and when linking these into binaries, because the invocation
of these tools is very well defined, and we will find any missing
inputs very quickly.
As such, I've removed the libraries and binaries targets,
consolidating them with 'main'
By making this change, a build of smbtorture only on a clean tree
drops from 3778 to 2489 targets, and much of the expensive linker
stage is skipped. The time for a null build of smbtorture only also
drops from 4.673s to as low as 2.499s on my laptop.
Andrew Bartlett
Reviewed-by: Jelmer Vernooij <jelmer@samba.org>
2013-05-26 17:11:03 +04:00
group = ' main ' ,
2010-03-20 08:27:48 +03:00
depends_on = ' ' ,
2010-03-18 15:47:48 +03:00
local_include = True ,
2011-02-28 10:52:36 +03:00
global_include = True ,
2010-03-25 01:23:10 +03:00
vars = None ,
2011-02-09 07:55:18 +03:00
subdir = 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-12-09 03:10:45 +03:00
abi_directory = None ,
2010-04-18 06:43:15 +04:00
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 ,
2011-02-15 08:15:15 +03:00
allow_undefined_symbols = 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
2012-04-19 09:34:48 +04:00
if LIB_MUST_BE_PRIVATE ( bld , libname ) :
private_library = True
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 )
2011-02-09 07:55:18 +03:00
if subdir :
source = bld . SUBDIR ( subdir , source )
2010-03-25 01:23:10 +03:00
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 ,
2011-03-03 09:18:58 +03:00
public_headers_install = public_headers_install ,
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 ,
2011-07-07 16:03:30 +04:00
autoproto_extra_source = autoproto_extra_source ,
2010-03-18 15:47:48 +03:00
depends_on = depends_on ,
2010-04-18 06:43:15 +04:00
hide_symbols = hide_symbols ,
2011-11-12 18:51:16 +04:00
pyembed = pyembed ,
2011-11-12 23:24:35 +04:00
pyext = pyext ,
2011-02-28 10:52:36 +03:00
local_include = local_include ,
global_include = global_include )
2010-03-18 15:47:48 +03:00
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
2011-08-21 04:09:14 +04:00
if ( not private_library and target_type != ' PYTHON ' and not realname ) :
if vnum is None and soname is None :
raise Utils . WafError ( " public library ' %s ' must have a vnum " %
libname )
if pc_files is None :
raise Utils . WafError ( " public library ' %s ' must have pkg-config file " %
libname )
2011-08-21 04:26:51 +04:00
if public_headers is None :
raise Utils . WafError ( " public library ' %s ' must have header files " %
libname )
2010-10-20 11:17:13 +04:00
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 :
2011-08-21 04:09:14 +04:00
bundled_name = PRIVATE_NAME ( bld , libname , bundled_extension ,
private_library )
2010-03-29 08:19:13 +04:00
2010-12-08 06:52:43 +03:00
ldflags = TO_LIST ( ldflags )
2010-04-01 15:19:32 +04:00
features = ' cc cshlib symlink_lib install_lib '
2011-11-12 23:24:35 +04:00
if pyext :
2010-03-29 08:19:13 +04:00
features + = ' pyext '
2011-11-12 08:20:10 +04:00
if pyembed :
2010-04-01 05:30:56 +04:00
features + = ' pyembed '
2010-04-18 06:43:15 +04:00
2010-12-09 03:10:45 +03:00
if abi_directory :
features + = ' abi_check '
2010-12-09 04:24:48 +03:00
2010-12-17 21:21:47 +03:00
vscript = None
2010-12-09 04:24:48 +03:00
if bld . env . HAVE_LD_VERSION_SCRIPT :
if private_library :
version = " %s _ %s " % ( Utils . g_module . APPNAME , Utils . g_module . VERSION )
2010-12-09 04:30:30 +03:00
elif vnum :
2010-12-09 04:24:48 +03:00
version = " %s _ %s " % ( libname , vnum )
2010-12-09 04:30:30 +03:00
else :
version = None
if version :
2010-12-17 21:21:47 +03:00
vscript = " %s .vscript " % libname
2010-12-18 00:23:52 +03:00
bld . ABI_VSCRIPT ( libname , abi_directory , version , vscript ,
abi_match )
2011-02-17 06:42:19 +03:00
fullname = apply_pattern ( bundled_name , bld . env . shlib_PATTERN )
2011-02-17 07:14:57 +03:00
fullpath = bld . path . find_or_declare ( fullname )
vscriptpath = bld . path . find_or_declare ( vscript )
if not fullpath :
raise Utils . WafError ( " unable to find fullpath for %s " % fullname )
if not vscriptpath :
raise Utils . WafError ( " unable to find vscript path for %s " % vscript )
bld . add_manual_dependency ( fullpath , vscriptpath )
2010-12-10 09:59:34 +03:00
if Options . is_install :
# also make the .inst file depend on the vscript
2011-02-17 06:42:19 +03:00
instname = apply_pattern ( bundled_name + ' .inst ' , bld . env . shlib_PATTERN )
2010-12-10 09:59:34 +03:00
bld . add_manual_dependency ( bld . path . find_or_declare ( instname ) , bld . path . find_or_declare ( vscript ) )
2010-12-17 21:38:12 +03:00
vscript = os . path . join ( bld . path . abspath ( bld . env ) , vscript )
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-12-17 20:42:34 +03:00
samba_ldflags = ldflags ,
2010-03-18 15:47:48 +03:00
samba_deps = deps ,
2010-03-20 08:27:48 +03:00
samba_includes = includes ,
2010-12-17 21:16:33 +03:00
version_script = vscript ,
2010-03-20 08:27:48 +03:00
local_include = local_include ,
2011-02-28 10:52:36 +03:00
global_include = global_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 ,
2010-12-09 13:49:01 +03:00
abi_directory = " %s / %s " % ( bld . path . abspath ( ) , abi_directory ) ,
2010-06-13 22:52:47 +04:00
abi_match = abi_match ,
2010-10-21 04:22:36 +04:00
private_library = private_library ,
2011-02-15 08:15:15 +03:00
grouping_library = grouping_library ,
allow_undefined_symbols = allow_undefined_symbols
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
2011-08-21 05:02:58 +04:00
if pc_files is not None and not private_library :
2010-03-29 08:27:54 +04:00
bld . PKG_CONFIG_FILES ( pc_files , vnum = vnum )
2010-03-27 10:14:06 +03:00
2012-09-27 20:30:47 +04:00
if ( manpages is not None and ' XSLTPROC_MANPAGES ' in bld . env and
2011-08-21 04:09:14 +04:00
bld . env [ ' XSLTPROC_MANPAGES ' ] ) :
2012-12-04 18:03:40 +04:00
bld . MANPAGES ( manpages , install )
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 ,
build: Remove binaries and libraries build groups
Build groups are used in Samba to ensure that even if the dependency
chain for a target is not perfect, that it builds reliably. This
matters most in the early build stages, where we are building the asn1
compiler and autogenerating files.
Once we get to the main stage, dependencies between C files, libraries
and binaries are much clearer, because the C compiler and linker takes
these as inputs anyway.
Groups were added to our waf build for stability during early
development, as dependency information was first imported from the
previous autoconf/perl based build system.
I don't think we need this distinction in the main build of C files
into .o, and when linking these into binaries, because the invocation
of these tools is very well defined, and we will find any missing
inputs very quickly.
As such, I've removed the libraries and binaries targets,
consolidating them with 'main'
By making this change, a build of smbtorture only on a clean tree
drops from 3778 to 2489 targets, and much of the expensive linker
stage is skipped. The time for a null build of smbtorture only also
drops from 4.673s to as low as 2.499s on my laptop.
Andrew Bartlett
Reviewed-by: Jelmer Vernooij <jelmer@samba.org>
2013-05-26 17:11:03 +04:00
group = ' main ' ,
2010-03-20 08:27:48 +03:00
manpages = None ,
local_include = True ,
2011-02-28 10:52:36 +03:00
global_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 ,
2011-02-09 07:55:18 +03:00
subdir = 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 )
2011-02-09 07:55:18 +03:00
if subdir :
source = bld . SUBDIR ( subdir , source )
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
2013-05-27 19:57:01 +04:00
# only specify PIE flags for binaries
pie_cflags = cflags
pie_ldflags = TO_LIST ( ldflags )
if bld . env [ ' ENABLE_PIE ' ] == True :
pie_cflags + = ' -fPIE '
pie_ldflags . extend ( TO_LIST ( ' -pie ' ) )
2013-07-05 10:13:56 +04:00
if bld . env [ ' ENABLE_RELRO ' ] == True :
pie_ldflags . extend ( TO_LIST ( ' -Wl,-z,relro,-z,now ' ) )
2013-05-27 19:57:01 +04:00
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 ,
2013-05-27 19:57:01 +04:00
cflags = pie_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 ,
2011-02-28 10:52:36 +03:00
global_include = global_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 ,
2011-02-28 10:52:36 +03:00
global_include = global_include ,
2010-03-20 08:27:48 +03:00
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 ,
2010-12-15 06:59:47 +03:00
samba_install = install ,
2013-05-27 19:57:01 +04:00
samba_ldflags = pie_ldflags
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 ' ] :
2012-12-04 18:03:40 +04:00
bld . MANPAGES ( manpages , install )
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 ,
2011-12-03 10:03:35 +04:00
module_init_name = ' samba_init_module ' ,
2010-02-23 00:04:00 +03:00
autoproto = None ,
2010-03-20 08:27:48 +03:00
autoproto_extra_source = ' ' ,
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 ,
2011-02-28 10:52:36 +03:00
global_include = True ,
2010-03-25 01:23:10 +03:00
vars = None ,
2011-02-15 08:16:54 +03:00
subdir = None ,
2010-10-10 23:22:02 +04:00
enabled = True ,
2010-12-14 15:38:03 +03:00
pyembed = False ,
2012-09-05 19:37:19 +04:00
manpages = None ,
2011-02-15 08:15:15 +03:00
allow_undefined_symbols = False
2010-10-10 23:22:02 +04:00
) :
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 )
2011-02-15 08:16:54 +03:00
if subdir :
source = bld . SUBDIR ( subdir , source )
2010-06-15 03:24:20 +04:00
2010-06-15 22:35:22 +04:00
if internal_module or BUILTIN_LIBRARY ( bld , modname ) :
2012-05-21 13:45:12 +04:00
# Do not create modules for disabled subsystems
if subsystem and GET_TARGET_TYPE ( bld , subsystem ) == ' DISABLED ' :
return
2010-06-15 22:35:22 +04:00
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 ,
2011-02-28 10:52:36 +03:00
global_include = global_include ,
2010-06-15 03:24:20 +04:00
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
2012-05-21 13:45:12 +04:00
# Do not create modules for disabled subsystems
if subsystem and GET_TARGET_TYPE ( bld , subsystem ) == ' DISABLED ' :
return
2010-10-21 01:27:07 +04:00
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 :
2010-11-01 04:29:04 +03:00
cflags + = " -D %s = %s " % ( init_function , module_init_name )
2010-10-21 01:27:07 +04:00
bld . SAMBA_LIBRARY ( modname ,
source ,
deps = deps ,
2011-02-15 08:17:30 +03:00
includes = includes ,
2010-10-21 01:27:07 +04:00
cflags = cflags ,
realname = realname ,
autoproto = autoproto ,
local_include = local_include ,
2011-02-28 10:52:36 +03:00
global_include = global_include ,
2010-10-21 01:27:07 +04:00
vars = vars ,
link_name = build_link_name ,
install_path = " $ {MODULESDIR} / %s " % subsystem ,
pyembed = pyembed ,
2012-09-05 19:37:19 +04:00
manpages = manpages ,
2011-02-15 08:15:15 +03:00
allow_undefined_symbols = allow_undefined_symbols
2010-10-21 01:27:07 +04:00
)
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 ,
2011-03-03 09:18:58 +03:00
public_headers_install = True ,
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 ' ,
2012-04-09 16:33:37 +04:00
init_function_sentinel = 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 ,
2011-02-28 10:52:36 +03:00
global_include = 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 ,
2011-02-09 07:55:18 +03:00
subdir = None ,
2010-04-18 06:43:15 +04:00
hide_symbols = False ,
2011-11-12 18:51:16 +04:00
pyext = False ,
pyembed = 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 )
2011-02-09 07:55:18 +03:00
if subdir :
source = bld . SUBDIR ( subdir , source )
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 '
2011-11-12 18:51:16 +04:00
if pyembed :
features + = ' pyembed '
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 ,
2011-02-28 10:52:36 +03:00
global_include = global_include ,
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 ,
2011-11-12 23:24:35 +04:00
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 :
2011-03-03 09:18:58 +03:00
bld . PUBLIC_HEADERS ( public_headers , header_path = header_path ,
public_headers_install = public_headers_install )
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 ,
2011-03-03 08:30:33 +03:00
public_headers_install = True ,
2010-03-27 05:55:38 +03:00
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
2012-09-06 14:14:34 +04:00
dep_vars = [ ]
if isinstance ( vars , dict ) :
dep_vars = vars . keys ( )
elif isinstance ( vars , list ) :
dep_vars = vars
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 ' ,
2010-12-08 07:03:35 +03:00
samba_type = ' GENERATOR ' ,
2012-09-06 14:14:34 +04:00
dep_vars = [ rule ] + dep_vars ,
2010-03-21 05:13:53 +03:00
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 :
2011-03-03 08:30:33 +03:00
bld . PUBLIC_HEADERS ( public_headers , header_path = header_path ,
public_headers_install = public_headers_install )
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-12-08 06:52:43 +03:00
bld . add_group ( ' vscripts ' )
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 ' )
2011-03-03 09:41:45 +03:00
bld . add_group ( ' headers ' )
2010-02-24 09:39:23 +03:00
bld . add_group ( ' main ' )
2010-10-30 04:07:40 +04:00
bld . add_group ( ' symbolcheck ' )
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
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
2012-09-27 20:30:47 +04:00
if installname is not None :
2010-03-17 12:12:16 +03:00
iname = installname
target = os . path . join ( installdir , iname )
tgtdir = os . path . dirname ( os . path . join ( bld . srcnode . abspath ( bld . env ) , ' .. ' , target ) )
mkdir_p ( tgtdir )
2011-06-01 05:43:52 +04:00
link_src = os . path . normpath ( os . path . join ( bld . curdir , s ) )
link_dst = os . path . join ( tgtdir , os . path . basename ( iname ) )
if os . path . islink ( link_dst ) and os . readlink ( link_dst ) == link_src :
continue
if os . path . exists ( link_dst ) :
os . unlink ( link_dst )
Logs . info ( " symlink: %s -> %s / %s " % ( s , installdir , iname ) )
os . symlink ( link_src , link_dst )
2010-03-17 12:12:16 +03:00
Build . BuildContext . SAMBA_SCRIPT = SAMBA_SCRIPT
2010-03-17 02:58:07 +03:00
2011-06-01 05:43:52 +04:00
2011-02-01 06:29:35 +03:00
def copy_and_fix_python_path ( task ) :
pattern = ' sys.path.insert(0, " bin/python " ) '
if task . env [ " PYTHONARCHDIR " ] in sys . path and task . env [ " PYTHONDIR " ] in sys . path :
replacement = " "
elif task . env [ " PYTHONARCHDIR " ] == task . env [ " PYTHONDIR " ] :
replacement = """ sys.path.insert(0, " %s " ) """ % task . env [ " PYTHONDIR " ]
else :
replacement = """ sys.path.insert(0, " %s " )
sys . path . insert ( 1 , " %s " ) """ % (task.env[ " PYTHONARCHDIR " ], task.env[ " PYTHONDIR " ])
2013-04-08 09:57:45 +04:00
shebang = None
if task . env [ " PYTHON " ] [ 0 ] == " / " :
2013-05-28 14:19:34 +04:00
replacement_shebang = " #! %s \n " % task . env [ " PYTHON " ]
2013-04-08 09:57:45 +04:00
else :
2013-05-28 14:19:34 +04:00
replacement_shebang = " #!/usr/bin/env %s \n " % task . env [ " PYTHON " ]
2013-04-08 09:57:45 +04:00
2011-02-01 06:29:35 +03:00
installed_location = task . outputs [ 0 ] . bldpath ( task . env )
source_file = open ( task . inputs [ 0 ] . srcpath ( task . env ) )
installed_file = open ( installed_location , ' w ' )
2013-04-08 09:57:45 +04:00
lineno = 0
2011-02-01 06:29:35 +03:00
for line in source_file :
newline = line
2013-04-08 09:57:45 +04:00
if lineno == 0 and task . env [ " PYTHON_SPECIFIED " ] == True and line [ : 2 ] == " #! " :
newline = replacement_shebang
elif pattern in line :
2011-02-01 06:29:35 +03:00
newline = line . replace ( pattern , replacement )
installed_file . write ( newline )
2013-04-08 09:57:45 +04:00
lineno = lineno + 1
2011-02-01 06:29:35 +03:00
installed_file . close ( )
os . chmod ( installed_location , 0755 )
return 0
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 '
bld . SAMBA_GENERATOR ( ' python_ %s ' % destname ,
2011-02-01 06:29:35 +03:00
rule = copy_and_fix_python_path ,
2010-03-27 11:12:10 +03:00
source = file ,
target = inst_file )
2011-06-15 07:53:19 +04:00
bld . add_manual_dependency ( bld . path . find_or_declare ( inst_file ) , bld . env [ " PYTHONARCHDIR " ] )
bld . add_manual_dependency ( bld . path . find_or_declare ( inst_file ) , bld . env [ " PYTHONDIR " ] )
2013-04-08 09:57:45 +04:00
bld . add_manual_dependency ( bld . path . find_or_declare ( inst_file ) , str ( bld . env [ " PYTHON_SPECIFIED " ] ) )
bld . add_manual_dependency ( bld . path . find_or_declare ( inst_file ) , bld . env [ " PYTHON " ] )
2010-03-27 11:12:10 +03:00
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
2012-12-04 18:03:40 +04:00
def MANPAGES ( bld , manpages , install ) :
2010-05-31 14:17:33 +04:00
''' 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 ' ,
2012-09-06 14:14:46 +04:00
rule = ' $ {XSLTPROC} --xinclude -o $ {TGT} --nonet $ {MAN_XSL} $ {SRC} '
2010-05-31 14:17:33 +04:00
)
2012-12-04 18:03:40 +04:00
if install :
bld . INSTALL_FILES ( ' $ {MANDIR} /man %s ' % m [ - 1 ] , m , flat = True )
2010-05-31 14:17:33 +04:00
Build . BuildContext . MANPAGES = MANPAGES
2012-09-11 19:50:26 +04:00
def SAMBAMANPAGES ( bld , manpages ) :
''' build and install manual pages '''
bld . env . SAMBA_EXPAND_XSL = bld . srcnode . abspath ( ) + ' /docs-xml/xslt/expand-sambadoc.xsl '
bld . env . SAMBA_MAN_XSL = bld . srcnode . abspath ( ) + ' /docs-xml/xslt/man.xsl '
2012-12-20 13:01:43 +04:00
bld . env . SAMBA_CATALOGS = ' file:///etc/xml/catalog file:///usr/local/share/xml/catalog file:// ' + bld . srcnode . abspath ( ) + ' /bin/default/docs-xml/build/catalog.xml '
2012-09-11 19:50:26 +04:00
for m in manpages . split ( ) :
source = m + ' .xml '
bld . SAMBA_GENERATOR ( m ,
source = source ,
target = m ,
group = ' final ' ,
2013-01-09 02:39:59 +04:00
rule = ''' XML_CATALOG_FILES= " $ {SAMBA_CATALOGS} "
export XML_CATALOG_FILES
2012-09-17 14:07:26 +04:00
$ { XSLTPROC } - - xinclude - - stringparam noreference 0 - o $ { TGT } . xml - - nonet $ { SAMBA_EXPAND_XSL } $ { SRC }
$ { XSLTPROC } - - nonet - o $ { TGT } $ { SAMBA_MAN_XSL } $ { TGT } . xml '''
2012-09-11 19:50:26 +04:00
)
bld . INSTALL_FILES ( ' $ {MANDIR} /man %s ' % m [ - 1 ] , m , flat = True )
Build . BuildContext . SAMBAMANPAGES = SAMBAMANPAGES
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