1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-11 16:58:40 +03:00
samba-mirror/source4/SConstruct

234 lines
6.5 KiB
Python
Raw Normal View History

#!/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
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},
)
# 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
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','sys/time.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'] + \
['security/pam_modules.h','security/_pam_macros.h','dlfcn.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','syscall.h','sys/syscall.h'] + \
['sys/acl.h','stdbool.h']:
if conf.CheckCHeader(h):
defines['HAVE_' + h.upper().replace('.','_').replace('/','_')] = 1
for f in ['dlopen','dlsym','dlerror','waitpid','getcwd','strdup'] + \
['strndup','strnlen','strerror','chroot','bzero','memset','strlcpy'] + \
['strlcat','memmove','vsnprintf','snprintf','asprintf','vasprintf'] + \
['setsid','pipe','crypt16','getauthuid','strftime','sigprocmask'] + \
['sigblock','sigaction','innetgr','setnetgrent','getnetgrent'] + \
['endnetgrent','initgroups','setgroups','sysconf','mktime','rename'] + \
['ftruncate','chsize','getpwanam','setlinebuf','srandom','random'] + \
['srand','rand','setenv','usleep','syslog','vsyslog','timegm'] + \
['backtrace','setbuffer','pread','pwrite']:
if conf.CheckFunc(f):
defines['HAVE_' + f.upper()] = 1
# Pull in GNU extensions
defines['_GNU_SOURCE'] = 1
needed_types = {
'uint_t': 'unsigned int',
'int8_t': 'signed char',
'uint8_t': 'unsigned char',
'int16_t': 'short',
'uint16_t': 'unsigned short',
'int32_t': 'long',
'uint32_t': 'unsigned long',
'int64_t': 'long long',
'uint64_t': 'unsigned long long'
}
type_headers = """
#include <stdint.h>
#include <sys/types.h>
"""
for t in needed_types:
if not conf.CheckType(t,type_headers):
defines[t] = needed_types[t]
for t in ['u_int32_t', 'u_int16_t', 'u_int8_t']:
if conf.CheckType(t, type_headers):
defines['HAVE_%s' % string.upper(t)] = 1
if conf.CheckType('comparison_fn_t', '#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')
conf.Finish()
[dynenv.Append(CPPDEFINES = {p: '\\"%s\\"' % paths[p]}) for p in paths]
dynconfig = dynenv.Object('dynconfig.c')
Export('dynconfig')
proto_files = []
Export('proto_files')
SConscript(
dirs=['lib','torture','rpc_server','cldap_server','libcli',
'nbt_server','client','ldap_server','libnet','nsswitch','web_server',
'smbd','dsdb','heimdal_build','ntptr','kdc','smb_server','ntvfs',
'winbind','scripting','auth'])
hostenv.CProtoHeader(target='include/proto.h',source=proto_files)
# 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})