mirror of
https://github.com/samba-team/samba.git
synced 2025-02-28 01:58:17 +03:00
259 lines
6.7 KiB
Python
259 lines
6.7 KiB
Python
#!/usr/bin/env python
|
|
|
|
# This is the experimental scons build script for Samba 4. For a proper
|
|
# build use the old build system (configure + make). scons may
|
|
# eventually replace this system.
|
|
#
|
|
# Copyright (C) 2005 Jelmer Vernooij <jelmer@samba.org>
|
|
# Published under the GNU GPL
|
|
#
|
|
# TODO:
|
|
# - finish fallback code
|
|
# - support for init functions
|
|
# - separate config file for lib/replace/
|
|
# - Subsystem() ?
|
|
|
|
import cPickle, string, os
|
|
|
|
opts = Options(None, ARGUMENTS)
|
|
opts.AddOptions(
|
|
BoolOption('developer','enable developer flags', False),
|
|
PathOption('prefix','installation prefix','/usr/local/samba'),
|
|
BoolOption('configure','run configure checks', False),
|
|
)
|
|
|
|
hostenv = Environment(
|
|
toolpath=['build/scons','.'],
|
|
tools=['default','pidl','proto','et','asn1'],
|
|
options=opts,
|
|
CPPPATH=['#include','#','#lib'],
|
|
CPPDEFINES={'_SAMBA_BUILD_': None},
|
|
)
|
|
|
|
hostenv.Help(opts.GenerateHelpText(hostenv))
|
|
|
|
# We don't care about NFS builds...
|
|
hostenv.SetOption('max_drift', 1)
|
|
|
|
if hostenv['developer']:
|
|
hostenv.Append(CCFLAGS='-Wall')
|
|
hostenv.Append(CCFLAGS='-Wshadow')
|
|
hostenv.Append(CCFLAGS='-Werror-implicit-function-declaration')
|
|
hostenv.Append(CCFLAGS='-Wstrict-prototypes')
|
|
hostenv.Append(CCFLAGS='-Wpointer-arith')
|
|
hostenv.Append(CCFLAGS='-Wcast-qual')
|
|
hostenv.Append(CCFLAGS='-Wcast-align')
|
|
hostenv.Append(CCFLAGS='-Wwrite-strings')
|
|
hostenv.Append(CCFLAGS='-Wmissing-format-attribute')
|
|
hostenv.Append(CCFLAGS='-Wformat=2')
|
|
hostenv.Append(CCFLAGS='-Wno-format-y2k')
|
|
hostenv.Append(CCFLAGS='-Wno-declaration-after-statement')
|
|
|
|
# Some tools get confused if $HOME isn't defined
|
|
hostenv.Append(ENV={'HOME': os.environ['HOME']})
|
|
|
|
# Store configuration data in a dictionary.
|
|
|
|
def saveconfig(data):
|
|
"""Save configuration dict to a file."""
|
|
cached = cPickle.dump(data, open('sconf.cache', 'w'))
|
|
|
|
def loadconfig():
|
|
"""Load configuration dict from a file."""
|
|
try:
|
|
return cPickle.load(open('sconf.cache', 'r'))
|
|
except IOError:
|
|
return None
|
|
|
|
defines = loadconfig()
|
|
|
|
if defines == None:
|
|
hostenv['configure'] = 1
|
|
|
|
if hostenv['configure']:
|
|
defines = {}
|
|
|
|
Export('defines')
|
|
|
|
hostenv.Append(CPPPATH = ['#heimdal_build', '#heimdal/lib/krb5',
|
|
'#heimdal/lib/hdb', '#heimdal/lib/gssapi',
|
|
'#heimdal/lib/asn1', '#heimdal/lib/des',
|
|
'#heimdal/kdc', '#heimdal/lib/roken',
|
|
'#heimdal/lib/com_err'])
|
|
|
|
Export('hostenv')
|
|
|
|
buildenv = hostenv
|
|
|
|
Export('buildenv')
|
|
|
|
cross_compiling = 0
|
|
|
|
if cross_compiling:
|
|
buildenv = hostenv.Copy()
|
|
buildenv.BuildDir('build-env','.')
|
|
|
|
dynenv = hostenv.Copy()
|
|
|
|
paths = {
|
|
'BINDIR': 'bin',
|
|
'SBINDIR': 'sbin',
|
|
'CONFIGFILE': 'cfg',
|
|
'LOGFILEBASE': 'lfb',
|
|
'NCALRPCDIR': 'ncalrpc',
|
|
'LMHOSTSFILE': 'lmhosts',
|
|
'LIBDIR': 'libdir',
|
|
'SHLIBEXT': 'ext',
|
|
'LOCKDIR': 'lockdir',
|
|
'PIDDIR': 'piddir',
|
|
'PRIVATE_DIR': 'private',
|
|
'SWATDIR': 'swat'
|
|
}
|
|
|
|
Export('paths')
|
|
|
|
if hostenv['configure']:
|
|
|
|
conf = hostenv.Configure()
|
|
|
|
for h in ['sys/select.h','fcntl.h','sys/fcntl.h'] + \
|
|
['utime.h','grp.h','sys/id.h','limits.h','memory.h'] + \
|
|
['compat.h','math.h','sys/param.h','ctype.h','sys/wait.h'] + \
|
|
['sys/resource.h','sys/ioctl.h','sys/ipc.h','sys/mode.h'] + \
|
|
['sys/mman.h','sys/filio.h','sys/priv.h','sys/shm.h','string.h'] + \
|
|
['strings.h','stdlib.h','sys/vfs.h','sys/fs/s5param.h','sys/filsys.h'] + \
|
|
['termios.h','termio.h','fnmatch.h','pwd.h','sys/termio.h'] + \
|
|
['sys/time.h','sys/statfs.h','sys/statvfs.h','stdarg.h'] + \
|
|
['sys/syslog.h','syslog.h','stdint.h','inttypes.h','locale.h'] + \
|
|
['shadow.h','nss.h','nss_common.h','ns_api.h','sys/security.h'] + \
|
|
['security/pam_appl.h','sys/capability.h'] + \
|
|
['sys/acl.h','stdbool.h', 'netinet/in.h', 'sys/socket.h', 'arpa/inet.h', 'netdb.h']:
|
|
if conf.CheckCHeader(h):
|
|
defines['HAVE_' + h.upper().replace('.','_').replace('/','_')] = 1
|
|
|
|
for f in ['setsid','pipe','crypt16','getauthuid','strftime','sigprocmask',
|
|
'sigblock','sigaction','initgroups','setgroups','sysconf', 'getpwanam',
|
|
'setlinebuf','srandom','random','srand','rand','usleep','timegm',
|
|
'backtrace','setbuffer']:
|
|
if conf.CheckFunc(f):
|
|
defines['HAVE_' + f.upper()] = 1
|
|
|
|
# Pull in GNU extensions
|
|
defines['_GNU_SOURCE'] = 1
|
|
|
|
# Hardcode signal return type for now
|
|
defines['RETSIGTYPE'] = 'void'
|
|
|
|
if conf.CheckType('comparison_fn_t', '#define _GNU_SOURCE\n#include <stdlib.h>'):
|
|
defines['HAVE_COMPARISON_FN_T'] = 1
|
|
|
|
if conf.CheckType('sig_atomic_t', '#include <signal.h>'):
|
|
defines['HAVE_SIG_ATOMIC_T_TYPE'] = 1
|
|
|
|
if conf.TryCompile("""
|
|
#include <sys/types.h>
|
|
|
|
int main()
|
|
{
|
|
volatile int i = 0;
|
|
return 0;
|
|
}""", '.c'):
|
|
defines['HAVE_VOLATILE'] = 1
|
|
|
|
if conf.TryCompile("""
|
|
#include <stdio.h>
|
|
|
|
int main()
|
|
{
|
|
typedef struct {unsigned x;} FOOBAR;
|
|
#define X_FOOBAR(x) ((FOOBAR) { x })
|
|
#define FOO_ONE X_FOOBAR(1)
|
|
FOOBAR f = FOO_ONE;
|
|
static struct {
|
|
FOOBAR y;
|
|
} f2[] = {
|
|
{FOO_ONE}
|
|
};
|
|
return 0;
|
|
}""", '.c'):
|
|
defines['HAVE_IMMEDIATE_STRUCTURES'] = 1
|
|
|
|
hostenv.AlwaysBuild('include/config.h')
|
|
|
|
if conf.TryCompile("""
|
|
#include <sys/types.h>
|
|
#include <sys/time.h>
|
|
#include <time.h>
|
|
|
|
int
|
|
main ()
|
|
{
|
|
if ((struct tm *) 0)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
""", '.c'):
|
|
defines['TIME_WITH_SYS_TIME'] = 1
|
|
|
|
if conf.TryCompile("""
|
|
#include <sys/time.h>
|
|
#include <unistd.h>
|
|
main() { struct timeval tv; exit(gettimeofday(&tv, NULL));}
|
|
""", '.c'):
|
|
defines['HAVE_GETTIMEOFDAY_TZ'] = 1
|
|
|
|
# Check for header that defines "DIR"
|
|
for h in ['dirent.h','sys/ndir.h','sys/dir.h','ndir.h']:
|
|
if conf.TryCompile("""
|
|
#include <%s>
|
|
|
|
int main() { DIR *x; return 0; }""" % h, '.c'):
|
|
defines['HAVE_' + h.upper().replace('.','_').replace('/','_')] = 1
|
|
break
|
|
|
|
conf.Finish()
|
|
|
|
[dynenv.Append(CPPDEFINES = {p: '\\"%s\\"' % paths[p]}) for p in paths]
|
|
|
|
dynconfig = dynenv.Object('dynconfig.c')
|
|
Export('dynconfig')
|
|
|
|
hostenv.proto_headers = []
|
|
|
|
SConscript(
|
|
dirs=['dsdb', 'libcli', 'lib','torture','rpc_server','cldap_server',
|
|
'nbt_server','client','ldap_server','libnet','nsswitch','web_server',
|
|
'smbd','dsdb','heimdal_build','ntptr','kdc','smb_server','ntvfs',
|
|
'winbind','scripting','auth', 'librpc','script/tests'])
|
|
|
|
# proto.h
|
|
|
|
def create_global_proto(env, target, source):
|
|
fd = open(str(target[0]), 'w')
|
|
[fd.write('#include "%s"\n' % x) for x in source]
|
|
fd.close()
|
|
|
|
def create_global_proto_print(*args, **kwargs):
|
|
print 'Building global proto.h'
|
|
|
|
hostenv.Command('include/proto.h', hostenv.proto_headers,
|
|
Action(create_global_proto, create_global_proto_print))
|
|
|
|
# Save configuration
|
|
|
|
if hostenv['configure']:
|
|
saveconfig(defines)
|
|
|
|
# How to create config.h file
|
|
def create_config_h(env, target, source):
|
|
fd = open(str(target[0]), 'w')
|
|
[fd.write('#define %s %s\n' % (x, defines[x])) for x in defines]
|
|
fd.close()
|
|
|
|
def create_config_h_print(*args, **kwargs):
|
|
print 'Building config.h'
|
|
|
|
hostenv.Command('include/config.h', [],
|
|
Action(create_config_h, create_config_h_print))
|
|
hostenv.Append(CPPDEFINES = {'HAVE_CONFIG_H': 1})
|