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