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-02-23 03:53:59 +03:00
import Build , os , Logs , sys , Configure , Options
2010-02-20 16:24:28 +03:00
from Configure import conf
2010-02-22 03:59:06 +03:00
LIB_PATH = " shared "
2010-02-20 16:40:26 +03:00
2010-02-23 03:53:59 +03:00
######################################################
# this is used as a decorator to make functions only
# run once. Based on the idea from
# http://stackoverflow.com/questions/815110/is-there-a-decorator-to-simply-cache-function-return-values
runonce_ret = { }
def runonce ( function ) :
def wrapper ( * args ) :
if args in runonce_ret :
return runonce_ret [ args ]
else :
ret = function ( * args )
runonce_ret [ args ] = ret
return ret
return wrapper
2010-02-20 16:40:26 +03:00
####################################################
# some autoconf like helpers, to make the transition
# to waf a bit easier for those used to autoconf
# m4 files
2010-02-23 03:53:59 +03:00
@runonce
2010-02-20 16:24:28 +03:00
@conf
def DEFUN ( conf , d , v ) :
conf . define ( d , v , quote = False )
conf . env . append_value ( ' CCDEFINES ' , d + ' = ' + str ( v ) )
2010-02-23 03:53:59 +03:00
@runonce
def CHECK_HEADER ( conf , h ) :
if conf . check ( header_name = h ) :
conf . env . hlist . append ( h )
2010-02-20 16:24:28 +03:00
@conf
def CHECK_HEADERS ( conf , list ) :
2010-03-17 12:31:46 +03:00
for hdr in list . split ( ) :
2010-02-23 03:53:59 +03:00
CHECK_HEADER ( conf , hdr )
2010-02-20 16:24:28 +03:00
@conf
def CHECK_TYPES ( conf , list ) :
2010-03-17 12:31:46 +03:00
for t in list . split ( ) :
2010-02-20 16:24:28 +03:00
conf . check ( type_name = t , header_name = conf . env . hlist )
@conf
def CHECK_TYPE_IN ( conf , t , hdr ) :
if conf . check ( header_name = hdr ) :
conf . check ( type_name = t , header_name = hdr )
@conf
def CHECK_TYPE ( conf , t , alternate ) :
if not conf . check ( type_name = t , header_name = conf . env . hlist ) :
conf . DEFUN ( t , alternate )
2010-02-23 03:53:59 +03:00
@runonce
def CHECK_FUNC ( conf , f ) :
conf . check ( function_name = f , header_name = conf . env . hlist )
2010-02-20 16:24:28 +03:00
@conf
def CHECK_FUNCS ( conf , list ) :
2010-03-17 12:31:46 +03:00
for f in list . split ( ) :
2010-02-23 03:53:59 +03:00
CHECK_FUNC ( conf , f )
2010-02-20 16:24:28 +03:00
@conf
def CHECK_FUNCS_IN ( conf , list , library ) :
if conf . check ( lib = library , uselib_store = library ) :
2010-03-17 12:31:46 +03:00
for f in list . split ( ) :
2010-02-20 16:24:28 +03:00
conf . check ( function_name = f , lib = library , header_name = conf . env . hlist )
2010-03-17 12:32:15 +03:00
conf . env [ ' LIB_ ' + library . upper ( ) ] = library
2010-02-20 16:24:28 +03:00
2010-02-23 03:53:59 +03:00
2010-03-17 12:31:46 +03:00
#################################################
# write out config.h in the right directory
@conf
2010-02-23 00:30:28 +03:00
def SAMBA_CONFIG_H ( conf , path = None ) :
if os . path . normpath ( conf . curdir ) != os . path . normpath ( os . environ . get ( ' PWD ' ) ) :
return
if path is None :
conf . write_config_header ( ' config.h ' , top = True )
else :
2010-02-23 00:28:29 +03:00
conf . write_config_header ( path )
2010-03-17 12:31:46 +03:00
2010-02-21 05:55:58 +03:00
##############################################################
# setup a configurable path
@conf
def CONFIG_PATH ( conf , name , default ) :
if not name in conf . env :
conf . env [ name ] = conf . env [ ' PREFIX ' ] + default
conf . define ( name , conf . env [ name ] , quote = True )
2010-03-17 12:26:03 +03:00
##############################################################
# add some CFLAGS to the command line
@conf
def ADD_CFLAGS ( conf , flags ) :
conf . env . append_value ( ' CCFLAGS ' , flags . split ( ) )
2010-02-21 05:55:58 +03:00
2010-02-20 16:40:26 +03:00
################################################################
# magic rpath handling
#
2010-02-20 16:24:28 +03:00
# we want a different rpath when installing and when building
2010-02-20 16:40:26 +03:00
# Note that this should really check if rpath is available on this platform
2010-02-20 16:24:28 +03:00
# and it should also honor an --enable-rpath option
def set_rpath ( bld ) :
if Options . is_install :
2010-03-17 12:26:03 +03:00
if bld . env [ ' RPATH_ON_INSTALL ' ] :
bld . env [ ' RPATH ' ] = [ ' -Wl,-rpath= %s /lib ' % bld . env . PREFIX ]
else :
bld . env [ ' RPATH ' ] = [ ]
2010-02-20 16:24:28 +03:00
else :
2010-03-17 12:26:03 +03:00
rpath = os . path . normpath ( ' %s /bin/ %s ' % ( bld . curdir , LIB_PATH ) )
bld . env . append_value ( ' RPATH ' , ' -Wl,-rpath= %s ' % rpath )
2010-02-20 16:24:28 +03:00
Build . BuildContext . set_rpath = set_rpath
2010-03-17 12:26:03 +03:00
#############################################################
# a build assert call
def ASSERT ( ctx , expression , msg ) :
if not expression :
sys . stderr . write ( " ERROR: %s \n " % msg )
raise AssertionError
Build . BuildContext . ASSERT = ASSERT
2010-03-17 12:31:46 +03:00
################################################################
# create a list of files by pre-pending each with a subdir name
def SUBDIR ( bld , subdir , list ) :
ret = ' '
for l in list . split ( ) :
ret = ret + subdir + ' / ' + l + ' '
return ret
Build . BuildContext . SUBDIR = SUBDIR
2010-03-17 12:32:15 +03:00
#################################################################
# create the samba build environment
2010-02-22 03:59:06 +03:00
@conf
def SAMBA_BUILD_ENV ( conf ) :
libpath = " %s / %s " % ( conf . blddir , LIB_PATH )
if not os . path . exists ( libpath ) :
os . mkdir ( libpath )
2010-03-17 12:32:15 +03:00
2010-03-17 12:26:03 +03:00
##############################################
# remove .. elements from a path list
def NORMPATH ( bld , ilist ) :
return " " . join ( [ os . path . normpath ( p ) for p in ilist . split ( " " ) ] )
Build . BuildContext . NORMPATH = NORMPATH
2010-02-21 05:56:32 +03:00
2010-02-20 16:40:26 +03:00
################################################################
2010-02-20 16:24:28 +03:00
# this will contain the set of includes needed per Samba library
Build . BuildContext . SAMBA_LIBRARY_INCLUDES = { }
2010-03-17 12:26:03 +03:00
################################################################
# init function list for a subsystem
Build . BuildContext . SAMBA_INIT_FUNCTIONS = { }
################################################################
# add an init_function to the list for a subsystem
def ADD_INIT_FUNCTION ( bld , subsystem , init_function ) :
if init_function is None :
return
bld . ASSERT ( subsystem is not None , " You must specify a subsystem for init_function ' %s ' " % init_function )
if not subsystem in bld . SAMBA_INIT_FUNCTIONS :
bld . SAMBA_INIT_FUNCTIONS [ subsystem ] = ' '
bld . SAMBA_INIT_FUNCTIONS [ subsystem ] + = ' %s , ' % init_function
Build . BuildContext . ADD_INIT_FUNCTION = ADD_INIT_FUNCTION
2010-02-20 16:24:28 +03:00
#################################################################
# return a include list for a set of library dependencies
2010-03-17 12:26:03 +03:00
def SAMBA_LIBRARY_INCLUDE_LIST ( bld , deps ) :
2010-02-20 16:24:28 +03:00
ret = bld . curdir + ' '
2010-03-17 12:26:03 +03:00
for l in deps . split ( ) :
2010-02-20 16:24:28 +03:00
if l in bld . SAMBA_LIBRARY_INCLUDES :
ret = ret + bld . SAMBA_LIBRARY_INCLUDES [ l ] + ' '
return ret
Build . BuildContext . SAMBA_LIBRARY_INCLUDE_LIST = SAMBA_LIBRARY_INCLUDE_LIST
#################################################################
# define a Samba library
2010-03-17 12:31:46 +03:00
def SAMBA_LIBRARY ( bld , libname , source_list ,
2010-02-23 00:04:00 +03:00
deps = ' ' ,
public_deps = ' ' ,
include_list = ' . ' ,
2010-02-23 03:17:06 +03:00
public_headers = None ,
2010-02-23 00:04:00 +03:00
vnum = None ,
2010-02-23 00:56:35 +03:00
cflags = None ,
autoproto = None ) :
2010-02-23 03:17:06 +03:00
# print "Declaring SAMBA_LIBRARY %s" % libname
2010-03-17 12:26:03 +03:00
ilist = bld . SAMBA_LIBRARY_INCLUDE_LIST ( deps ) + bld . SUBDIR ( bld . curdir , include_list )
ilist = bld . NORMPATH ( ilist )
2010-02-20 16:24:28 +03:00
bld (
features = ' cc cshlib ' ,
source = source_list ,
target = libname ,
2010-03-17 12:26:03 +03:00
uselib_local = deps ,
2010-03-17 12:32:15 +03:00
includes = ' . ' + os . environ . get ( ' PWD ' ) + ' /bin/default ' + ilist ,
2010-03-17 12:31:46 +03:00
vnum = vnum )
2010-03-17 12:32:15 +03:00
2010-02-22 03:59:06 +03:00
# put a link to the library in bin/shared
2010-03-17 12:32:15 +03:00
soext = " "
if vnum is not None :
soext = ' . ' + vnum . split ( ' . ' ) [ 0 ]
bld (
source = ' lib %s .so ' % libname ,
2010-02-22 03:59:06 +03:00
target = ' %s .lnk ' % libname ,
rule = ' ln -sf ../$ {SRC} %s %s /lib %s .so %s && touch $ {TGT} ' %
( soext , LIB_PATH , libname , soext ) ,
shell = True
2010-03-17 12:32:15 +03:00
)
2010-02-20 16:24:28 +03:00
bld . SAMBA_LIBRARY_INCLUDES [ libname ] = ilist
Build . BuildContext . SAMBA_LIBRARY = SAMBA_LIBRARY
2010-03-17 12:26:03 +03:00
2010-02-20 16:24:28 +03:00
#################################################################
# define a Samba binary
2010-02-23 00:04:00 +03:00
def SAMBA_BINARY ( bld , binname , source_list ,
deps = ' ' ,
syslibs = ' ' ,
include_list = ' ' ,
2010-02-23 03:17:06 +03:00
public_headers = None ,
2010-02-23 00:04:00 +03:00
modules = None ,
installdir = None ,
ldflags = None ,
2010-02-23 00:56:35 +03:00
cflags = None ,
2010-02-23 01:04:44 +03:00
autoproto = None ,
manpages = None ) :
2010-03-17 12:26:03 +03:00
ilist = ' . ' + os . environ . get ( ' PWD ' ) + ' /bin/default ' + bld . SAMBA_LIBRARY_INCLUDE_LIST ( deps ) + ' ' + include_list
ilist = bld . NORMPATH ( ilist )
ccflags = ' '
if modules is not None :
for m in modules . split ( ) :
bld . ASSERT ( m in bld . SAMBA_INIT_FUNCTIONS ,
" No init_function defined for module ' %s ' in binary ' %s ' " % ( m , binname ) )
modlist = bld . SAMBA_INIT_FUNCTIONS [ m ]
ccflags + = ' -DSTATIC_ %s _MODULES= " %s " ' % ( m , modlist )
2010-02-20 16:24:28 +03:00
bld (
features = ' cc cprogram ' ,
source = source_list ,
target = binname ,
2010-03-17 12:26:03 +03:00
uselib_local = deps ,
2010-03-17 12:32:15 +03:00
uselib = syslibs ,
2010-03-17 12:26:03 +03:00
includes = ilist ,
ccflags = ccflags ,
2010-03-17 12:32:15 +03:00
top = True )
# put a link to the binary in bin/
bld (
source = binname ,
rule = ' ln -sf $ {SRC} . ' ,
)
2010-02-20 16:24:28 +03:00
Build . BuildContext . SAMBA_BINARY = SAMBA_BINARY
2010-03-17 12:26:03 +03:00
2010-02-23 00:04:00 +03:00
#################################################################
# define a Samba python module
def SAMBA_PYTHON ( bld , name , source_list ,
deps = ' ' ,
public_deps = ' ' ,
realname = ' ' ) :
Logs . debug ( ' runner: PYTHON_SAMBA not implemented ' )
return
Build . BuildContext . SAMBA_PYTHON = SAMBA_PYTHON
2010-03-17 12:26:03 +03:00
################################################################
# build a C prototype file automatically
def AUTOPROTO ( bld , header , source_list ) :
if header is not None :
bld (
source = source_list ,
target = header ,
rule = ' ../script/mkproto.pl --srcdir=.. --builddir=. --public=/dev/null --private=$ {TGT} $ {SRC} '
)
Build . BuildContext . AUTOPROTO = AUTOPROTO
#################################################################
# define a Samba module.
def SAMBA_MODULE ( bld , modname , source_list ,
2010-02-23 00:04:00 +03:00
deps = ' ' ,
include_list = ' . ' ,
2010-03-17 12:26:03 +03:00
subsystem = None ,
init_function = None ,
2010-02-23 00:04:00 +03:00
autoproto = None ,
aliases = None ,
cflags = None ,
output_type = None ) :
2010-03-17 12:26:03 +03:00
bld . ADD_INIT_FUNCTION ( subsystem , init_function )
bld . AUTOPROTO ( autoproto , source_list )
bld . SAMBA_LIBRARY ( modname , source_list ,
deps = deps , include_list = include_list )
Build . BuildContext . SAMBA_MODULE = SAMBA_MODULE
#################################################################
# define a Samba subsystem
def SAMBA_SUBSYSTEM ( bld , modname , source_list ,
2010-02-23 00:04:00 +03:00
deps = ' ' ,
public_deps = ' ' ,
include_list = ' . ' ,
2010-02-23 03:17:06 +03:00
public_headers = None ,
2010-02-23 00:04:00 +03:00
autoproto = None ,
cflags = None ,
init_function_sentinal = None ) :
2010-03-17 12:26:03 +03:00
bld . SAMBA_LIBRARY ( modname , source_list ,
deps = deps , include_list = include_list )
Build . BuildContext . SAMBA_SUBSYSTEM = SAMBA_SUBSYSTEM
2010-02-23 03:16:44 +03:00
###############################################################
# add a new set of build rules from a subdirectory
def BUILD_SUBDIR ( bld , dir ) :
try :
cache = bld . cache_build_subdirs
except AttributeError :
bld . cache_build_subdirs = cache = { }
abs_dir = os . path . normpath ( bld . curdir + ' / ' + dir )
if abs_dir in cache :
return
cache [ abs_dir ] = True
bld . add_subdirs ( dir )
Build . BuildContext . BUILD_SUBDIR = BUILD_SUBDIR
2010-02-20 16:40:26 +03:00
############################################################
2010-03-17 12:31:46 +03:00
# this overrides the 'waf -v' debug output to be in a nice
# unix like format instead of a python list.
# Thanks to ita on #waf for this
2010-02-20 16:24:28 +03:00
def exec_command ( self , cmd , * * kw ) :
2010-03-17 12:31:46 +03:00
import Utils , Logs
2010-02-20 16:24:28 +03:00
_cmd = cmd
if isinstance ( cmd , list ) :
_cmd = ' ' . join ( cmd )
2010-03-17 12:31:46 +03:00
Logs . debug ( ' runner: %s ' % _cmd )
2010-02-20 16:24:28 +03:00
if self . log :
self . log . write ( ' %s \n ' % cmd )
kw [ ' log ' ] = self . log
try :
if not kw . get ( ' cwd ' , None ) :
kw [ ' cwd ' ] = self . cwd
except AttributeError :
self . cwd = kw [ ' cwd ' ] = self . bldnode . abspath ( )
return Utils . exec_command ( cmd , * * kw )
Build . BuildContext . exec_command = exec_command
2010-03-17 12:31:46 +03:00