summaryrefslogtreecommitdiff
path: root/lib/replace/wscript
blob: 405e80136b90823621e024368a94dd09c6d8b66e (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
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
#! /usr/bin/env python

srcdir = '../..'
blddir = 'bin'

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

def set_options(opt):
    opt.tool_options('compiler_cc')
    # TODO: we are not yet obeying these default paths at install time
    opt.add_option('--libdir',
                   help=("object code libraries [PREFIX/lib"),
                   action="store", dest='LIBDIR', default='${PREFIX}/lib')
    opt.add_option('--bindir',
                   help=("user executables [PREFIX/bin]"),
                   action="store", dest='BINDIR', default='${PREFIX}/bin')
    opt.add_option('--sbindir',
                   help=("system admin executables [PREFIX/sbin]"),
                   action="store", dest='SBINDIR', default='${PREFIX}/sbin')
    opt.add_option('--enable-rpath',
                   help=("Enable use of rpath for installed binaries"),
                   action="store_true", dest='enable_rpath', default=False)
    opt.add_option('--enable-developer',
                   help=("Turn on developer warnings and debugging"),
                   action="store_true", dest='developer', default=False)

@wafsamba.runonce
def configure(conf):
    conf.env.hlist = []
    conf.env.srcdir = conf.srcdir

    # load our local waf extensions
    conf.check_tool('wafsamba', tooldir=conf.srcdir + "/buildtools/wafsamba")

    conf.check_tool('compiler_cc')

    # make the install paths available in environment
    conf.env.LIBDIR = Options.options.LIBDIR
    conf.env.BINDIR = Options.options.BINDIR
    conf.env.SBINDIR = Options.options.SBINDIR

    conf.env.RPATH_ON_INSTALL = Options.options.enable_rpath

    # check for pkgconfig
    conf.check_cfg(atleast_pkgconfig_version='0.0.0')

    conf.DEFINE('_GNU_SOURCE', 1)
    conf.DEFINE('_XOPEN_SOURCE_EXTENDED', 1)
    conf.DEFINE('LIBREPLACE_NETWORK_CHECKS', 1)

    conf.CHECK_HEADERS('unistd.h sys/types.h stdlib.h stdio.h stddef.h')
    conf.CHECK_HEADERS('ctype.h locale.h acl/libacl.h compat.h')
    conf.CHECK_HEADERS('acl/libacl.h attr/xattr.h compat.h ctype.h dustat.h')
    conf.CHECK_HEADERS('fcntl.h fnmatch.h glob.h history.h krb5.h langinfo.h')
    conf.CHECK_HEADERS('libaio.h locale.h ndir.h net/if.h pwd.h readline.h')
    conf.CHECK_HEADERS('readline/history.h readline/readline.h shadow.h sys/acl.h')
    conf.CHECK_HEADERS('sys/attributes.h sys/capability.h sys/dir.h sys/epoll.h')
    conf.CHECK_HEADERS('sys/fcntl.h sys/filio.h sys/filsys.h sys/fs/s5param.h sys/fs/vx/quota.h')
    conf.CHECK_HEADERS('sys/id.h sys/ioctl.h sys/ipc.h sys/mman.h sys/mode.h sys/ndir.h sys/priv.h')
    conf.CHECK_HEADERS('sys/resource.h sys/security.h sys/shm.h sys/statfs.h sys/statvfs.h sys/termio.h')
    conf.CHECK_HEADERS('sys/vfs.h sys/xattr.h termio.h termios.h')
    conf.CHECK_HEADERS('sys/wait.h sys/stat.h malloc.h grp.h')
    conf.CHECK_HEADERS('crypt.h dlfcn.h dl.h standards.h stdbool.h stdint.h')
    conf.CHECK_HEADERS('sys/select.h setjmp.h utime.h sys/syslog.h syslog.h')
    conf.CHECK_HEADERS('sys/time.h time.h stdarg.h vararg.h sys/mount.h mntent.h')
    conf.CHECK_HEADERS('stropts.h unix.h string.h strings.h sys/param.h limits.h')
    conf.CHECK_HEADERS('sys/socket.h netinet/in.h netdb.h arpa/inet.h netinet/in_systm.h')
    conf.CHECK_HEADERS('netinet/ip.h netinet/tcp.h netinet/in_ip.h sys/sockio.h sys/un.h')
    conf.CHECK_HEADERS('sys/uio.h ifaddrs.h direct.h dirent.h')
    conf.CHECK_HEADERS('windows.h winsock2.h ws2tcpip.h')
    conf.CHECK_HEADERS('resolv.h libintl.h errno.h')
    conf.CHECK_HEADERS('execinfo.h gcrypt.h getopt.h iconv.h')
    conf.CHECK_HEADERS('sys/inotify.h memory.h nss.h popt.h sasl/sasl.h')
    conf.CHECK_HEADERS('security/pam_appl.h sys/inotify.h zlib.h asm/unistd.h')

    if 'HAVE_STDDEF_H' in conf.env and 'HAVE_STDLIB_H' in conf.env:
        conf.DEFINE('STDC_HEADERS', 1)

    if 'HAVE_SYS_TIME_H' in conf.env and 'HAVE_TIME_H' in conf.env:
        conf.DEFINE('TIME_WITH_SYS_TIME', 1)

    conf.define('SHLIBEXT', "so", quote=True)

    conf.check(type_name='long long')
    conf.CHECK_TYPES('intptr_t uintptr_t ptrdiff_t')
    conf.CHECK_TYPES('comparison_fn_t socklen_t bool')

    conf.CHECK_TYPE('int8_t', 'char')
    conf.CHECK_TYPE('int16_t', 'short')
    conf.CHECK_TYPE('uint16_t', 'unsigned short')
    conf.CHECK_TYPE('int32_t', 'int')
    conf.CHECK_TYPE('uint32_t', 'unsigned')
    conf.CHECK_TYPE('int64_t', 'long long')
    conf.CHECK_TYPE('uint64_t', 'unsigned long long')
    conf.CHECK_TYPE('size_t', 'unsigned int')
    conf.CHECK_TYPE('ssize_t', 'int')
    conf.CHECK_TYPE('ino_t', 'unsigned')
    conf.CHECK_TYPE('loff_t', 'off_t')
    conf.CHECK_TYPE('bool', 'off_t')

    conf.CHECK_TYPE_IN('struct ifaddrs', 'ifaddrs.h')
    conf.CHECK_TYPE_IN('struct addrinfo', 'netdb.h')
    conf.CHECK_TYPE_IN('struct sockaddr', 'sys/socket.h')

    conf.CHECK_FUNCS('shl_load shl_unload shl_findsym')
    conf.CHECK_FUNCS('pipe strftime srandom random srand rand usleep setbuffer')
    conf.CHECK_FUNCS('lstat getpgrp utime utimes seteuid setresuid setegid')
    conf.CHECK_FUNCS('setresgid chroot bzero strerror vsyslog setlinebuf mktime')
    conf.CHECK_FUNCS('ftruncate chsize rename waitpid wait4 strlcpy strlcat')
    conf.CHECK_FUNCS('initgroups memmove strdup pread pwrite strndup strcasestr')
    conf.CHECK_FUNCS('strtok_r mkdtemp dup2 dprintf vdprintf isatty chown lchown')
    conf.CHECK_FUNCS('link readlink symlink realpath fdatasync snprintf vsnprintf')
    conf.CHECK_FUNCS('asprintf vasprintf setenv unsetenv strnlen strtoull __strtoull')
    conf.CHECK_FUNCS('strtouq strtoll __strtoll strtoq memmem printf memset memcpy')
    conf.CHECK_FUNCS('connect gethostbyname if_nametoindex socketpair')
    conf.CHECK_FUNCS('inet_ntoa inet_aton inet_ntop inet_pton')
    conf.CHECK_FUNCS('dirfd getdirentries getdents syslog')
    conf.CHECK_FUNCS('timegm getifaddrs freeifaddrs  crypt')

    conf.CHECK_FUNCS_IN('dlopen dlsym dlerror dlclose', 'dl')
    conf.CHECK_FUNCS_IN('poptGetContext', 'popt')
    conf.CHECK_FUNCS_IN('res_search', 'resolv')
    conf.CHECK_FUNCS_IN('gettext', 'intl')

    conf.CHECK_VARIABLE('rl_event_hook', define='HAVE_DECL_RL_EVENT_HOOK', always=True)

    conf.check_cc(fragment='''
    #include <stdarg.h>
    va_list ap1,ap2;
    va_copy(ap1,ap2);
    int main(void)
    { return 0; }''',
                define_name="HAVE_VA_COPY",
		execute=0,
		link=0,
                define_ret=0,
                quote=0,
		msg="Checking for va_copy")


    # we could also put code fragments like this in separate files,
    # for example in test/snprintf.c
    conf.check_cc(fragment='''
#include <sys/types.h>
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
void foo(const char *format, ...) {
       va_list ap;
       int len;
       char buf[20];
       long long l = 1234567890;
       l *= 100;

       va_start(ap, format);
       len = vsnprintf(buf, 0, format, ap);
       va_end(ap);
       if (len != 5) exit(1);

       va_start(ap, format);
       len = vsnprintf(0, 0, format, ap);
       va_end(ap);
       if (len != 5) exit(2);

       if (snprintf(buf, 3, "hello") != 5 || strcmp(buf, "he") != 0) exit(3);

       if (snprintf(buf, 20, "%lld", l) != 12 || strcmp(buf, "123456789000") != 0) exit(4);
       if (snprintf(buf, 20, "%zu", 123456789) != 9 || strcmp(buf, "123456789") != 0) exit(5);
       if (snprintf(buf, 20, "%2\$d %1\$d", 3, 4) != 3 || strcmp(buf, "4 3") != 0) exit(6);
       if (snprintf(buf, 20, "%s", 0) < 3) exit(7);

       printf("1");
       exit(0);
}
main() { foo("hello"); }
''',
                define_name="HAVE_C99_VSNPRINTF",
		execute=1,
                define_ret=1,
                quote=0,
		msg="Checking for C99 vsnprintf")

    if Options.options.developer:
        conf.ADD_CFLAGS('-Wall -g -Wfatal-errors -DDEVELOPER -W -Wshadow -Wstrict-prototypes -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Werror-implicit-function-declaration -Wformat=2 -Wno-format-y2k')

    conf.SAMBA_CONFIG_H()
    conf.SAMBA_BUILD_ENV()

def build(bld):
    bld.set_rpath()

    # libreplace needs to put the library in the right build groups
    # as libreplace is a base library for everything, even for our
    # compilers, we need libreplace to build very early
    bld.SETUP_BUILD_GROUPS()

    REPLACE_SOURCE = 'replace.c snprintf.c'

    bld.SAMBA_LIBRARY('replace',
                      source=REPLACE_SOURCE,
                      group='base_libraries')

    TEST_SOURCES = '''test/testsuite.c test/main.c test/strptime.c
                      test/os2_delete.c test/getifaddrs.c'''

    bld.SAMBA_BINARY('replace_testsuite',
                     TEST_SOURCES,
                     deps='replace')

    NET_SOURCES = []
    if bld.CONFIG_SET('HAVE_INET_NTOA'):  NET_SOURCES.append('inet_ntoa.c')
    if bld.CONFIG_SET('HAVE_INET_ATON'):  NET_SOURCES.append('inet_aton.c')
    if bld.CONFIG_SET('HAVE_INET_NTOP'):  NET_SOURCES.append('inet_ntop.c')
    if bld.CONFIG_SET('HAVE_INET_PTON'):  NET_SOURCES.append('inet_pton.c')
    if bld.CONFIG_SET('HAVE_SOCKETPAIR'): NET_SOURCES.append('socketpair.c')

    bld.SAMBA_SUBSYSTEM('LIBREPLACE_NETWORK', NET_SOURCES)


    CRYPT_SOURCES = []
    if not 'HAVE_CRYPT' in bld.env: CRYPT_SOURCES.append('crypt.c')

    bld.SAMBA_SUBSYSTEM('LIBREPLACE_EXT', CRYPT_SOURCES)