summaryrefslogtreecommitdiff
path: root/source3/wscript
blob: ef682c5e11974fcdc4aadc33d1cbac0f0de550e2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#! /usr/bin/env python

srcdir = '..'
blddir = 'bin'

import sys, os
sys.path.insert(0, srcdir+"/buildtools/wafsamba")
import wafsamba, Options

def set_options(opt):
    opt.recurse('../lib/replace')
    opt.recurse('../lib/nss_wrapper')
    opt.recurse('../lib/socket_wrapper')
    opt.recurse('../lib/uid_wrapper')

def configure(conf):
    conf.define('PACKAGE_NAME', 'Samba')
    conf.define('PACKAGE_STRING', 'Samba 3')
    conf.define('PACKAGE_TARNAME', 'samba')
    conf.define('PACKAGE_URL', '')
    conf.define('PACKAGE_VERSION', '3')
    conf.define('PACKAGE_BUGREPORT', 'samba-technical@samba.org')

    conf.DEFINE('CONFIG_H_IS_FROM_SAMBA', 1)
    conf.DEFINE('_SAMBA_BUILD_', 3, add_to_cflags=True)
    conf.DEFINE('HAVE_CONFIG_H', 1, add_to_cflags=True)
    if Options.options.developer:
        conf.ADD_CFLAGS('-DDEVELOPER -DDEBUG_PASSWORD')

    # set a limit on recursing in the waf preprocessor
    conf.env.preprocessor_recursion_limit = 10

    conf.ADD_EXTRA_INCLUDES('#source3 #source3/include #lib/replace #lib/talloc #lib/tevent #source3/libaddns #source3/librpc')

    conf.sub_config('../lib/replace')
    conf.sub_config('../lib/nss_wrapper')
    conf.sub_config('../lib/socket_wrapper')
    conf.sub_config('../lib/uid_wrapper')

    conf.CHECK_HEADERS('execinfo.h libexc.h libunwind.h')

    conf.CHECK_FUNCS('getcwd fchown chmod fchmod mknod mknod64')
    conf.CHECK_FUNCS('strtol strchr strupr chflags')
    conf.CHECK_FUNCS('getrlimit fsync fdatasync setpgid')
    conf.CHECK_FUNCS('setsid glob strpbrk crypt16 getauthuid')
    conf.CHECK_FUNCS('sigprocmask sigblock sigaction sigset innetgr setnetgrent getnetgrent endnetgrent')
    conf.CHECK_FUNCS('initgroups select poll rdchk getgrnam getgrent pathconf')
    conf.CHECK_FUNCS('setpriv setgidx setuidx setgroups sysconf stat64 fstat64')
    conf.CHECK_FUNCS('lstat64 fopen64 atexit grantpt lseek64 ftruncate64 posix_fallocate posix_fallocate64')
    conf.CHECK_FUNCS('fseek64 fseeko64 ftell64 ftello64 setluid getpwanam')
    conf.CHECK_FUNCS('opendir64 readdir64 seekdir64 telldir64 rewinddir64 closedir64')
    conf.CHECK_FUNCS('getpwent_r getdents64 setenv strcasecmp fcvt fcvtl')
    conf.CHECK_FUNCS('syslog vsyslog timegm setlocale nl_langinfo')
    #TODO convert AC_CHECK_FUNCS(nanosleep,,[AC_CHECK_LIB_EXT(rt, LIBS, nanosleep)])
    conf.CHECK_FUNCS('lutimes futimes utimensat futimens')
    conf.CHECK_FUNCS('mlock munlock mlockall munlockall')
    conf.CHECK_FUNCS('memalign posix_memalign hstrerror')
    conf.CHECK_FUNCS('shmget shm_open')
    conf.CHECK_FUNCS('gettext dgettext bindtextdomain textdomain')

    # Check for inotify support
    conf.CHECK_HEADERS('linux/inotify.h asm/unistd.h sys/inotify.h', add_headers=False)
    conf.CHECK_FUNCS('inotify_init')
    if "HAVE_LINUX_INOTIFY_H" in conf.env and "HAVE_INOTIFY_INIT" in conf.env:
        conf.DEFINE('HAVE_INOTIFY', 1)

    # Check for kernel change notify support
    conf.CHECK_CODE('''
#include <sys/types.h>
#include <fcntl.h>
#include <signal.h>
#ifndef F_NOTIFY
#define F_NOTIFY 1026
#endif
main() {
        exit(fcntl(open("/tmp", O_RDONLY), F_NOTIFY, 0) == -1 ?  1 : 0);
}''', 'HAVE_KERNEL_CHANGE_NOTIFY', addmain=False, execute=True,
        msg="Checking for kernel change notify support")

    # Check for Linux kernel oplocks
    conf.CHECK_CODE('''
#include <sys/types.h>
#include <fcntl.h>
#include <signal.h>
#ifndef F_NOTIFY
#define F_NOTIFY 1026
#endif
main() {
        exit(fcntl(open("/tmp", O_RDONLY), F_NOTIFY, 0) == -1 ?  1 : 0);
}''', 'HAVE_KERNEL_OPLOCKS_LINUX', addmain=False, execute=True,
        msg="Checking for Linux kernel oplocks")

    # Check for IRIX kernel oplock types
    conf.CHECK_CODE('oplock_stat_t t; t.os_state = OP_REVOKE; t.os_dev = 1; t.os_ino = 1;',
                    'HAVE_KERNEL_OPLOCKS_IRIX', headers='sys/types.h fcntl.h',
                    msg="Checking for IRIX kernel oplock types")

    # Check for krenel share modes
    conf.CHECK_CODE('''
#include <sys/types.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/file.h>
#ifndef LOCK_MAND
#define LOCK_MAND	32
#define LOCK_READ	64
#endif
main() {
        exit(flock(open("/dev/null", O_RDWR), LOCK_MAND|LOCK_READ) != 0);
}''', 'HAVE_KERNEL_SHARE_MODES', addmain=False, execute=True,
        msg="Checking for krenel share modes")

    # Check for various members of the stat structure
    conf.CHECK_TYPES('blksize_t blkcnt_t')
    conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_blocks', define='HAVE_STAT_ST_BLOCKS',
                                headers='sys/types.h sys/stat.h unistd.h',)
    conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_blksize', define='HAVE_STAT_ST_BLKSIZE',
                                headers='sys/types.h sys/stat.h unistd.h')

    # Check for POSIX capability support
    if "HAVE_SYS_CAPABILITY_H" in conf.env:
        conf.CHECK_FUNCS_IN('cap_get_proc', 'cap')
        conf.CHECK_CODE('''
#include <sys/types.h>
#include <sys/capability.h>
main() {
 cap_t cap;
 cap_value_t vals[1];
 if (!(cap = cap_get_proc()))
   exit(1);
 vals[0] = CAP_CHOWN;
 cap_set_flag(cap, CAP_INHERITABLE, 1, vals, CAP_CLEAR);
 cap_set_proc(cap);
 exit(0);
 }''', 'HAVE_POSIX_CAPABILITIES', addmain=False, execute=True, cflags="-lcap",
            msg="Checking whether POSIX capabilities are available")

    # Check for int16, uint16, int32 and uint32 in rpc/types.h included from
    # rpc/rpc.h. This is *really* broken but some systems (DEC OSF1) do this.
    # -- JRA.
    if "HAVE_RPC_RPC_H" in conf.env:
        conf.CHECK_CODE('int16 testvar;', 'HAVE_INT16_FROM_RPC_RPC_H',
                        headers='sys/types.h rpc/rpc.h',
                        msg="Checking for int16 typedef included by rpc/rpc.h")
        conf.CHECK_CODE('uint16 testvar;', 'HAVE_INT16_FROM_RPC_RPC_H',
                        headers='sys/types.h rpc/rpc.h',
                        msg="Checking for uint16 typedef included by rpc/rpc.h")
        conf.CHECK_CODE('int32 testvar;', 'HAVE_INT16_FROM_RPC_RPC_H',
                        headers='sys/types.h rpc/rpc.h',
                        msg="Checking for int32 typedef included by rpc/rpc.h")
        conf.CHECK_CODE('uint32 testvar;', 'HAVE_INT16_FROM_RPC_RPC_H',
                        headers='sys/types.h rpc/rpc.h',
                        msg="Checking for uint32 typedef included by rpc/rpc.h")

    # Check if the compiler will optimize out functions
    conf.CHECK_CODE('''
if (0) {
    this_function_does_not_exist();
} else {
    return 1;
}''', 'HAVE_COMPILER_WILL_OPTIMIZE_OUT_FNS',
        msg="Checking if the compiler will optimize out functions")

    # Look for CUPS
    conf.find_program('cups-config', var='CUPS_CONFIG')
    if conf.env.CUPS_CONFIG:
        conf.check_cfg(path="cups-config", args="--cflags --ldflags --libs", package="", uselib_store="CUPS")
        conf.CHECK_HEADERS('cups/cups.h cups/language.h', add_headers=False)

    # Check for LDAP
    conf.CHECK_HEADERS('ldap.h lber.h')
    conf.CHECK_TYPE('ber_tag_t', 'unsigned int')

    # Check for kerberos
    conf.find_program('krb5-config', var='KRB5_CONFIG')
    if conf.env.KRB5_CONFIG:
        conf.check_cfg(path="krb5-config", args="--cflags --libs",
                       package="gssapi", uselib_store="KRB5")
        conf.CHECK_HEADERS('krb5.h krb5/locate_plugin.h')
        conf.CHECK_HEADERS('gssapi.h gssapi/gssapi_generic.h gssapi/gssapi.h com_err.h')

    conf.SAMBA_CONFIG_H('include/config.h')