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