tests/krb5: Check version number of obtained ticket
[Samba.git] / source3 / wscript
blob563854c1d2391962d026596f0c1f796f44c6e516
1 #!/usr/bin/env python
3 srcdir = ".."
5 import sys, os
6 from optparse import SUPPRESS_HELP
7 sys.path.insert(0, srcdir + "/buildtools/wafsamba")
8 sys.path.insert(0, "source3")
10 from waflib import Options, Logs, Errors
11 import wafsamba
12 import build.charset
13 from wafsamba import samba_utils
14 from samba_utils import TO_LIST
15 import samba3
16 from waflib.Tools import bison
18 default_prefix = Options.default_prefix = '/usr/local/samba'
20 def options(opt):
22 opt.add_option('--with-static-modules',
23 help=("Comma-separated list of names of modules to statically link in. "+
24 "May include !module to disable 'module'. "+
25 "Can be '!FORCED' to disable all non-required static only modules. "+
26 "Can be '!DEFAULT' to disable all modules defaulting to a static build. "+
27 "Can be 'ALL' to build all default shared modules static. "+
28 "The most specific one wins, while the order is ignored "+
29 "and --with-static-modules is evaluated before "+
30 "--with-shared-modules"),
31 action="store", dest='static_modules', default=None)
32 opt.add_option('--with-shared-modules',
33 help=("Comma-separated list of names of modules to build shared. "+
34 "May include !module to disable 'module'. "+
35 "Can be '!FORCED' to disable all non-required shared only modules. "+
36 "Can be '!DEFAULT' to disable all modules defaulting to a shared build. "+
37 "Can be 'ALL' to build all default static modules shared. "+
38 "The most specific one wins, while the order is ignored "+
39 "and --with-static-modules is evaluated before "+
40 "--with-shared-modules"),
41 action="store", dest='shared_modules', default=None)
43 # Optional Libraries
44 # ------------------
46 # Most of the calls to opt.samba_add_onoff_option() implicitly
47 # or explicity use default=True
49 # To assist users and distributors to build Samba with the full feature
50 # set, the build system will abort if our dependent libraries and their
51 # header files are not found on the target system. This will mean for
52 # example, that xattr, acl and ldap headers must be installed for the
53 # default build to complete. The configure system will check for these
54 # headers, and the error message will indicate the option (such as
55 # --without-acl-support) that can be specified to skip this requirement.
57 # This will assist users and in particular distributors in building fully
58 # functional packages, while allowing those on systems truly without these
59 # facilities to continue to build Samba after careful consideration.
61 # It also ensures our container image generation in bootstrap/ is correct
62 # as otherwise a missing package there would just silently work
64 opt.samba_add_onoff_option('winbind')
65 opt.samba_add_onoff_option('ads')
66 opt.samba_add_onoff_option('ldap')
67 opt.samba_add_onoff_option('cups', with_name="enable", without_name="disable")
68 opt.samba_add_onoff_option('iprint', with_name="enable", without_name="disable")
69 opt.samba_add_onoff_option('pam')
70 opt.samba_add_onoff_option('quotas', default=None)
71 opt.samba_add_onoff_option('sendfile-support', default=None)
72 opt.samba_add_onoff_option('utmp')
73 opt.samba_add_onoff_option('avahi', with_name="enable", without_name="disable")
74 opt.samba_add_onoff_option('iconv')
75 opt.samba_add_onoff_option('acl-support')
76 opt.samba_add_onoff_option('dnsupdate')
77 opt.samba_add_onoff_option('syslog')
78 opt.samba_add_onoff_option('automount')
79 opt.samba_add_onoff_option('dmapi', default=None) # None means autodetection
80 opt.samba_add_onoff_option('fam', default=None) # None means autodetection
81 opt.samba_add_onoff_option('profiling-data', default=False)
82 opt.samba_add_onoff_option('libarchive', default=True)
84 opt.samba_add_onoff_option('cluster-support', default=False)
86 opt.samba_add_onoff_option('regedit', default=None)
87 opt.samba_add_onoff_option('winexe', default=None)
89 opt.samba_add_onoff_option('fake-kaserver',
90 help=("Include AFS fake-kaserver support"), default=False)
92 opt.add_option('--with-libcephfs',
93 help=("Directory under which libcephfs is installed"),
94 action="store", dest='libcephfs_dir', default=None)
96 opt.samba_add_onoff_option('glusterfs', with_name="enable", without_name="disable", default=True)
97 opt.samba_add_onoff_option('cephfs', with_name="enable", without_name="disable", default=True)
99 opt.add_option('--enable-vxfs',
100 help=("enable support for VxFS (default=no)"),
101 action="store_true", dest='enable_vxfs', default=False)
103 # default = None means autodetection
104 opt.samba_add_onoff_option('spotlight', with_name="enable", without_name="disable", default=None)
106 def configure(conf):
107 default_static_modules = []
108 default_shared_modules = []
109 required_static_modules = []
110 forced_static_modules = []
111 forced_shared_modules = []
113 if Options.options.developer:
114 conf.ADD_CFLAGS('-DDEVELOPER -DDEBUG_PASSWORD')
115 conf.env.developer = True
117 if sys.platform != 'openbsd5':
118 conf.ADD_LDFLAGS("-Wl,--export-dynamic", testflags=True)
120 # We crash without vfs_default
121 # and vfs_not_implemented provides helper function
122 # for other modules
123 required_static_modules.extend(TO_LIST('vfs_default vfs_not_implemented'))
125 conf.CHECK_HEADERS('netdb.h')
126 conf.CHECK_HEADERS('linux/falloc.h linux/ioctl.h')
128 conf.CHECK_FUNCS('getcwd fchown chmod fchmod mknod mknodat')
129 conf.CHECK_FUNCS('strtol strchr strupr chflags')
130 conf.CHECK_FUNCS('getrlimit fsync setpgid')
131 conf.CHECK_FUNCS('setsid glob strpbrk crypt16 getauthuid')
132 conf.CHECK_FUNCS('innetgr')
133 conf.CHECK_FUNCS('initgroups select poll rdchk getgrnam getgrent pathconf')
134 conf.CHECK_FUNCS('setpriv setgidx setuidx setgroups syscall sysconf')
135 conf.CHECK_FUNCS('atexit grantpt posix_openpt fallocate')
136 conf.CHECK_FUNCS('fseeko setluid')
137 conf.CHECK_FUNCS('getpwnam', headers='sys/types.h pwd.h')
138 conf.CHECK_FUNCS('fdopendir')
139 conf.CHECK_FUNCS('fstatat')
140 conf.CHECK_FUNCS('getpwent_r setenv clearenv strcasecmp fcvt fcvtl')
141 conf.CHECK_FUNCS('syslog vsyslog timegm setlocale')
142 conf.CHECK_FUNCS('lutimes futimes utimensat futimens')
143 conf.CHECK_FUNCS('mlock munlock mlockall munlockall')
144 conf.CHECK_FUNCS('memalign posix_memalign hstrerror')
145 conf.CHECK_FUNCS_IN('yp_get_default_domain', 'nsl')
146 conf.CHECK_FUNCS_IN('dn_expand _dn_expand __dn_expand', 'resolv')
147 conf.CHECK_FUNCS_IN('dn_expand', 'inet')
148 conf.CHECK_DECLS('readahead', reverse=True, headers='fcntl.h')
150 if conf.CHECK_CODE('''
151 #if defined(HAVE_UNISTD_H)
152 #include <unistd.h>
153 #endif
154 long ret = splice(0,0,1,0,400,SPLICE_F_MOVE);
155 ''',
156 'HAVE_LINUX_SPLICE',
157 headers='fcntl.h'):
158 conf.CHECK_DECLS('splice', reverse=True, headers='fcntl.h')
160 # Check for inotify support (Skip if we are SunOS)
161 #NOTE: illumos provides sys/inotify.h but is not an exact match for linux
162 host_os = sys.platform
163 if host_os.rfind('sunos') == -1:
164 conf.CHECK_HEADERS('sys/inotify.h')
165 if conf.env.HAVE_SYS_INOTIFY_H:
166 conf.DEFINE('HAVE_INOTIFY', 1)
168 # Check for kernel change notify support
169 conf.CHECK_CODE('''
170 #ifndef F_NOTIFY
171 #define F_NOTIFY 1026
172 #endif
173 main() {
174 exit(fcntl(open("/tmp", O_RDONLY), F_NOTIFY, 0) == -1 ? 1 : 0);
175 }''', 'HAVE_KERNEL_CHANGE_NOTIFY', addmain=False, execute=True,
176 headers='fcntl.h signal.h',
177 msg="Checking for kernel change notify support")
179 # Check for Linux kernel oplocks
180 conf.CHECK_CODE('''
181 #include <sys/types.h>
182 #include <fcntl.h>
183 #include <signal.h>
184 #ifndef F_GETLEASE
185 #define F_GETLEASE 1025
186 #endif
187 main() {
188 exit(fcntl(open("/tmp", O_RDONLY), F_GETLEASE, 0) == -1 ? 1 : 0);
189 }''', 'HAVE_KERNEL_OPLOCKS_LINUX', addmain=False, execute=True,
190 msg="Checking for Linux kernel oplocks")
192 # Check for kernel share modes
193 conf.CHECK_CODE('''
194 #include <sys/types.h>
195 #include <fcntl.h>
196 #include <signal.h>
197 #include <sys/file.h>
198 #ifndef LOCK_MAND
199 #define LOCK_MAND 32
200 #define LOCK_READ 64
201 #endif
202 main() {
203 exit(flock(open("/dev/null", O_RDWR), LOCK_MAND|LOCK_READ) != 0);
204 }''', 'HAVE_KERNEL_SHARE_MODES', addmain=False, execute=True,
205 msg="Checking for kernel share modes")
207 # check for fam libs
208 samba_fam_libs=None
209 check_for_fam=False
210 if Options.options.with_fam is None:
211 check_for_fam=True
212 elif Options.options.with_fam == True:
213 check_for_fam=True
215 if check_for_fam and conf.CHECK_HEADERS('fam.h'):
216 if conf.CHECK_FUNCS_IN('FAMOpen2', 'fam'):
217 samba_fam_libs='fam'
218 elif conf.CHECK_FUNCS_IN('FAMOpen2', 'fam C'):
219 samba_fam_libs='fam C'
220 conf.CHECK_TYPE('enum FAMCodes', headers='fam.h',
221 define='HAVE_FAM_H_FAMCODES_TYPEDEF',
222 msg='Checking whether enum FAMCodes is available')
223 conf.CHECK_FUNCS_IN('FAMNoExists', 'fam')
225 if samba_fam_libs is not None:
226 conf.DEFINE('SAMBA_FAM_LIBS', samba_fam_libs)
227 conf.DEFINE('HAVE_FAM', 1)
228 else:
229 if Options.options.with_fam == True:
230 conf.fatal('FAM support requested, but no suitable FAM library found')
231 elif check_for_fam:
232 Logs.warn('no suitable FAM library found')
234 # check for libarchive (tar command in smbclient)
235 # None means autodetect, True/False means enable/disable
236 conf.SET_TARGET_TYPE('archive', 'EMPTY')
237 if Options.options.with_libarchive is not False:
238 Logs.info("Checking for libarchive existence")
239 if conf.CHECK_HEADERS('archive.h') and conf.CHECK_LIB('archive', shlib=True):
240 conf.CHECK_FUNCS_IN('archive_read_support_filter_all archive_read_free', 'archive')
241 else:
242 conf.fatal("libarchive support not found. "
243 "Try installing libarchive-dev or libarchive-devel. "
244 "Otherwise, use --without-libarchive to "
245 "build without libarchive support. "
246 "libarchive support is required for the smbclient "
247 "tar-file mode")
248 elif conf.CONFIG_GET('ENABLE_SELFTEST'):
249 raise Errors.WafError('libarchive library required for '
250 '--enable-selftest')
253 # check for DMAPI libs
254 if Options.options.with_dmapi == False:
255 have_dmapi = False
256 else:
257 have_dmapi = True
258 Logs.info("Checking for DMAPI library existence")
259 samba_dmapi_lib = ''
260 if conf.CHECK_FUNCS_IN('dm_get_eventlist', 'dm'):
261 samba_dmapi_lib = 'dm'
262 else:
263 if conf.CHECK_FUNCS_IN('dm_get_eventlist', 'jfsdm'):
264 samba_dmapi_lib = 'jfsdm'
265 else:
266 if conf.CHECK_FUNCS_IN('dm_get_eventlist', 'dmapi'):
267 samba_dmapi_lib = 'dmapi'
268 else:
269 if conf.CHECK_FUNCS_IN('dm_get_eventlist', 'xdsm'):
270 samba_dmapi_lib = 'xdsm'
271 # only bother to test headers and compilation when a candidate
272 # library has been found
273 if samba_dmapi_lib == '':
274 have_dmapi = False
275 broken_dmapi = "no suitable DMAPI library found"
277 if have_dmapi:
278 conf.CHECK_HEADERS('sys/dmi.h xfs/dmapi.h sys/jfsdmapi.h sys/dmapi.h dmapi.h')
279 conf.CHECK_CODE('''
280 #include <time.h> /* needed by Tru64 */
281 #include <sys/types.h> /* needed by AIX */
282 #ifdef HAVE_XFS_DMAPI_H
283 #include <xfs/dmapi.h>
284 #elif defined(HAVE_SYS_DMI_H)
285 #include <sys/dmi.h>
286 #elif defined(HAVE_SYS_JFSDMAPI_H)
287 #include <sys/jfsdmapi.h>
288 #elif defined(HAVE_SYS_DMAPI_H)
289 #include <sys/dmapi.h>
290 #elif defined(HAVE_DMAPI_H)
291 #include <dmapi.h>
292 #endif
294 /* This link test is designed to fail on IRI 6.4, but should
295 * succeed on Linux, IRIX 6.5 and AIX.
297 int main(int argc, char **argv)
299 char * version;
300 dm_eventset_t events;
301 /* This doesn't take an argument on IRIX 6.4. */
302 dm_init_service(&version);
303 /* IRIX 6.4 expects events to be a pointer. */
304 DMEV_ISSET(DM_EVENT_READ, events);
306 return 0;
308 ''',
309 'USEABLE_DMAPI_LIBRARY',
310 addmain=False,
311 execute=False,
312 lib=samba_dmapi_lib,
313 msg='Checking whether DMAPI lib '+samba_dmapi_lib+' can be used')
314 if not conf.CONFIG_SET('USEABLE_DMAPI_LIBRARY'):
315 have_dmapi = False
316 broken_dmapi = "no usable DMAPI library found"
318 if have_dmapi:
319 Logs.info("Building with DMAPI support.")
320 conf.env['dmapi_lib'] = samba_dmapi_lib
321 conf.DEFINE('USE_DMAPI', 1)
322 else:
323 if Options.options.with_dmapi == False:
324 Logs.info("Building without DMAPI support (--without-dmapi).")
325 elif Options.options.with_dmapi == True:
326 Logs.error("DMAPI support not available: " + broken_dmapi)
327 conf.fatal('DMAPI support requested but not found.');
328 else:
329 Logs.warn("Building without DMAPI support: " + broken_dmapi)
330 conf.env['dmapi_lib'] = ''
332 # Check for various members of the stat structure
333 conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_blocks', define='HAVE_STAT_ST_BLOCKS',
334 headers='sys/stat.h')
335 conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_blksize', define='HAVE_STAT_ST_BLKSIZE',
336 headers='sys/stat.h')
337 conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_flags', define='HAVE_STAT_ST_FLAGS',
338 headers='sys/types.h sys/stat.h unistd.h')
340 if conf.env.HAVE_BLKCNT_T:
341 conf.CHECK_CODE('''
342 static int test_array[1 - 2 * !(((long int)(sizeof(blkcnt_t))) <= 4)];''',
343 'SIZEOF_BLKCNT_T_4',
344 headers='replace.h sys/types.h sys/stat.h unistd.h',
345 msg="Checking whether blkcnt_t is 32 bit")
347 # If sizeof is 4 it can't be 8
348 if conf.env.HAVE_BLKCNT_T:
349 if not conf.CONFIG_SET('SIZEOF_BLKCNT_T_4'):
350 conf.CHECK_CODE('''
351 static int test_array[1 - 2 * !(((long int)(sizeof(blkcnt_t))) <= 8)];''',
352 'SIZEOF_BLKCNT_T_8',
353 headers='replace.h sys/types.h sys/stat.h unistd.h',
354 msg="Checking whether blkcnt_t is 64 bit")
356 # Check for POSIX capability support
357 conf.CHECK_FUNCS_IN('cap_get_proc', 'cap', headers='sys/capability.h')
359 if conf.env.HAVE_SYS_CAPABILITY_H:
360 conf.CHECK_CODE('''
361 cap_t cap;
362 cap_value_t vals[1];
363 if (!(cap = cap_get_proc())) exit(1);
364 vals[0] = CAP_CHOWN;
365 cap_set_flag(cap, CAP_INHERITABLE, 1, vals, CAP_CLEAR);
366 cap_set_proc(cap);''',
367 'HAVE_POSIX_CAPABILITIES', execute=True, lib="cap",
368 headers='sys/capability.h',
369 msg="Checking whether POSIX capabilities are available")
371 conf.CHECK_CODE('int i;', 'BROKEN_NISPLUS_INCLUDE_FILES',
372 headers='sys/types.h sys/acl.h rpcsvc/nis.h',
373 msg="Checking for broken nisplus include files")
375 # Check if the compiler will optimize out functions
376 conf.CHECK_CODE('''
377 #include <sys/types.h>
378 size_t __unsafe_string_function_usage_here_size_t__(void);
379 #define CHECK_STRING_SIZE(d, len) (sizeof(d) != (len) && sizeof(d) != sizeof(char *))
380 static size_t push_string_check_fn(void *dest, const char *src, size_t dest_len) {
381 return 0;
384 #define push_string_check(dest, src, dest_len) \
385 (CHECK_STRING_SIZE(dest, dest_len) \
386 ? __unsafe_string_function_usage_here_size_t__() \
387 : push_string_check_fn(dest, src, dest_len))
389 int main(int argc, char **argv) {
390 char outbuf[1024];
391 char *p = outbuf;
392 const char *foo = "bar";
393 p += 31 + push_string_check(p + 31, foo, sizeof(outbuf) - (p + 31 - outbuf));
394 return 0;
395 }''', 'HAVE_COMPILER_WILL_OPTIMIZE_OUT_FNS',
396 addmain=False,
397 add_headers=False,
398 msg="Checking if the compiler will optimize out functions")
400 # Check if the compiler supports the LL suffix on long long integers
401 # AIX needs this
402 conf.CHECK_CODE('long long i = 0x8000000000LL', 'COMPILER_SUPPORTS_LL',
403 headers='stdio.h',
404 msg="Checking for LL suffix on long long integers")
406 conf.CHECK_FUNCS('''
407 DNSServiceRegister
408 atexit
409 chflags
410 chmod
411 crypt16
412 devnm
413 dirfd
414 endmntent
415 execl
416 fchmod
417 fchown
418 fcvt
419 fcvtl
420 fseeko
421 fsync
422 futimens
423 futimes
424 getauthuid
425 getcwd
426 getgrent
427 getgrnam
428 getgrouplist
429 getgrset
430 getmntent
431 getpagesize
432 getpwanam
433 getpwent_r
434 getrlimit
435 glob
436 grantpt
437 hstrerror
438 initgroups
439 innetgr
440 llseek
441 lutimes
442 memalign
443 mknod
444 mlock
445 mlockall
446 munlock
447 munlockall
448 pathconf poll
449 posix_memalign
450 pread
451 pwrite
452 rdchk
453 select
454 setenv
455 setgidx
456 setgroups
457 setlocale
458 setluid
459 setmntent
460 setpgid
461 setpriv
462 setsid
463 setuidx
464 statvfs
465 strcasecmp
466 strchr
467 strpbrk
468 strsignal
469 strtol
470 strupr
471 sysconf
472 sysctl
473 sysctlbyname
474 syslog
475 timegm
476 utimensat
477 vsyslog
478 ''')
480 conf.CHECK_SAMBA3_CHARSET() # see build/charset.py
482 # FIXME: these should be tests for features, but the old build system just
483 # checks for OSes.
484 host_os = sys.platform
485 Logs.info("building on %s" % host_os)
487 # Python doesn't have case switches... :/
488 # FIXME: original was *linux* | gnu* | k*bsd*-gnu | kopensolaris*-gnu | *qnx*)
489 # the search for .rfind('gnu') covers gnu* and *-gnu is that too broad?
491 conf.SET_TARGET_TYPE('sunacl', 'EMPTY')
492 if (host_os.rfind('linux') > -1) or (host_os.rfind('gnu') > -1) or (host_os.rfind('qnx') > -1):
493 if host_os.rfind('linux') > -1:
494 conf.DEFINE('LINUX', '1')
495 elif host_os.rfind('qnx') > -1:
496 conf.DEFINE('QNX', '1')
497 conf.DEFINE('STAT_ST_BLOCKSIZE', '512')
498 elif (host_os.rfind('darwin') > -1):
499 conf.DEFINE('DARWINOS', 1)
500 conf.ADD_CFLAGS('-fno-common')
501 conf.DEFINE('STAT_ST_BLOCKSIZE', '512')
502 elif (host_os.rfind('freebsd') > -1):
503 conf.DEFINE('FREEBSD', 1)
504 if conf.CHECK_HEADERS('sunacl.h'):
505 conf.DEFINE('HAVE_FREEBSD_SUNACL_H', '1')
506 conf.CHECK_FUNCS_IN(['acl'], 'sunacl')
507 conf.DEFINE('STAT_ST_BLOCKSIZE', '512')
508 elif (host_os.rfind('irix') > -1):
509 conf.DEFINE('IRIX', 1)
510 conf.DEFINE('STAT_ST_BLOCKSIZE', '512')
511 elif (host_os.rfind('aix') > -1):
512 conf.DEFINE('AIX', 1)
513 conf.DEFINE('STAT_ST_BLOCKSIZE', 'DEV_BSIZE')
514 elif (host_os.rfind('hpux') > -1):
515 conf.DEFINE('HPUX', 1)
516 conf.DEFINE('STAT_ST_BLOCKSIZE', '8192')
517 elif (host_os.rfind('osf') > -1):
518 conf.DEFINE('OSF1', 1)
519 conf.DEFINE('STAT_ST_BLOCKSIZE', '512')
521 # FIXME: Add more checks here.
522 else:
523 conf.DEFINE('STAT_ST_BLOCKSIZE', '512')
525 if Options.options.with_acl_support:
526 if (host_os.rfind('hpux') > -1):
527 Logs.info('Using HPUX ACLs')
528 conf.DEFINE('HAVE_HPUX_ACLS',1)
529 conf.DEFINE('POSIX_ACL_NEEDS_MASK',1)
530 default_static_modules.extend(TO_LIST('vfs_hpuxacl'))
531 elif (host_os.rfind('aix') > -1):
532 Logs.info('Using AIX ACLs')
533 conf.DEFINE('HAVE_AIX_ACLS',1)
534 default_static_modules.extend(TO_LIST('vfs_aixacl vfs_aixacl2'))
535 elif (host_os.rfind('darwin') > -1):
536 Logs.warn('ACLs on Darwin currently not supported')
537 conf.fatal("ACL support not available on Darwin/MacOS. "
538 "Use --without-acl-support for building without "
539 "ACL support. "
540 "ACL support is required to change permissions "
541 "from Windows clients.")
542 else:
543 conf.CHECK_FUNCS_IN(['acl_get_file'], 'acl')
544 if conf.CHECK_CODE('''
545 acl_t acl;
546 int entry_id;
547 acl_entry_t *entry_p;
548 return acl_get_entry(acl, entry_id, entry_p);
549 ''',
550 'HAVE_POSIX_ACLS',
551 headers='sys/types.h sys/acl.h', link=False,
552 msg="Checking for POSIX ACL support") :
553 conf.CHECK_CODE('''
554 acl_permset_t permset_d;
555 acl_perm_t perm;
556 return acl_get_perm_np(permset_d, perm);
557 ''',
558 'HAVE_ACL_GET_PERM_NP',
559 headers='sys/types.h sys/acl.h', link=True,
560 msg="Checking whether acl_get_perm_np() is available")
561 # source3/lib/sysacls.c calls posixacl_sys_acl_get_file()
562 required_static_modules.extend(TO_LIST('vfs_posixacl'))
563 conf.CHECK_VARIABLE('ACL_EVERYONE', headers='sys/acl.h')
564 elif conf.CHECK_FUNCS_IN(['facl'], 'sec'):
565 Logs.info('Using solaris or UnixWare ACLs')
566 conf.DEFINE('HAVE_SOLARIS_UNIXWARE_ACLS',1)
567 default_static_modules.extend(TO_LIST('vfs_solarisacl'))
568 elif conf.CHECK_FUNCS_IN(['acl_get_fd'], 'pacl'):
569 Logs.info('Using Tru64 ACLs')
570 conf.DEFINE('HAVE_TRU64_ACLS',1)
571 default_static_modules.extend(TO_LIST('vfs_tru64acl'))
572 else:
573 conf.fatal("ACL support not found. Try installing libacl1-dev "
574 "or libacl-devel. "
575 "Otherwise, use --without-acl-support to build "
576 "without ACL support. "
577 "ACL support is required to change permissions from "
578 "Windows clients.")
580 if conf.CHECK_FUNCS('dirfd'):
581 conf.DEFINE('HAVE_DIRFD_DECL', 1)
583 conf.CHECK_CODE('struct statfs fsd; fsid_t fsid = fsd.f_fsid; return statfs(".", &fsd);',
584 'HAVE_STATFS_F_FSID',
585 msg="vfs_fileid checking for statfs() and struct statfs.f_fsid",
586 headers='sys/types.h sys/statfs.h',
587 execute=True)
589 if conf.CONFIG_SET('HAVE_FALLOCATE'):
590 conf.CHECK_CODE('''
591 int ret = fallocate(0, FALLOC_FL_KEEP_SIZE, 0, 10);''',
592 'HAVE_LINUX_FALLOCATE',
593 msg="Checking whether the Linux 'fallocate' function is available",
594 headers='unistd.h sys/types.h fcntl.h linux/falloc.h')
595 conf.CHECK_CODE('''
596 int ret = fallocate(0, FALLOC_FL_PUNCH_HOLE, 0, 10);''',
597 'HAVE_FALLOC_FL_PUNCH_HOLE',
598 msg="Checking whether Linux 'fallocate' supports hole-punching",
599 headers='unistd.h sys/types.h fcntl.h linux/falloc.h')
601 conf.CHECK_CODE('''
602 int ret = lseek(0, 0, SEEK_HOLE);
603 ret = lseek(0, 0, SEEK_DATA);''',
604 'HAVE_LSEEK_HOLE_DATA',
605 msg="Checking whether lseek supports hole/data seeking",
606 headers='unistd.h sys/types.h')
608 conf.CHECK_CODE('''
609 ssize_t err = readahead(0,0,0x80000);''',
610 'HAVE_LINUX_READAHEAD',
611 msg="Checking whether Linux readahead is available",
612 headers='unistd.h fcntl.h')
613 conf.CHECK_DECLS('readahead', headers='fcntl.h', always=True)
615 conf.CHECK_CODE('int fd = openat(AT_FDCWD, ".", O_RDONLY);',
616 'HAVE_OPENAT',
617 msg='Checking for openat',
618 headers='fcntl.h')
620 conf.CHECK_CODE('''
621 struct msghdr msg;
622 union {
623 struct cmsghdr cm;
624 char control[CMSG_SPACE(sizeof(int))];
625 } control_un;
626 msg.msg_control = control_un.control;
627 msg.msg_controllen = sizeof(control_un.control);
628 ''',
629 'HAVE_STRUCT_MSGHDR_MSG_CONTROL',
630 msg='Checking if we can use msg_control for passing file descriptors',
631 headers='sys/types.h stdlib.h stddef.h sys/socket.h sys/un.h')
632 conf.CHECK_CODE('''
633 struct msghdr msg;
634 int fd;
635 msg.msg_accrights = (caddr_t) &fd;
636 msg.msg_accrightslen = sizeof(fd);
637 ''',
638 'HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS',
639 msg='Checking if we can use msg_accrights for passing file descriptors',
640 headers='sys/types.h stdlib.h stddef.h sys/socket.h sys/un.h')
642 if Options.options.with_winbind:
643 conf.env.build_winbind = True
644 conf.DEFINE('WITH_WINBIND', '1')
646 conf.find_program('awk', var='AWK')
648 conf.CHECK_HEADERS('asm/types.h')
650 conf.CHECK_CODE('dev_t dev; int i = major(dev); return 0', "HAVE_DEVICE_MAJOR_FN",
651 headers='unistd.h sys/types.h',
652 msg="Checking for major macro")
654 conf.CHECK_CODE('dev_t dev; int i = minor(dev); return 0', "HAVE_DEVICE_MINOR_FN",
655 headers='unistd.h sys/types.h',
656 msg="Checking for minor macro")
658 conf.CHECK_STRUCTURE_MEMBER('struct dirent', 'd_off',
659 headers='unistd.h sys/types.h dirent.h',
660 define='HAVE_DIRENT_D_OFF')
662 if (conf.CONFIG_SET('HAVE_YP_GET_DEFAULT_DOMAIN')):
663 conf.DEFINE('HAVE_NETGROUP', '1')
665 # Look for CUPS
666 if Options.options.with_cups:
667 conf.find_program('cups-config', var='CUPS_CONFIG')
668 if conf.env.CUPS_CONFIG:
669 # we would normally use --libs here, but cups-config incorrectly adds
670 # gssapi_krb5 and other libraries to its --libs output. That breaks the use
671 # of an in-tree heimdal kerberos
672 conf.CHECK_CFG(path=conf.env.CUPS_CONFIG, args="--cflags --ldflags",
673 package="", uselib_store="CUPS")
674 conf.CHECK_HEADERS('cups/cups.h cups/language.h', lib='cups')
675 conf.CHECK_FUNCS_IN('httpConnect httpConnect2 httpConnectEncrypt', 'cups')
676 if conf.CONFIG_SET('HAVE_CUPS_CUPS_H') and conf.CONFIG_SET('HAVE_CUPS_LANGUAGE_H'):
677 conf.DEFINE('HAVE_CUPS', '1')
678 else:
679 conf.undefine('HAVE_CUPS')
680 conf.SET_TARGET_TYPE('cups', 'EMPTY')
681 else:
682 # define an empty subsystem for cups, to allow it to be used as an empty dependency
683 conf.SET_TARGET_TYPE('cups', 'EMPTY')
685 if Options.options.with_iprint:
686 if conf.CONFIG_SET('HAVE_CUPS'):
687 conf.DEFINE('HAVE_IPRINT', '1')
688 else:
689 Logs.warn("--enable-iprint=yes but cups support not sufficient")
690 if Options.options.with_syslog:
691 conf.DEFINE('WITH_SYSLOG', '1')
692 if Options.options.with_automount:
693 conf.DEFINE('WITH_AUTOMOUNT', '1')
695 # Check for LDAP
696 if Options.options.with_ldap:
697 conf.CHECK_HEADERS('ldap.h lber.h ldap_pvt.h')
698 conf.CHECK_TYPE('ber_tag_t', 'unsigned int', headers='ldap.h lber.h')
699 conf.CHECK_FUNCS_IN('ber_scanf ber_sockbuf_add_io', 'lber')
700 conf.CHECK_VARIABLE('LDAP_OPT_SOCKBUF', headers='ldap.h')
702 # if we LBER_OPT_LOG_PRINT_FN we can intercept ldap logging and print it out
703 # for the samba logs
704 conf.CHECK_VARIABLE('LBER_OPT_LOG_PRINT_FN',
705 define='HAVE_LBER_LOG_PRINT_FN', headers='lber.h')
707 conf.CHECK_FUNCS_IN('ldap_init ldap_init_fd ldap_initialize ldap_set_rebind_proc', 'ldap')
708 conf.CHECK_FUNCS_IN('ldap_add_result_entry', 'ldap')
710 # Check if ldap_set_rebind_proc() takes three arguments
711 if conf.CHECK_CODE('ldap_set_rebind_proc(0, 0, 0)',
712 'LDAP_SET_REBIND_PROC_ARGS',
713 msg="Checking whether ldap_set_rebind_proc takes 3 arguments",
714 headers='ldap.h lber.h', link=False):
715 conf.DEFINE('LDAP_SET_REBIND_PROC_ARGS', '3')
716 else:
717 conf.DEFINE('LDAP_SET_REBIND_PROC_ARGS', '2')
719 # last but not least, if ldap_init() exists, we want to use ldap
720 if conf.CONFIG_SET('HAVE_LDAP_INIT') and conf.CONFIG_SET('HAVE_LDAP_H'):
721 conf.DEFINE('HAVE_LDAP', '1')
722 conf.DEFINE('LDAP_DEPRECATED', '1')
723 conf.env['HAVE_LDAP'] = '1'
724 # if ber_sockbuf_add_io() and LDAP_OPT_SOCKBUF are available, we can add
725 # SASL wrapping hooks
726 if conf.CONFIG_SET('HAVE_BER_SOCKBUF_ADD_IO') and \
727 conf.CONFIG_SET('HAVE_LDAP_OPT_SOCKBUF'):
728 conf.DEFINE('HAVE_LDAP_SASL_WRAPPING', '1')
729 else:
730 conf.fatal("LDAP support not found. "
731 "Try installing libldap2-dev or openldap-devel. "
732 "Otherwise, use --without-ldap to build without "
733 "LDAP support. "
734 "LDAP support is required for the LDAP passdb backend, "
735 "LDAP idmap backends and ADS. "
736 "ADS support improves communication with "
737 "Active Directory domain controllers.")
738 else:
739 conf.SET_TARGET_TYPE('ldap', 'EMPTY')
740 conf.SET_TARGET_TYPE('lber', 'EMPTY')
742 if Options.options.with_ads == False:
743 use_ads = False
744 use_ads_krb5 = False
745 use_ads_ldap = False
746 else:
747 use_ads = True
748 use_ads_krb5 = True
749 use_ads_ldap = True
750 if not conf.CONFIG_SET('HAVE_ENCTYPE_ARCFOUR_HMAC_MD5') and \
751 not conf.CONFIG_SET('HAVE_ENCTYPE_ARCFOUR_HMAC'):
752 Logs.warn("arcfour-hmac-md5 encryption type not found in -lkrb5")
753 use_ads_krb5 = False
754 if not conf.CONFIG_SET('HAVE_KRB5_MK_REQ_EXTENDED'):
755 Logs.warn("krb5_mk_req_extended not found in -lkrb5")
756 use_ads_krb5 = False
757 if not conf.CONFIG_SET('HAVE_KRB5_GET_HOST_REALM'):
758 Logs.warn("krb5_get_host_realm not found in -lkrb5")
759 use_ads_krb5 = False
760 if not conf.CONFIG_SET('HAVE_KRB5_FREE_HOST_REALM'):
761 Logs.warn("krb5_free_host_realm not found in -lkrb5")
762 use_ads_krb5 = False
763 if not conf.CONFIG_SET('HAVE_KRB5_FWD_TGT_CREDS'):
764 Logs.warn("krb5_fwd_tgt_creds found in -lkrb5")
765 use_ads_krb5 = False
766 if not conf.CONFIG_SET('HAVE_KRB5_GET_INIT_CREDS_OPT_ALLOC'):
767 Logs.warn("krb5_get_init_creds_opt_alloc not found in -lkrb5")
768 use_ads_krb5 = False
769 if not conf.CONFIG_SET('KRB5_CREDS_OPT_FREE_REQUIRES_CONTEXT'):
770 Logs.warn("krb5_get_init_creds_opt_free was not found or was too old in -lkrb5")
771 use_ads_krb5 = False
772 if not conf.CONFIG_SET('HAVE_KRB5_GET_RENEWED_CREDS'):
773 Logs.warn("krb5_get_renewed_creds not found in -lkrb5")
774 use_ads_krb5 = False
775 if not conf.CONFIG_SET('HAVE_KRB5_PRINCIPAL_COMPARE_ANY_REALM'):
776 Logs.warn("krb5_principal_compare_any_realm not found in -lkrb5")
777 use_ads_krb5 = False
778 if not conf.CONFIG_SET('HAVE_KRB5_C_STRING_TO_KEY') and \
779 not conf.CONFIG_SET('HAVE_KRB5_STRING_TO_KEY_SALT'):
780 Logs.warn("krb5_c_string_to_key not found in -lkrb5")
781 use_ads_krb5 = False
782 if not conf.CONFIG_SET('HAVE_KRB5_PRINCIPAL2SALT') and \
783 not conf.CONFIG_SET('HAVE_KRB5_GET_PW_SALT'):
784 Logs.warn("no CREATE_KEY_FUNCTIONS detected")
785 use_ads_krb5 = False
786 if not conf.CONFIG_SET('HAVE_KRB5_GET_PERMITTED_ENCTYPES') and \
787 not conf.CONFIG_SET('HAVE_KRB5_GET_DEFAULT_IN_TKT_ETYPES'):
788 Logs.warn("no GET_ENCTYPES_FUNCTIONS detected")
789 use_ads_krb5 = False
790 if not conf.CONFIG_SET('HAVE_KRB5_KT_FREE_ENTRY') and \
791 not conf.CONFIG_SET('HAVE_KRB5_FREE_KEYTAB_ENTRY_CONTENTS'):
792 Logs.warn("no KT_FREE_FUNCTION detected")
793 use_ads_krb5 = False
794 if not conf.CONFIG_SET('HAVE_KRB5_C_VERIFY_CHECKSUM'):
795 Logs.warn("krb5_c_verify_checksum_compare not found in -lkrb5")
796 use_ads_krb5 = False
798 # We don't actually use
799 # gsskrb5_extract_authz_data_from_sec_context, but it is a
800 # clue that this Heimdal, which does the PAC processing we
801 # need on the standard gss_inquire_sec_context_by_oid
802 if not conf.CONFIG_SET('HAVE_GSS_GET_NAME_ATTRIBUTE') and \
803 not (conf.CONFIG_SET('HAVE_GSSKRB5_EXTRACT_AUTHZ_DATA_FROM_SEC_CONTEXT') and \
804 conf.CONFIG_SET('HAVE_GSS_INQUIRE_SEC_CONTEXT_BY_OID')):
805 Logs.warn("need either gss_get_name_attribute or gsskrb5_extract_authz_data_from_sec_context and gss_inquire_sec_context_by_oid in -lgssapi for PAC support")
806 use_ads_krb5 = False
808 if not conf.CONFIG_SET('HAVE_GSS_KRB5_EXPORT_LUCID_SEC_CONTEXT'):
809 Logs.warn("need gss_krb5_export_lucid_sec_context for SPNEGO and gss_wrap support")
810 use_ads_krb5 = False
812 if use_ads_krb5:
813 conf.DEFINE('HAVE_KRB5', '1')
814 conf.env['HAVE_KRB5'] = '1'
815 else:
816 conf.undefine('HAVE_KRB5_H')
817 conf.undefine('HAVE_GSSAPI_H')
818 conf.undefine('HAVE_GSSAPI_GSSAPI_GENERIC_H')
819 conf.undefine('HAVE_GSSAPI_GSSAPI_H')
820 use_ads = False
822 if not conf.CONFIG_SET('HAVE_LDAP'):
823 use_ads = False
824 use_ads_ldap = False
826 if use_ads:
827 conf.DEFINE('WITH_ADS', '1')
828 conf.env['HAVE_ADS'] = '1'
829 Logs.info("Building with Active Directory support.")
830 # these have broken dependencies
831 forced_shared_modules.extend(TO_LIST('idmap_ad idmap_rfc2307'))
832 elif Options.options.with_ads == False:
833 Logs.info("Building without Active Directory support (--without-ads).")
834 if not Options.options.without_ad_dc:
835 conf.fatal("Building --without-ads requires also "
836 "building --without-ad-dc.")
837 else:
838 if not use_ads_krb5:
839 Logs.warn("Active Directory support not available: krb5 libs don't have all required features")
840 if not use_ads_ldap:
841 Logs.warn("Active Directory support not available: LDAP support is not available.")
842 if Options.options.with_ads:
843 conf.fatal("Active Directory support not found. Use --without-ads "
844 "for building without Active Directory support. "
845 "ADS support improves communication with "
846 "Active Directory domain controllers.")
847 else:
848 # this is the auto-mode case
849 Logs.warn("Building without Active Directory support.")
852 if Options.options.with_utmp:
853 conf.env.with_utmp = True
854 if not conf.CHECK_HEADERS('utmp.h'): conf.env.with_utmp = False
855 conf.CHECK_FUNCS('pututline pututxline updwtmp updwtmpx getutmpx getutxent')
856 conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_name', headers='utmp.h',
857 define='HAVE_UT_UT_NAME')
858 conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_user', headers='utmp.h',
859 define='HAVE_UT_UT_USER')
860 conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_id', headers='utmp.h',
861 define='HAVE_UT_UT_ID')
862 conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_host', headers='utmp.h',
863 define='HAVE_UT_UT_HOST')
864 conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_time', headers='utmp.h',
865 define='HAVE_UT_UT_TIME')
866 conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_tv', headers='utmp.h',
867 define='HAVE_UT_UT_TV')
868 conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_type', headers='utmp.h',
869 define='HAVE_UT_UT_TYPE')
870 conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_pid', headers='utmp.h',
871 define='HAVE_UT_UT_PID')
872 conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_exit.e_exit', headers='utmp.h',
873 define='HAVE_UT_UT_EXIT')
874 conf.CHECK_STRUCTURE_MEMBER('struct utmpx', 'ut_syslen', headers='utmpx.h',
875 define='HAVE_UX_UT_SYSLEN')
876 conf.CHECK_STRUCTURE_MEMBER('struct utmpx', 'ut_host', headers='utmpx.h',
877 define='HAVE_UX_UT_HOST')
878 conf.CHECK_CODE('struct utmp utarg; struct utmp *utreturn; utreturn = pututline(&utarg);',
879 'PUTUTLINE_RETURNS_UTMP', headers='utmp.h',
880 msg="Checking whether pututline returns pointer")
881 conf.CHECK_SIZEOF(['((struct utmp *)NULL)->ut_line'], headers='utmp.h',
882 define='SIZEOF_UTMP_UT_LINE', critical=False)
883 if not conf.CONFIG_SET('SIZEOF_UTMP_UT_LINE'):
884 conf.env.with_utmp = False
885 elif int(conf.env.SIZEOF_UTMP_UT_LINE) < 15:
886 conf.env.with_utmp = False
887 if conf.env.with_utmp:
888 conf.DEFINE('WITH_UTMP', 1)
889 else:
890 Logs.warn("--with-utmp but utmp support not sufficient")
892 if Options.options.with_avahi:
893 conf.env.with_avahi = True
894 if not conf.CHECK_HEADERS('avahi-common/watch.h avahi-client/client.h'): conf.env.with_avahi = False
895 if not conf.CHECK_FUNCS_IN('avahi_client_new', 'avahi-client'): conf.env.with_avahi = False
896 if not conf.CHECK_FUNCS_IN('avahi_strerror', 'avahi-common'): conf.env.with_avahi = False
897 if conf.env.with_avahi:
898 conf.DEFINE('WITH_AVAHI_SUPPORT', 1)
899 else:
900 conf.SET_TARGET_TYPE('avahi-common', 'EMPTY')
901 conf.SET_TARGET_TYPE('avahi-client', 'EMPTY')
903 if Options.options.with_iconv:
904 conf.env.with_iconv = True
905 if not conf.CHECK_FUNCS_IN('iconv_open', 'iconv', headers='iconv.h'):
906 conf.env.with_iconv = False
907 if conf.env.with_iconv:
908 conf.DEFINE('HAVE_ICONV', 1)
910 if Options.options.with_pam:
911 use_pam=True
912 conf.CHECK_HEADERS('security/pam_appl.h pam/pam_appl.h')
913 if not conf.CONFIG_SET('HAVE_SECURITY_PAM_APPL_H') and not conf.CONFIG_SET('HAVE_PAM_PAM_APPL_H'):
914 Logs.warn("--with-pam=yes but pam_appl.h not found")
915 use_pam=False
916 conf.CHECK_FUNCS_IN('pam_get_data', 'pam')
917 conf.CHECK_HEADERS('security/pam_modules.h pam/pam_modules.h')
918 if not conf.CONFIG_SET('HAVE_SECURITY_PAM_MODULES_H') and not conf.CONFIG_SET('HAVE_PAM_PAM_MODULES_H'):
919 Logs.warn("--with-pam=yes but pam_modules.h not found")
920 use_pam=False
921 conf.CHECK_HEADERS('security/pam_ext.h security/_pam_macros.h')
922 conf.CHECK_HEADERS('pam/pam_ext.h pam/_pam_macros.h')
923 conf.CHECK_FUNCS_IN('pam_vsyslog', 'pam')
924 conf.CHECK_CODE('''
925 #if defined(HAVE_SECURITY_PAM_APPL_H)
926 #include <security/pam_appl.h>
927 #elif defined(HAVE_PAM_PAM_APPL_H)
928 #include <pam/pam_appl.h>
929 #endif
930 pam_set_item(0, PAM_RHOST, 0);
931 ''',
932 'HAVE_PAM_RHOST',
933 lib='pam',
934 msg="Checking whether PAM_RHOST is available");
935 conf.CHECK_CODE('''
936 #if defined(HAVE_SECURITY_PAM_APPL_H)
937 #include <security/pam_appl.h>
938 #elif defined(HAVE_PAM_PAM_APPL_H)
939 #include <pam/pam_appl.h>
940 #endif
941 pam_set_item(0, PAM_TTY, 0);
942 ''',
943 'HAVE_PAM_TTY',
944 lib='pam',
945 msg="Checking whether PAM_TTY is available");
946 conf.CHECK_CODE('''
947 #if (!defined(LINUX))
949 #define PAM_EXTERN extern
950 #if defined(HAVE_SECURITY_PAM_APPL_H)
951 #include <security/pam_appl.h>
952 #elif defined(HAVE_PAM_PAM_APPL_H)
953 #include <pam/pam_appl.h>
954 #endif
956 #endif
958 #if defined(HAVE_SECURITY_PAM_MODULES_H)
959 #include <security/pam_modules.h>
960 #elif defined(HAVE_PAM_PAM_MODULES_H)
961 #include <pam/pam_modules.h>
962 #endif
964 #if defined(HAVE_SECURITY__PAM_MACROS_H)
965 #include <security/_pam_macros.h>
966 #elif defined(HAVE_PAM__PAM_MACROS_H)
967 #include <pam/_pam_macros.h>
968 #endif
970 #ifdef HAVE_SECURITY_PAM_EXT_H
971 #include <security/pam_ext.h>
972 #endif
974 int i; i = PAM_RADIO_TYPE;
975 ''',
976 'HAVE_PAM_RADIO_TYPE',
977 lib='pam',
978 msg="Checking whether PAM_RADIO_TYPE is available");
979 if use_pam:
980 conf.DEFINE('WITH_PAM', 1)
981 conf.DEFINE('WITH_PAM_MODULES', 1)
982 else:
983 conf.fatal("PAM support is enabled but prerequisite libraries "
984 "or headers not found. Use --without-pam to disable "
985 "PAM support.");
987 seteuid = False
990 # Ensure we select the correct set of system calls on Linux.
992 if (host_os.rfind('linux') > -1):
993 conf.CHECK_CODE('''
994 #if defined(HAVE_UNISTD_H)
995 #include <unistd.h>
996 #endif
997 #include <stdlib.h>
998 #include <stdio.h>
999 #include <sys/types.h>
1000 #include <errno.h>
1002 #ifdef HAVE_SYS_PRIV_H
1003 #include <sys/priv.h>
1004 #endif
1005 #ifdef HAVE_SYS_ID_H
1006 #include <sys/id.h>
1007 #endif
1009 #if defined(HAVE_SYSCALL_H)
1010 #include <syscall.h>
1011 #endif
1013 #if defined(HAVE_SYS_SYSCALL_H)
1014 #include <sys/syscall.h>
1015 #endif
1017 syscall(SYS_setresuid32, -1, -1, -1);
1018 syscall(SYS_setresgid32, -1, -1, -1);
1019 syscall(SYS_setreuid32, -1, -1);
1020 syscall(SYS_setregid32, -1, -1);
1021 syscall(SYS_setuid32, -1);
1022 syscall(SYS_setgid32, -1);
1023 syscall(SYS_setgroups32, 0, NULL);
1024 ''',
1025 'USE_LINUX_32BIT_SYSCALLS',
1026 msg="Checking whether Linux should use 32-bit credential calls");
1028 if (conf.CONFIG_SET('USE_LINUX_32BIT_SYSCALLS')):
1029 seteuid = conf.CHECK_CODE('''
1030 #define AUTOCONF_TEST 1
1031 #define HAVE_LINUX_THREAD_CREDENTIALS 1
1032 #define USE_LINUX_32BIT_SYSCALLS 1
1033 #include "../lib/util/setid.c"
1034 #include "./lib/util_sec.c"
1035 ''',
1036 'HAVE_LINUX_THREAD_CREDENTIALS',
1037 addmain=False,
1038 execute=True,
1039 msg="Checking whether we can use Linux thread-specific credentials with 32-bit system calls")
1040 else:
1041 seteuid = conf.CHECK_CODE('''
1042 #define AUTOCONF_TEST 1
1043 #define HAVE_LINUX_THREAD_CREDENTIALS 1
1044 #include "../lib/util/setid.c"
1045 #include "./lib/util_sec.c"
1046 ''',
1047 'HAVE_LINUX_THREAD_CREDENTIALS',
1048 addmain=False,
1049 execute=True,
1050 msg="Checking whether we can use Linux thread-specific credentials")
1051 if not seteuid:
1052 seteuid = conf.CHECK_CODE('''
1053 #define AUTOCONF_TEST 1
1054 #define USE_SETREUID 1
1055 #include "../lib/util/setid.c"
1056 #include "./lib/util_sec.c"
1057 ''',
1058 'USE_SETREUID',
1059 addmain=False,
1060 execute=True,
1061 msg="Checking whether setreuid is available")
1062 if not seteuid:
1063 seteuid = conf.CHECK_CODE('''
1064 #define AUTOCONF_TEST 1
1065 #define USE_SETRESUID 1
1066 #include "../lib/util/setid.c"
1067 #include "./lib/util_sec.c"
1068 ''',
1069 'USE_SETRESUID',
1070 addmain=False,
1071 execute=True,
1072 msg="Checking whether setresuid is available")
1073 if not seteuid:
1074 seteuid = conf.CHECK_CODE('''
1075 #define AUTOCONF_TEST 1
1076 #define USE_SETEUID 1
1077 #include "../lib/util/setid.c"
1078 #include "./lib/util_sec.c"
1079 ''',
1080 'USE_SETEUID',
1081 addmain=False,
1082 execute=True,
1083 msg="Checking whether seteuid is available")
1084 if not seteuid:
1085 seteuid = conf.CHECK_CODE('''
1086 #define AUTOCONF_TEST 1
1087 #define USE_SETUIDX 1
1088 #include "../lib/util/setid.c"
1089 #include "./lib/util_sec.c"
1090 ''',
1091 'USE_SETUIDX',
1092 addmain=False,
1093 execute=True,
1094 mandatory=True,
1095 msg="Checking whether setuidx is available")
1096 if Options.options.with_dnsupdate:
1097 if not conf.CONFIG_SET('HAVE_KRB5'):
1098 Logs.warn("--with-dnsupdate=yes but gssapi support not sufficient")
1099 else:
1100 conf.DEFINE('WITH_DNS_UPDATES', 1)
1101 # valgrind.h or valgrind/valgrind.h is checked in lib/replace/wscript
1102 if Options.options.developer:
1103 if conf.CONFIG_SET('HAVE_VALGRIND_H') or conf.CONFIG_SET('HAVE_VALGRIND_VALGRIND_H'):
1104 conf.DEFINE('VALGRIND', '1')
1106 if conf.CHECK_CODE('''
1107 #include <bits/sockaddr.h>
1108 #include <linux/netlink.h>
1109 ''',
1110 'HAVE_LINUX_NETLINK_H',
1111 msg="Checking whether Linux netlink is available"):
1113 conf.CHECK_CODE('''
1114 #include <bits/sockaddr.h>
1115 #include <linux/netlink.h>
1116 #include <linux/rtnetlink.h>
1117 ''',
1118 'HAVE_LINUX_RTNETLINK_H',
1119 msg='Checking whether Linux rtnetlink is available')
1121 conf.CHECK_CODE('''
1122 #include "../tests/fcntl_lock.c"
1123 ''',
1124 'HAVE_FCNTL_LOCK',
1125 addmain=False,
1126 execute=True,
1127 msg='Checking whether fcntl locking is available')
1129 conf.CHECK_CODE('''
1130 #include <unistd.h>
1131 #include <sys/types.h>
1132 #include <sys/stat.h>
1133 #include <fcntl.h>
1134 #include <errno.h>
1136 #define DATA "ofdtest.fcntl"
1138 int main() {
1139 struct flock lck = {
1140 .l_whence = SEEK_SET,
1141 .l_type = F_WRLCK,
1142 .l_start = 0,
1143 .l_len = 1,
1144 .l_pid = 0,
1146 int ret;
1147 int fd1;
1148 int fd2;
1149 char *testdir = getenv("TESTDIR");
1151 if (testdir) {
1152 if (chdir(testdir) != 0) {
1153 goto err;
1157 unlink(DATA);
1158 fd1 = open(DATA, O_RDWR|O_CREAT|O_EXCL, 0600);
1159 fd2 = open(DATA, O_RDWR);
1160 if (fd1 == -1 || fd2 == -1) {
1161 goto err;
1163 ret = fcntl(fd1,F_OFD_SETLKW,&lck);
1164 if (ret == -1) {
1165 goto err;
1167 ret = fcntl(fd2,F_OFD_SETLK,&lck);
1168 if (ret != -1) {
1169 goto err;
1171 if (errno != EAGAIN) {
1172 goto err;
1174 ret = fcntl(fd2,F_OFD_GETLK,&lck);
1175 if (ret == -1) {
1176 goto err;
1178 unlink(DATA);
1179 exit(0);
1180 err:
1181 unlink(DATA);
1182 exit(1);
1183 }''',
1184 'HAVE_OFD_LOCKS',
1185 addmain=False,
1186 execute=True,
1187 msg="Checking whether fcntl lock supports open file description locks")
1189 conf.CHECK_CODE('''
1190 #include <fcntl.h>
1191 #include <unistd.h>
1192 #include <stdlib.h>
1193 #include <sys/socket.h>
1195 int main(void)
1197 int sockfd, ret;
1198 struct f_owner_ex owner, get_owner;
1200 sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
1201 if (sockfd == -1) {
1202 goto err;
1205 owner.type = F_OWNER_PID;
1206 owner.pid = getpid();
1208 ret = fcntl(sockfd, F_SETOWN_EX, &owner);
1209 if (ret == -1) {
1210 goto err;
1213 ret = fcntl(sockfd, F_GETOWN_EX, &get_owner);
1214 if (ret == -1) {
1215 goto err;
1218 if (get_owner.type != F_OWNER_PID) {
1219 goto err;
1222 if (get_owner.pid != getpid()) {
1223 goto err;
1226 close(sockfd);
1227 exit(0);
1228 err:
1229 close(sockfd);
1230 exit(1);
1231 }''',
1232 'HAVE_F_OWNER_EX',
1233 addmain=False,
1234 execute=True,
1235 msg="Checking whether fcntl supports flags to send direct I/O availability signals")
1237 conf.CHECK_CODE('''
1238 #include <fcntl.h>
1239 #include <unistd.h>
1240 #include <stdlib.h>
1241 #include <stdint.h>
1243 #define DATA "hinttest.fcntl"
1245 int main(void)
1247 uint64_t hint, get_hint;
1248 int fd;
1250 fd = open(DATA, O_RDONLY | O_CREAT | O_EXCL);
1251 if (fd == -1) {
1252 goto err;
1255 hint = RWH_WRITE_LIFE_SHORT;
1256 int ret = fcntl(fd, F_SET_RW_HINT, &hint);
1257 if (ret == -1) {
1258 goto err;
1261 ret = fcntl(fd, F_GET_RW_HINT, &get_hint);
1262 if (ret == -1) {
1263 goto err;
1266 if (get_hint != RWH_WRITE_LIFE_SHORT) {
1267 goto err;
1270 hint = RWH_WRITE_LIFE_EXTREME;
1271 ret = fcntl(fd, F_SET_FILE_RW_HINT, &hint);
1272 if (ret == -1) {
1273 goto err;
1276 ret = fcntl(fd, F_GET_FILE_RW_HINT, &get_hint);
1277 if (ret == -1) {
1278 goto err;
1281 if (get_hint != RWH_WRITE_LIFE_EXTREME) {
1282 goto err;
1285 close(fd);
1286 unlink(DATA);
1287 exit(0);
1288 err:
1289 close(fd);
1290 unlink(DATA);
1291 exit(1);
1292 }''',
1293 'HAVE_RW_HINTS',
1294 addmain=False,
1295 execute=True,
1296 msg="Checking whether fcntl supports setting/geting hints")
1298 conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_mtim.tv_nsec',
1299 define='HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC') # Linux, Solaris
1300 conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_mtimensec',
1301 define='HAVE_STRUCT_STAT_ST_MTIMENSEC') # BSD, if defined _POSIX_SOURCE
1302 conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_mtimespec.tv_nsec',
1303 define='HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC') # BSD, if not defined _POSIX_SOURCE
1304 conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_mtime_n',
1305 define='HAVE_STRUCT_STAT_ST_MTIME_N') # AIX
1306 conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_umtime',
1307 define='HAVE_STRUCT_STAT_ST_UMTIME') # Tru64
1308 if conf.CONFIG_SET('HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC') or \
1309 conf.CONFIG_SET('HAVE_STRUCT_STAT_ST_MTIMENSEC') or \
1310 conf.CONFIG_SET('HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC') or \
1311 conf.CONFIG_SET('HAVE_STRUCT_STAT_ST_MTIME_N') or \
1312 conf.CONFIG_SET('HAVE_STRUCT_STAT_ST_UMTIME'):
1313 conf.DEFINE('HAVE_STAT_HIRES_TIMESTAMPS', '1')
1315 # recent FreeBSD, NetBSD have creation timestamps called birthtime:
1316 conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_birthtime',
1317 define='HAVE_STRUCT_STAT_ST_BIRTHTIME')
1318 conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_birthtimespec.tv_nsec',
1319 define='HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC')
1320 conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_birthtimensec',
1321 define='HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC')
1323 conf.CHECK_CODE('''
1324 ssize_t err = posix_fadvise(0,0,0x80000,POSIX_FADV_WILLNEED);
1325 ''',
1326 'HAVE_POSIX_FADVISE',
1327 msg='Checking whether posix_fadvise is available',
1328 headers='unistd.h fcntl.h')
1330 for v in ['_SC_NGROUPS_MAX', '_SC_NPROC_ONLN', '_SC_NPROCESSORS_ONLN', '_SC_PAGESIZE' ]:
1331 conf.CHECK_CODE('''
1332 #include <unistd.h>
1333 return sysconf(%s) == -1 ? 1 : 0;
1334 ''' % v,
1335 'SYSCONF%s' % v,
1336 msg='Checking whether sysconf(%s) is available' % v)
1338 conf.CHECK_CODE('''
1339 #include <sys/syscall.h>
1340 #include <unistd.h>
1341 syscall(SYS_initgroups, 16, NULL, NULL, 0);
1342 ''',
1343 'HAVE_DARWIN_INITGROUPS',
1344 msg='Checking whether to use the Darwin-specific initgroups system call')
1346 conf.CHECK_CODE('''struct utimbuf tbuf; tbuf.actime = 0; tbuf.modtime = 1; exit(utime("foo.c",&tbuf));''',
1347 'HAVE_UTIMBUF',
1348 headers='sys/types.h utime.h',
1349 msg='Checking whether struct utimbuf is available')
1351 if conf.CHECK_CODE('''struct sigevent s;''',
1352 'HAVE_STRUCT_SIGEVENT',
1353 headers='sys/types.h stdlib.h stddef.h signal.h',
1354 msg='Checking whether we have the struct sigevent'):
1355 conf.CHECK_STRUCTURE_MEMBER('struct sigevent', 'sigev_value.sival_ptr',
1356 define='HAVE_STRUCT_SIGEVENT_SIGEV_VALUE_SIVAL_PTR',
1357 headers='signal.h');
1358 conf.CHECK_STRUCTURE_MEMBER('struct sigevent', 'sigev_value.sigval_ptr',
1359 define='HAVE_STRUCT_SIGEVENT_SIGEV_VALUE_SIGVAL_PTR',
1360 headers='signal.h');
1362 if os.path.exists('/proc/sys/kernel/core_pattern'):
1363 conf.DEFINE('HAVE_SYS_KERNEL_PROC_CORE_PATTERN', '1')
1365 if conf.CHECK_CODE('''
1366 #include <time.h>
1367 main() {
1368 struct tm *tm;
1369 if (sizeof(time_t) == 8) {
1370 time_t max_time = 0x7fffffffffffffffll;
1371 tm = gmtime(&max_time);
1372 /* This should fail with 32-bit tm_year. */
1373 if (tm == NULL) {
1374 /* Max time_t that works with 32-bit int tm_year in struct tm. */
1375 max_time = 67768036191676799ll;
1376 tm = gmtime(&max_time);
1377 if (tm) {
1378 exit(0);
1382 exit(1);
1383 }''',
1384 '__TIME_T_MAX',
1385 addmain=False,
1386 execute=True,
1387 msg="Checking for the maximum value of the 'time_t' type"):
1388 conf.DEFINE('TIME_T_MAX', '67768036191676799ll')
1390 conf.CHECK_CODE('''
1391 #if defined(HAVE_UNISTD_H)
1392 #include <unistd.h>
1393 #endif
1394 #include <sys/types.h>
1395 #if defined(HAVE_SYS_SYSMACROS_H)
1396 #include <sys/sysmacros.h>
1397 #endif
1398 main() { dev_t dev = makedev(1,2); return 0; }
1399 ''',
1400 'HAVE_MAKEDEV',
1401 addmain=False,
1402 msg='Checking whether the macro for makedev is available')
1404 conf.CHECK_CODE('''
1405 #include <stdio.h>
1406 #include <limits.h>
1407 #include <signal.h>
1409 void exit_on_core(int ignored) {
1410 exit(1);
1413 main() {
1414 char *newpath;
1415 signal(SIGSEGV, exit_on_core);
1416 newpath = realpath("/tmp", NULL);
1417 exit((newpath != NULL) ? 0 : 1);
1419 ''',
1420 'REALPATH_TAKES_NULL',
1421 addmain=False,
1422 execute=True,
1423 msg='Checking whether the realpath function allows a NULL argument')
1425 conf.CHECK_CODE('''#include "../tests/ftruncate.c"''',
1426 'HAVE_FTRUNCATE_EXTEND',
1427 msg='Checking for ftruncate extend',
1428 addmain=False,
1429 execute=True)
1431 conf.SET_TARGET_TYPE('sendfile', 'EMPTY')
1432 conf.CHECK_LIB('sendfile')
1433 if not Options.options.with_sendfile_support == False:
1434 if (host_os.rfind('linux') > -1) or (host_os.rfind('gnu') > -1) or (host_os.rfind('k*bsd*-gnu') > -1) or (host_os.rfind('kopensolaris*-gnu') > -1):
1435 conf.CHECK_CODE('''
1436 int tofd, fromfd;
1437 off_t offset;
1438 size_t total;
1439 ssize_t nwritten = sendfile(tofd, fromfd, &offset, total);
1440 ''',
1441 '_HAVE_SENDFILE',
1442 headers='sys/sendfile.h',
1443 msg='Checking for linux sendfile support')
1445 if conf.CONFIG_SET('_HAVE_SENDFILE'):
1446 conf.DEFINE('HAVE_SENDFILE', '1')
1447 conf.DEFINE('LINUX_SENDFILE_API', '1')
1448 elif (host_os.rfind('freebsd') > -1) or (host_os.rfind('dragonfly') > -1):
1449 conf.CHECK_CODE('''
1450 #include <sys/types.h>
1451 #include <unistd.h>
1452 #include <sys/socket.h>
1453 #include <sys/uio.h>
1454 int fromfd, tofd, ret, total=0;
1455 off_t offset, nwritten;
1456 struct sf_hdtr hdr;
1457 struct iovec hdtrl;
1458 hdr.headers = &hdtrl;
1459 hdr.hdr_cnt = 1;
1460 hdr.trailers = NULL;
1461 hdr.trl_cnt = 0;
1462 hdtrl.iov_base = NULL;
1463 hdtrl.iov_len = 0;
1464 ret = sendfile(fromfd, tofd, offset, total, &hdr, &nwritten, 0)
1465 ''',
1466 '_HAVE_SENDFILE',
1467 msg='Checking for freebsd sendfile support')
1468 if conf.CONFIG_SET('_HAVE_SENDFILE'):
1469 conf.DEFINE('HAVE_SENDFILE', '1')
1470 conf.DEFINE('FREEBSD_SENDFILE_API', '1')
1471 elif (host_os.rfind('darwin') > -1):
1472 conf.CHECK_CODE('''
1473 #include <sys/types.h>
1474 #include <sys/socket.h>
1475 #include <sys/uio.h>
1476 int fromfd, tofd, ret;
1477 off_t offset, nwritten;
1478 struct sf_hdtr hdr;
1479 struct iovec hdtrl;
1480 hdr.headers = &hdtrl;
1481 hdr.hdr_cnt = 1;
1482 hdr.trailers = (void *)0;
1483 hdr.trl_cnt = 0;
1484 hdtrl.iov_base = (void *)0;
1485 hdtrl.iov_len = 0;
1486 ret = sendfile(fromfd, tofd, offset, &nwritten, &hdr, 0);
1487 ''',
1488 '_HAVE_SENDFILE',
1489 msg='Checking for darwin sendfile support')
1490 if conf.CONFIG_SET('_HAVE_SENDFILE'):
1491 conf.DEFINE('HAVE_SENDFILE', '1')
1492 conf.DEFINE('DARWIN_SENDFILE_API', '1')
1493 elif (host_os.rfind('hpux') > -1) or (host_os.rfind('osf') > -1):
1494 conf.CHECK_CODE('''
1495 #include <sys/socket.h>
1496 #include <sys/uio.h>
1497 int fromfd, tofd;
1498 size_t total=0;
1499 struct iovec hdtrl[2];
1500 ssize_t nwritten;
1501 off_t offset;
1502 hdtrl[0].iov_base = 0;
1503 hdtrl[0].iov_len = 0;
1504 nwritten = sendfile(tofd, fromfd, offset, total, &hdtrl[0], 0);
1505 ''',
1506 '_HAVE_SENDFILE',
1507 msg='Checking for osf/hpux sendfile support')
1508 if conf.CONFIG_SET('_HAVE_SENDFILE'):
1509 conf.DEFINE('HAVE_SENDFILE', '1')
1510 conf.DEFINE('HPUX_SENDFILE_API', '1')
1511 elif (host_os.rfind('sunos') > -1):
1512 conf.CHECK_FUNCS_IN('sendfilev', 'sendfile')
1513 conf.CHECK_CODE('''
1514 #include <sys/sendfile.h>,
1515 int sfvcnt;
1516 size_t xferred;
1517 struct sendfilevec vec[2];
1518 ssize_t nwritten;
1519 int tofd;
1520 sfvcnt = 2;
1521 vec[0].sfv_fd = SFV_FD_SELF;
1522 vec[0].sfv_flag = 0;
1523 vec[0].sfv_off = 0;
1524 vec[0].sfv_len = 0;
1525 vec[1].sfv_fd = 0;
1526 vec[1].sfv_flag = 0;
1527 vec[1].sfv_off = 0;
1528 vec[1].sfv_len = 0;
1529 nwritten = sendfilev(tofd, vec, sfvcnt, &xferred);
1530 ''',
1531 '_HAVE_SENDFILEV',
1532 msg='Checking for solaris sendfilev support',
1533 lib='sendfile')
1534 if conf.CONFIG_SET('_HAVE_SENDFILEV'):
1535 conf.DEFINE('HAVE_SENDFILEV', '1')
1536 conf.DEFINE('SOLARIS_SENDFILE_API', '1')
1537 elif (host_os.rfind('aix') > -1):
1538 conf.CHECK_CODE('''
1539 #include <sys/socket.h>
1540 int fromfd, tofd;
1541 size_t total=0;
1542 struct sf_parms hdtrl;
1543 ssize_t nwritten;
1544 hdtrl.header_data = 0;
1545 hdtrl.header_length = 0;
1546 hdtrl.file_descriptor = fromfd;
1547 hdtrl.file_offset = 0;
1548 hdtrl.file_bytes = 0;
1549 hdtrl.trailer_data = 0;
1550 hdtrl.trailer_length = 0;
1551 nwritten = send_file(&tofd, &hdtrl, 0);
1552 ''',
1553 '_HAVE_SENDFILE',
1554 msg='Checking for AIX send_file support')
1555 if conf.CONFIG_SET('_HAVE_SENDFILE'):
1556 conf.DEFINE('HAVE_SENDFILE', '1')
1557 conf.DEFINE('AIX_SENDFILE_API', '1')
1559 if Options.options.with_sendfile_support == True and not conf.CONFIG_SET('HAVE_SENDFILE'):
1560 conf.fatal('sendfile support not found but it was requested !')
1561 # Check for getcwd allowing a NULL arg.
1562 conf.CHECK_CODE('''
1563 #include <unistd.h>
1564 main() {
1565 char *s = getcwd(NULL,0);
1566 exit(s != NULL ? 0 : 1);
1567 }''', 'GETCWD_TAKES_NULL', addmain=False, execute=True,
1568 msg="getcwd takes a NULL argument")
1571 # UnixWare 7.x has its getspnam in -lgen
1572 conf.CHECK_FUNCS_IN('getspnam', 'gen')
1573 conf.CHECK_FUNCS_IN('getspnam', 'security')
1574 conf.CHECK_FUNCS_IN('getspnam', 'sec')
1576 legacy_quota_libs = ''
1577 if not Options.options.with_quotas == False:
1578 # For quotas on Veritas VxFS filesystems
1579 conf.CHECK_HEADERS('sys/fs/vx_quota.h')
1580 # For sys/quota.h and linux/quota.h
1581 conf.CHECK_HEADERS('sys/quota.h')
1582 # For quotas on BSD systems
1583 conf.CHECK_HEADERS('ufs/ufs/quota.h')
1584 # For quotas on AIX systems
1585 conf.CHECK_HEADERS('jfs/quota.h')
1586 # For quotas on Linux XFS filesystems
1587 if conf.CHECK_HEADERS('xfs/xqm.h'):
1588 conf.DEFINE('HAVE_XFS_QUOTAS', '1')
1589 else:
1590 # For Irix XFS
1591 conf.CHECK_CODE('''
1592 #include "confdefs.h"
1593 #ifdef HAVE_SYS_TYPES_H
1594 #include <sys/types.h>
1595 #endif
1596 #ifdef HAVE_ASM_TYPES_H
1597 #include <asm/types.h>
1598 #endif
1599 #include <sys/quota.h>
1600 int i = Q_XGETQUOTA;''',
1601 define='HAVE_XFS_QUOTAS',
1602 msg='for XFS QUOTA in <sys/quota.h>',
1603 execute=False,
1604 local_include=False)
1606 # For IRIX like dqb_isoftlimit instead of dqb_fsoftlimit in struc dqblk
1607 conf.CHECK_STRUCTURE_MEMBER('struct dqblk', 'dqb_fsoftlimit', define='HAVE_DQB_FSOFTLIMIT',
1608 headers='sys/quota.h')
1609 #darwin style quota bytecount
1610 conf.CHECK_STRUCTURE_MEMBER('struct dqblk', 'dqb_curbytes', define='HAVE_STRUCT_DQBLK_DQB_CURBYTES',
1611 headers='sys/quota.h')
1612 conf.CHECK_HEADERS('rpc/types.h rpc/xdr.h', together=True)
1613 if conf.CHECK_HEADERS('rpcsvc/rquota.h', lib='tirpc'):
1614 # Optional structure member
1615 conf.CHECK_STRUCTURE_MEMBER('struct getquota_rslt', 'getquota_rslt_u',
1616 define='HAVE_GETQUOTA_RSLT_GETQUOTA_RSLT_U',
1617 headers='rpcsvc/rquota.h',
1618 lib='tirpc')
1620 # Required function for NFS quota support
1621 conf.CHECK_CODE('''
1622 clnt_create("", RQUOTAPROG, RQUOTAVERS, "udp");
1623 ''',
1624 headers="rpc/rpc.h rpc/types.h rpcsvc/rquota.h rpc/nettype.h rpc/xdr.h",
1625 define='HAVE_NFS_QUOTAS',
1626 msg='checking for clnt_create()',
1627 execute=True,
1628 local_include=False,
1629 lib='tirpc')
1631 if (host_os.rfind('linux') > -1):
1632 conf.DEFINE('HAVE_QUOTACTL_LINUX', '1')
1633 elif not conf.CONFIG_SET("HAVE_XFS_QUOTAS"):
1634 if not conf.CHECK_CODE('''
1635 #define HAVE_QUOTACTL_4A 1
1636 #define AUTOCONF_TEST 1
1637 #include "../tests/sysquotas.c"
1638 ''',
1639 cflags=conf.env['WERROR_CFLAGS'],
1640 define='HAVE_QUOTACTL_4A',
1641 msg='for QUOTACTL_4A: long quotactl(int cmd, char *special, qid_t id, caddr_t addr)',
1642 execute=True,
1643 addmain=False):
1645 conf.CHECK_CODE('''
1646 #define HAVE_QUOTACTL_4B 1
1647 #define AUTOCONF_TEST 1
1648 #include "../tests/sysquotas.c"
1649 ''',
1650 cflags=conf.env['WERROR_CFLAGS'],
1651 define='HAVE_QUOTACTL_4B',
1652 msg='for QUOTACTL_4B: int quotactl(const char *path, int cmd, int id, char *addr)',
1653 execute=True,
1654 addmain=False)
1656 if conf.CONFIG_SET('HAVE_QUOTACTL_LINUX') or \
1657 conf.CONFIG_SET('HAVE_QUOTACTL_4A') or \
1658 conf.CONFIG_SET('HAVE_QUOTACTL_4B') or \
1659 conf.CONFIG_SET('HAVE_XFS_QUOTAS'):
1660 conf.DEFINE('HAVE_SYS_QUOTAS', '1')
1661 conf.DEFINE('WITH_QUOTAS', '1')
1664 # check if Legacy quota code can be brought in
1665 # if standard interfaces are not supported
1667 if not conf.CONFIG_SET('WITH_QUOTAS'):
1668 if host_os.rfind('sunos5') > -1:
1669 conf.DEFINE('SUNOS5', '1')
1670 legacy_quota_libs = 'nsl'
1671 conf.CHECK_CODE('''
1672 #define WITH_QUOTAS 1
1673 #define AUTOCONF_TEST 1
1674 #include "../tests/oldquotas.c"
1675 ''',
1676 cflags=conf.env['WERROR_CFLAGS'],
1677 define='WITH_QUOTAS',
1678 lib=legacy_quota_libs,
1679 msg='Checking whether legacy quota code can be used',
1680 execute=False,
1681 addmain=False)
1682 if not conf.CONFIG_SET('WITH_QUOTAS'):
1683 legacy_quota_libs = ''
1684 conf.env['legacy_quota_libs'] = legacy_quota_libs
1686 if Options.options.with_quotas == True and not conf.CONFIG_SET('WITH_QUOTAS'):
1687 conf.fatal('quota support not found but it was requested !')
1689 conf.CHECK_CODE('(void)unshare(CLONE_FS);',
1690 headers='sched.h',
1691 define='HAVE_UNSHARE_CLONE_FS',
1692 msg='for Linux unshare(CLONE_FS)')
1694 # Check for mallinfo
1695 conf.CHECK_CODE('''
1696 struct mallinfo mi;
1697 int tmp;
1699 mi = mallinfo();
1700 tmp = mi.arena + mi.ordblks + mi.smblks + mi.hblks +
1701 mi.hblkhd + mi.usmblks + mi.fsmblks + mi.uordblks +
1702 mi.fordblks + mi.keepcost;
1703 return tmp;
1704 ''', 'HAVE_MALLINFO', msg="Checking for mallinfo()", headers='malloc.h')
1707 # cluster support (CTDB)
1709 if not Options.options.with_cluster_support:
1710 Logs.info("building without cluster support (--without-cluster-support)")
1711 conf.env.with_ctdb = False
1712 else:
1713 Logs.info("building with cluster support")
1714 conf.env.with_ctdb = True
1715 conf.DEFINE('CLUSTER_SUPPORT', 1)
1717 conf.CHECK_CODE('void seekdir(DIR *d, long loc) { return; }',
1718 'SEEKDIR_RETURNS_VOID',
1719 headers='sys/types.h dirent.h',
1720 msg='Checking whether seekdir returns void')
1722 if Options.options.with_profiling_data:
1723 conf.DEFINE('WITH_PROFILE', 1);
1724 conf.CHECK_FUNCS('getrusage', headers="sys/time.h sys/resource.h")
1726 if (conf.CHECK_HEADERS('linux/ioctl.h sys/ioctl.h linux/fs.h') and
1727 conf.CHECK_DECLS('FS_IOC_GETFLAGS FS_COMPR_FL', headers='linux/fs.h')):
1728 conf.DEFINE('HAVE_LINUX_IOCTL', '1')
1730 conf.env['CFLAGS_CEPHFS'] = "-D_FILE_OFFSET_BITS=64"
1731 if Options.options.libcephfs_dir:
1732 Logs.error('''--with-libcephfs no longer supported, please use compiler
1733 flags instead, e.g. GCC LIBRARY_PATH and C_INCLUDE_PATH''')
1734 sys.exit(1)
1736 if (Options.options.with_cephfs and
1737 conf.CHECK_HEADERS('cephfs/libcephfs.h', False, False, 'cephfs') and
1738 conf.CHECK_LIB('cephfs', shlib=True)):
1739 if (Options.options.with_acl_support and
1740 conf.CHECK_FUNCS_IN('ceph_statx', 'cephfs',
1741 headers='cephfs/libcephfs.h')):
1742 conf.DEFINE('HAVE_CEPH', '1')
1743 else:
1744 Logs.warn('''Ceph support disabled due to --without-acl-support
1745 or lack of ceph_statx support''')
1746 conf.undefine('HAVE_CEPH')
1748 if Options.options.with_glusterfs:
1749 conf.CHECK_CFG(package='glusterfs-api', args='"glusterfs-api >= 4" --cflags --libs',
1750 msg='Checking for glusterfs-api >= 4', uselib_store="GFAPI")
1751 conf.CHECK_HEADERS('glusterfs/api/glfs.h', lib='gfapi')
1752 conf.CHECK_LIB('gfapi', shlib=True)
1754 if conf.CONFIG_SET('HAVE_GLUSTERFS_API_GLFS_H'):
1755 if Options.options.with_acl_support:
1756 conf.DEFINE('HAVE_GLUSTERFS', '1')
1757 else:
1758 Logs.warn("GlusterFS support disabled due to --without-acl-support")
1759 conf.undefine('HAVE_GLUSTERFS')
1760 else:
1761 conf.undefine('HAVE_GLUSTERFS')
1763 conf.CHECK_CFG(package='glusterfs-api', args='"glusterfs-api >= 6" --cflags --libs',
1764 msg='Checking for glusterfs-api >= 6',
1765 uselib_store="GFAPI_VER_6")
1766 conf.CHECK_CFG(package='glusterfs-api', args='"glusterfs-api >= 7.6" --cflags --libs',
1767 msg='Checking for glusterfs-api >= 7.6',
1768 uselib_store="GFAPI_VER_7_6")
1769 conf.CHECK_CFG(package='glusterfs-api', args='"glusterfs-api >= 7.9" --cflags --libs',
1770 msg='Checking for glusterfs-api >= 7.9',
1771 uselib_store="GFAPI_VER_7_9")
1772 else:
1773 conf.SET_TARGET_TYPE('gfapi', 'EMPTY')
1774 conf.undefine('HAVE_GLUSTERFS')
1776 if Options.options.enable_vxfs:
1777 conf.DEFINE('HAVE_VXFS', '1')
1779 if conf.CHECK_CFG(package='liburing', args='--cflags --libs',
1780 msg='Checking for liburing package', uselib_store="URING"):
1781 if (conf.CHECK_HEADERS('liburing.h', lib='uring')
1782 and conf.CHECK_LIB('uring', shlib=True)):
1783 conf.CHECK_FUNCS_IN('io_uring_ring_dontfork', 'uring',
1784 headers='liburing.h')
1785 conf.DEFINE('HAVE_LIBURING', '1')
1787 conf.env.build_regedit = False
1788 if not Options.options.with_regedit == False:
1789 conf.PROCESS_SEPARATE_RULE('system_ncurses')
1790 if conf.CONFIG_SET('HAVE_NCURSES'):
1791 conf.env.build_regedit = True
1793 if conf.env.build_regedit:
1794 Logs.info("building regedit")
1795 else:
1796 if Options.options.with_regedit == False:
1797 Logs.info("not building regedit (--without-regedit)")
1798 elif Options.options.with_regedit == True:
1799 Logs.error("ncurses not available, cannot build regedit")
1800 conf.fatal("ncurses not available, but --with-regedit was specified")
1801 else:
1802 Logs.info("ncurses not available, not building regedit")
1804 if conf.CHECK_HEADERS('ftw.h') and conf.CHECK_FUNCS('nftw'):
1805 conf.env.build_mvxattr = True
1807 conf.env.build_winexe = False
1808 if not Options.options.with_winexe == False:
1809 if conf.CONFIG_SET('HAVE_WINEXE_CC_WIN32') or conf.CONFIG_SET('HAVE_WINEXE_CC_WIN64'):
1810 conf.env.build_winexe = True
1812 if conf.env.build_winexe:
1813 Logs.info("building winexe")
1814 else:
1815 if Options.options.with_winexe == False:
1816 Logs.info("not building winexe (--without-winexe)")
1817 elif Options.options.with_winexe == True:
1818 Logs.error("mingw not available, cannot build winexe")
1819 conf.fatal("mingw not available, but --with-winexe was specified")
1820 else:
1821 Logs.info("mingw not available, not building winexe")
1823 conf.CHECK_FUNCS_IN('DES_pcbc_encrypt', 'crypto')
1824 if Options.options.with_fake_kaserver == True:
1825 conf.CHECK_HEADERS('afs/param.h afs/stds.h', together=True)
1826 conf.CHECK_HEADERS('afs/param.h afs/stds.h', together=True)
1827 if (conf.CONFIG_SET('HAVE_AFS_PARAM_H') and conf.CONFIG_SET('HAVE_AFS_STDS_H') and conf.CONFIG_SET('HAVE_DES_PCBC_ENCRYPT')):
1828 conf.DEFINE('WITH_FAKE_KASERVER', '1')
1829 else:
1830 conf.fatal('AFS headers not available, but --with-fake-kaserver was specified')
1832 if conf.CHECK_CFG(package='glib-2.0',
1833 args='--cflags --libs',
1834 msg='Checking for glib-2.0',
1835 uselib_store="GLIB-2.0"):
1836 if (conf.CHECK_HEADERS('glib.h', lib='glib-2.0') and conf.CHECK_LIB('glib-2.0', shlib=True)):
1837 conf.DEFINE('HAVE_GLIB', 1)
1839 if conf.CONFIG_SET('HAVE_GLIB'):
1840 conf.DEFINE('WITH_TEVENT_GLIB_GLUE', '1')
1842 conf.env['libtracker']=''
1843 tracker_versions = ['2.0', '1.0', '0.16', '0.14']
1845 for version in tracker_versions:
1846 testlib = 'tracker-sparql-' + version
1847 if conf.CHECK_CFG(package=testlib,
1848 args='--cflags --libs',
1849 mandatory=False):
1850 conf.SET_TARGET_TYPE(testlib, 'SYSLIB')
1851 conf.env['libtracker'] = testlib
1852 conf.DEFINE('HAVE_TRACKER', '1')
1853 break
1855 Logs.info("Checking for bison")
1856 bison.configure(conf)
1857 if conf.env['BISON']:
1858 conf.CHECK_COMMAND('%s --version | head -n1' % conf.env.BISON[0],
1859 msg='Using bison version',
1860 define=None,
1861 on_target=False)
1863 Logs.info("Checking for flex")
1864 conf.find_program('flex', var='FLEX')
1865 if conf.env['FLEX']:
1866 conf.env.FLEXFLAGS = ['-t']
1867 conf.CHECK_COMMAND('%s --version' % conf.env.FLEX[0],
1868 msg='Using flex version',
1869 define=None,
1870 on_target=False)
1872 with_spotlight_tracker_backend = (
1873 conf.CONFIG_SET('HAVE_TRACKER')
1874 and conf.CONFIG_SET('HAVE_GLIB')
1875 and conf.env['BISON']
1876 and conf.env['FLEX']
1877 and conf.CONFIG_GET('HAVE_UTF8_NORMALISATION')
1880 with_spotlight_es_backend = (
1881 conf.CONFIG_SET('HAVE_JSON_OBJECT')
1882 and conf.env['BISON']
1883 and conf.env['FLEX']
1884 and conf.CONFIG_GET('HAVE_UTF8_NORMALISATION')
1887 conf.env.with_spotlight = False
1888 if Options.options.with_spotlight is not False:
1889 backends = ['noindex']
1891 if not conf.env['BISON']:
1892 Logs.warn("Spotlight support requested but bison missing")
1893 if not conf.env['FLEX']:
1894 Logs.warn("Spotlight support requested but flex missing")
1895 if not conf.CONFIG_GET('HAVE_UTF8_NORMALISATION'):
1896 Logs.warn("Missing support for Unicode normalisation. "
1897 "Try installing icu-dev or libicu-devel.")
1898 if not conf.CONFIG_SET('HAVE_TRACKER'):
1899 Logs.warn('Missing libtracker-sparql development files for Spotlight backend "tracker"')
1900 if not conf.CONFIG_SET('HAVE_GLIB'):
1901 Logs.warn('Missing glib-2.0 development files for Spotlight backend "tracker"')
1902 if not conf.CONFIG_GET('HAVE_JSON_OBJECT'):
1903 Logs.warn('Missing libjansson development files for Spotlight backend "elasticsearch"')
1905 if with_spotlight_tracker_backend:
1906 conf.env.spotlight_backend_tracker = True
1907 backends.append('tracker')
1908 conf.DEFINE('HAVE_SPOTLIGHT_BACKEND_TRACKER', '1')
1910 if with_spotlight_es_backend:
1911 conf.env.spotlight_backend_es = True
1912 backends.append('elasticsearch')
1913 conf.DEFINE('HAVE_SPOTLIGHT_BACKEND_ES', '1')
1915 if (Options.options.with_spotlight is True
1916 and not conf.env.spotlight_backend_tracker
1917 and not conf.env.spotlight_backend_es):
1918 conf.fatal("Unmet dependencies for Spotlight backends")
1920 Logs.info("Building with Spotlight support, available backends: %s" % ', '.join(backends))
1921 default_static_modules.extend(TO_LIST('rpc_mdssvc_module'))
1922 conf.DEFINE('WITH_SPOTLIGHT', '1')
1923 conf.env.with_spotlight = True
1925 if not conf.CONFIG_SET('HAVE_RPC_XDR_H'):
1926 conf.CHECK_HEADERS('rpc/xdr.h', lib='tirpc')
1928 if conf.CHECK_FUNCS_IN('nscd_flush_cache', 'nscd', headers='libnscd.h'):
1929 conf.DEFINE('HAVE_NSCD_FLUSH_CACHE', '1')
1931 forced_static_modules.extend(TO_LIST('auth_builtin auth_sam auth_winbind'))
1932 default_static_modules.extend(TO_LIST('''pdb_smbpasswd pdb_tdbsam
1933 auth_unix
1934 nss_info_template idmap_tdb idmap_passdb
1935 idmap_nss'''))
1937 default_shared_modules.extend(TO_LIST('''
1938 vfs_recycle vfs_audit vfs_extd_audit vfs_full_audit
1939 vfs_fake_perms vfs_default_quota vfs_readonly vfs_cap
1940 vfs_expand_msdfs vfs_shadow_copy vfs_shadow_copy2
1941 vfs_readahead vfs_xattr_tdb
1942 vfs_streams_xattr vfs_streams_depot vfs_acl_xattr vfs_acl_tdb
1943 vfs_preopen vfs_catia
1944 vfs_media_harmony vfs_unityed_media vfs_fruit vfs_shell_snap
1945 vfs_commit vfs_worm vfs_crossrename vfs_linux_xfs_sgid
1946 vfs_time_audit vfs_offline vfs_virusfilter vfs_widelinks
1947 '''))
1948 if host_os.rfind('linux') > -1:
1949 default_shared_modules.extend(['vfs_snapper'])
1951 default_shared_modules.extend(TO_LIST('idmap_tdb2 idmap_script'))
1952 # these have broken dependencies
1953 forced_shared_modules.extend(TO_LIST('idmap_autorid idmap_rid idmap_hash'))
1955 if Options.options.developer:
1956 default_static_modules.extend(TO_LIST('charset_weird'))
1957 default_shared_modules.extend(TO_LIST('perfcount_test'))
1958 default_shared_modules.extend(TO_LIST('vfs_skel_opaque vfs_skel_transparent vfs_shadow_copy_test'))
1959 default_shared_modules.extend(TO_LIST('auth_skel pdb_test'))
1960 default_shared_modules.extend(TO_LIST('vfs_fake_dfq'))
1961 default_shared_modules.extend(TO_LIST('gpext_security gpext_registry gpext_scripts'))
1963 if Options.options.enable_selftest or Options.options.developer:
1964 default_shared_modules.extend(TO_LIST('vfs_fake_acls vfs_nfs4acl_xattr'))
1965 default_shared_modules.extend(TO_LIST('vfs_error_inject'))
1966 default_shared_modules.extend(TO_LIST('vfs_delay_inject'))
1968 if conf.CONFIG_SET('AD_DC_BUILD_IS_ENABLED'):
1969 default_static_modules.extend(TO_LIST('pdb_samba_dsdb auth_samba4 vfs_dfs_samba4'))
1970 default_shared_modules.extend(TO_LIST('vfs_posix_eadb'))
1972 if conf.CONFIG_SET('HAVE_FREEBSD_SUNACL_H'):
1973 default_shared_modules.extend(TO_LIST('vfs_zfsacl'))
1975 if conf.CONFIG_SET('HAVE_DIRFD_DECL'):
1976 default_shared_modules.extend(TO_LIST('vfs_syncops vfs_dirsort'))
1978 if conf.CONFIG_SET('HAVE_STATFS_F_FSID'):
1979 default_shared_modules.extend(TO_LIST('vfs_fileid'))
1981 if (conf.CONFIG_SET('HAVE_STRUCT_MSGHDR_MSG_CONTROL') or conf.CONFIG_SET('HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS')):
1982 default_shared_modules.extend(TO_LIST('vfs_aio_fork'))
1984 if conf.CONFIG_SET('HAVE_LIBURING'):
1985 default_shared_modules.extend(TO_LIST('vfs_io_uring'))
1987 if Options.options.with_pthreadpool:
1988 default_shared_modules.extend(TO_LIST('vfs_aio_pthread'))
1990 if conf.CONFIG_SET('HAVE_LDAP'):
1991 default_static_modules.extend(TO_LIST('pdb_ldapsam idmap_ldap'))
1993 if conf.CONFIG_SET('DARWINOS'):
1994 default_static_modules.extend(TO_LIST('charset_macosxfs'))
1996 if conf.CONFIG_SET('HAVE_GPFS') and conf.CONFIG_SET('HAVE_KERNEL_OPLOCKS_LINUX'):
1997 default_shared_modules.extend(TO_LIST('vfs_gpfs'))
1999 if (conf.CONFIG_SET('HAVE_LINUX_IOCTL')
2000 and conf.CONFIG_SET('HAVE_BASENAME') and conf.CONFIG_SET('HAVE_DIRNAME')):
2001 default_shared_modules.extend(TO_LIST('vfs_btrfs'))
2003 if conf.CONFIG_SET("HAVE_CEPH"):
2004 default_shared_modules.extend(TO_LIST('vfs_ceph'))
2005 # Unlike vfs_ceph, vfs_ceph_snapshots doesn't depend on libcephfs, so
2006 # can be enabled atop a kernel CephFS share (with vfs_default) in
2007 # addition to vfs_ceph. Still, only enable vfs_ceph_snapshots builds
2008 # if we're building with libcephfs for now.
2009 default_shared_modules.extend(TO_LIST('vfs_ceph_snapshots'))
2011 if conf.CONFIG_SET('HAVE_GLUSTERFS'):
2012 default_shared_modules.extend(TO_LIST('vfs_glusterfs'))
2014 if conf.CONFIG_SET('HAVE_SETMNTENT'):
2015 default_shared_modules.extend(TO_LIST('vfs_glusterfs_fuse'))
2017 if conf.CONFIG_SET('HAVE_VXFS'):
2018 default_shared_modules.extend(TO_LIST('vfs_vxfs'))
2020 explicit_shared_modules = TO_LIST(Options.options.shared_modules, delimiter=',')
2021 explicit_static_modules = TO_LIST(Options.options.static_modules, delimiter=',')
2023 def replace_list_item(lst, item, value):
2024 try:
2025 idx = lst.index(item)
2026 lst[idx] = value
2027 except:
2028 pass
2029 # PDB module file name should have the same name as module registers itself
2030 # In Autoconf build we export LDAP passdb module as ldapsam but WAF build
2031 # was always exporting pdb_ldap. In order to support existing packages
2032 # allow referring to pdb_ldapsam as pdb_ldap but use proper name internally.
2033 replace_list_item(explicit_shared_modules, 'pdb_ldap', 'pdb_ldapsam')
2034 replace_list_item(explicit_static_modules, 'pdb_ldap', 'pdb_ldapsam')
2036 final_static_modules = []
2037 final_static_modules.extend(TO_LIST(required_static_modules))
2038 final_shared_modules = []
2040 if '!FORCED' not in explicit_static_modules:
2041 final_static_modules.extend(TO_LIST(forced_static_modules))
2042 if '!FORCED' not in explicit_shared_modules:
2043 final_shared_modules.extend(TO_LIST(forced_shared_modules))
2044 if '!DEFAULT' not in explicit_static_modules:
2045 final_static_modules.extend(TO_LIST(default_static_modules))
2046 if '!DEFAULT' not in explicit_shared_modules:
2047 final_shared_modules.extend(TO_LIST(default_shared_modules))
2049 if 'ALL' in explicit_static_modules:
2050 for m in default_shared_modules:
2051 if m in final_shared_modules:
2052 final_shared_modules.remove(m)
2053 final_static_modules.append(m)
2054 if 'ALL' in explicit_shared_modules:
2055 for m in default_static_modules:
2056 if m in final_static_modules:
2057 final_static_modules.remove(m)
2058 final_shared_modules.append(m)
2060 for m in explicit_static_modules:
2061 if m in ['ALL','!DEFAULT','!FORCED']:
2062 continue
2063 if m.startswith('!'):
2064 m = m[1:]
2065 if m in required_static_modules:
2066 raise Errors.WafError('These modules are REQUIRED as static modules: %s' %
2067 ' '.join(required_static_modules))
2068 if m in final_static_modules:
2069 final_static_modules.remove(m)
2070 continue
2071 if m in forced_shared_modules:
2072 raise Errors.WafError('These modules MUST be configured as shared modules: %s' %
2073 ' '.join(forced_shared_modules))
2074 if m in final_shared_modules:
2075 final_shared_modules.remove(m)
2076 if m not in final_static_modules:
2077 final_static_modules.append(m)
2078 for m in explicit_shared_modules:
2079 if m in ['ALL','!DEFAULT','!FORCED']:
2080 continue
2081 if m.startswith('!'):
2082 m = m[1:]
2083 if m in final_shared_modules:
2084 final_shared_modules.remove(m)
2085 continue
2086 if m in required_static_modules:
2087 raise Errors.WafError('These modules are REQUIRED as static modules: %s' %
2088 ' '.join(required_static_modules))
2089 if m in forced_static_modules:
2090 raise Errors.WafError('These module MUST be configured as static modules: %s' %
2091 ' '.join(forced_static_modules))
2092 if m in final_static_modules:
2093 final_static_modules.remove(m)
2094 if m not in final_shared_modules:
2095 final_shared_modules.append(m)
2097 conf.env['static_modules'] = final_static_modules
2098 conf.env['shared_modules'] = final_shared_modules
2100 conf.DEFINE('STRING_STATIC_MODULES', ' '.join(final_static_modules), quote=True)
2102 static_list = {}
2103 shared_list = {}
2105 prefixes = ['vfs', 'pdb', 'auth', 'nss_info', 'charset', 'idmap', 'gpext', 'perfcount', 'rpc']
2106 conf.env['MODULE_PREFIXES'] = prefixes
2107 for p in prefixes:
2108 for m in final_static_modules:
2109 if m.find(p) == 0:
2110 if not p in static_list:
2111 static_list[p] = []
2112 static_list[p].append(m)
2113 for m in final_shared_modules:
2114 if m.find(p) == 0:
2115 if not p in shared_list:
2116 shared_list[p] = []
2117 shared_list[p].append(m)
2119 for p in prefixes:
2120 static_env = "%s_STATIC" % p.upper()
2121 shared_env = "%s_SHARED" % p.upper()
2122 conf.env[static_env] = []
2123 conf.env[shared_env] = []
2124 if p in static_list:
2125 decl_list = " ".join("extern NTSTATUS %s_init(TALLOC_CTX *mem_ctx); " % entry for entry in static_list[p])
2126 for entry in static_list[p]:
2127 conf.env[static_env].append('%s' % entry)
2128 conf.DEFINE('static_decl_%s' % p, decl_list)
2129 conf.DEFINE('static_init_%s(mem_ctx)' % p, '{ %s_init((mem_ctx)); }' % '_init((mem_ctx)); '.join(static_list[p]))
2130 else:
2131 conf.DEFINE('static_decl_%s' % p, '')
2132 conf.DEFINE('static_init_%s(mem_ctx)' % p, '{}')
2133 if p in shared_list:
2134 for entry in shared_list[p]:
2135 conf.DEFINE('%s_init' % entry, 'samba_init_module')
2136 conf.env[shared_env].append('%s' % entry)
2137 Logs.info("%s: %s" % (static_env, ','.join(conf.env[static_env])))
2138 Logs.info("%s: %s" % (shared_env, ','.join(conf.env[shared_env])))
2140 if (('vfs_snapper' in shared_list.get('vfs', []) or 'vfs_snapper' in static_list.get('vfs', []))
2141 and not (conf.CHECK_CFG(package='dbus-1', args='--cflags --libs',
2142 msg='Checking for dbus', uselib_store="DBUS-1")
2143 and conf.CHECK_HEADERS('dbus/dbus.h', lib='dbus-1')
2144 and conf.CHECK_LIB('dbus-1', shlib=True))):
2145 conf.fatal("vfs_snapper is enabled but prerequisite dbus-1 package not "
2146 "found. Use --with-shared-modules=!vfs_snapper to disable "
2147 "vfs_snapper support.")
2149 conf.SAMBA_CONFIG_H('include/config.h')