X-Git-Url: http://git.samba.org/?a=blobdiff_plain;f=source3%2Fwscript;h=49f11f2e5b2393d401b6333efdf9a8b7a74737fd;hb=0e003515703469e9f66f5119d401366697cdb767;hp=655de13b1c52ee0bf9866fc74d8d62701abed0f9;hpb=7de21e62946fdd74250be56bd33e9598237307c5;p=abartlet%2Fsamba.git%2F.git diff --git a/source3/wscript b/source3/wscript index 655de13b1c5..49f11f2e5b2 100644 --- a/source3/wscript +++ b/source3/wscript @@ -9,21 +9,23 @@ VERSION=None import sys, os from optparse import SUPPRESS_HELP sys.path.insert(0, srcdir+"/buildtools/wafsamba") -import wafsamba, Options +sys.path.insert(0, "source3") +import wafsamba, Options, Logs, Utils, Scripting import build.charset import samba_utils, samba_version import samba3 def set_options(opt): - opt.BUILTIN_DEFAULT('NONE') - opt.PRIVATE_EXTENSION_DEFAULT('s3') - opt.RECURSE('../lib/replace') - opt.RECURSE('build') - opt.RECURSE('selftest') - opt.RECURSE('../lib/nss_wrapper') - opt.RECURSE('../lib/socket_wrapper') - opt.RECURSE('../lib/tevent') - opt.RECURSE('../lib/tdb') + if not os.getenv('TOPLEVEL_BUILD'): + opt.BUILTIN_DEFAULT('NONE') + opt.PRIVATE_EXTENSION_DEFAULT('s3') + opt.RECURSE('../lib/replace') + opt.RECURSE('build') + opt.RECURSE('selftest') + opt.RECURSE('../lib/nss_wrapper') + opt.RECURSE('../lib/socket_wrapper') + opt.RECURSE('../lib/tevent') + opt.RECURSE('../lib/tdb') opt.add_option('--with-static-modules', help=("Comma-separated list of names of modules to statically link in"), @@ -44,6 +46,7 @@ def set_options(opt): opt.SAMBA3_ADD_OPTION('iprint', with_name="enable", without_name="disable") opt.SAMBA3_ADD_OPTION('merged-build', with_name="enable", without_name="disable") opt.SAMBA3_ADD_OPTION('pam') + opt.SAMBA3_ADD_OPTION('pam_smbpass') opt.SAMBA3_ADD_OPTION('quotas') opt.SAMBA3_ADD_OPTION('sys-quotas') opt.SAMBA3_ADD_OPTION('sendfile-support') @@ -56,39 +59,57 @@ def set_options(opt): opt.SAMBA3_ADD_OPTION('syslog') opt.SAMBA3_ADD_OPTION('automount') opt.SAMBA3_ADD_OPTION('aio-support') + opt.SAMBA3_ADD_OPTION('profiling-data') + + opt.SAMBA3_ADD_OPTION('cluster-support') + + opt.add_option('--with-ctdb-dir', + help=("Directory under which ctdb is installed"), + action="store", dest='ctdb_dir', default=None) + opt.add_option('--enable-old-ctdb', + help=("enable building against (too) old version of ctdb (default=false)"), + action="store_true", dest='enable_old_ctdb', default=False) + def configure(conf): from samba_utils import TO_LIST - version = samba_version.load_version(env=conf.env) - - conf.DEFINE('CONFIG_H_IS_FROM_SAMBA', 1) - conf.DEFINE('_SAMBA_BUILD_', version.MAJOR, add_to_cflags=True) - conf.DEFINE('HAVE_CONFIG_H', 1, add_to_cflags=True) + if not conf.env.toplevel_build: + version = samba_version.load_version(env=conf.env) + conf.DEFINE('CONFIG_H_IS_FROM_SAMBA', 1) + conf.DEFINE('_SAMBA_BUILD_', version.MAJOR, add_to_cflags=True) + conf.DEFINE('HAVE_CONFIG_H', 1, add_to_cflags=True) if Options.options.developer: conf.ADD_CFLAGS('-DDEVELOPER -DDEBUG_PASSWORD') - conf.env['developer'] = True + conf.env.developer = True if Options.options.with_swat: conf.env['build_swat'] = True - conf.ADD_EXTRA_INCLUDES('''#source3 #source3/include #lib/replace #lib/talloc - #lib/tevent #lib/addns #source3/librpc - #source3/lib #lib/tdb/include #lib/popt''') - - conf.RECURSE('../lib/replace') - conf.RECURSE('build') - conf.RECURSE('../lib/tdb') - conf.RECURSE('../lib/talloc') - conf.RECURSE('../lib/tevent') - conf.RECURSE('../lib/popt') - conf.RECURSE('../lib/nss_wrapper') - conf.RECURSE('../lib/socket_wrapper') - conf.RECURSE('../lib/zlib') - conf.RECURSE('../libcli/smbreadline') - conf.RECURSE('../lib/util') + if not conf.env.toplevel_build: + conf.RECURSE('../lib/replace') + conf.RECURSE('build') + conf.RECURSE('../lib/tdb') + conf.RECURSE('../lib/talloc') + conf.RECURSE('../lib/tevent') + conf.RECURSE('../lib/popt') + conf.RECURSE('../lib/nss_wrapper') + conf.RECURSE('../lib/socket_wrapper') + conf.RECURSE('../lib/zlib') + conf.RECURSE('../libcli/smbreadline') + conf.RECURSE('../lib/util') + + conf.ADD_EXTRA_INCLUDES('''#source3 #source3/include #lib/replace''') + if not conf.env.USING_SYSTEM_TDB: + conf.ADD_EXTRA_INCLUDES('#lib/tdb/include') + if not conf.env.USING_SYSTEM_TEVENT: + conf.ADD_EXTRA_INCLUDES('#lib/tevent') + if not conf.env.USING_SYSTEM_TALLOC: + conf.ADD_EXTRA_INCLUDES('#lib/talloc') + if not conf.env.USING_SYSTEM_POPT: + conf.ADD_EXTRA_INCLUDES('#lib/popt') conf.ADD_LDFLAGS("-Wl,--export-dynamic", testflags=True) @@ -170,7 +191,7 @@ main() { 'HAVE_KERNEL_OPLOCKS_IRIX', headers='fcntl.h', msg="Checking for IRIX kernel oplock types") - # Check for krenel share modes + # Check for kernel share modes conf.CHECK_CODE(''' #include #include @@ -191,6 +212,8 @@ main() { headers='sys/stat.h') conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_blksize', define='HAVE_STAT_ST_BLKSIZE', headers='sys/stat.h') + conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_flags', define='HAVE_STAT_ST_FLAGS', + headers='sys/types.h sys/stat.h unistd.h') # Check for POSIX capability support conf.CHECK_FUNCS_IN('cap_get_proc', 'cap', headers='sys/capability.h') @@ -257,7 +280,7 @@ _fork __fork fremoveea fremovexattr fseek64 fseeko64 fsetea fsetproplist fsetxattr _fstat __fstat fstat64 _fstat64 __fstat64 fsync ftell64 ftello64 ftruncate64 futimens futimes __fxstat getauthuid getcwd _getcwd __getcwd getdents __getdents getdents64 getdirentries -getgrent getgrnam getgrouplist getmntent getpagesize +getgrent getgrnam getgrouplist getgrset getmntent getpagesize getproplist get_proplist_entry getpwanam getpwent_r getrlimit gettext glob grantpt hstrerror initgroups innetgr inotify_init lgetea lgetxattr listea listxattr llistea llistxattr @@ -279,14 +302,13 @@ __sys_llseek syslog _telldir __telldir telldir64 textdomain timegm utimensat vsyslog _write __write __xstat ''') - conf.CHECK_TYPE('struct timespec', headers='sys/time.h time.h') - conf.CHECK_SAMBA3_CHARSET() # see build/charset.py # FIXME: these should be tests for features, but the old build system just # checks for OSes. import sys host_os = sys.platform + Logs.info("building on %s" % host_os) # Python doesn't have case switches... :/ # FIXME: original was *linux* | gnu* | k*bsd*-gnu | kopensolaris*-gnu | *qnx*) @@ -307,9 +329,16 @@ utimensat vsyslog _write __write __xstat if conf.CHECK_HEADERS('sunacl.h'): conf.define('HAVE_FREEBSD_SUNACL_H', '1') conf.CHECK_FUNCS_IN('acl', 'sunacl') + conf.DEFINE('STAT_ST_BLOCKSIZE', '512') + elif (host_os.rfind('netbsd') > -1): + conf.DEFINE('STAT_ST_BLOCKSIZE', '512') + elif (host_os.rfind('openbsd') > -1): + conf.DEFINE('STAT_ST_BLOCKSIZE', '512') + elif (host_os.rfind('sunos') > -1): + conf.DEFINE('STAT_ST_BLOCKSIZE', '512') # FIXME: Add more checks here. else: - print "Unknown host_os '%s', please report this to samba-technical@samba.org" % host_os + Logs.warn("Unknown host_os '%s', please report this to samba-technical@samba.org" % host_os) #FIXME: add more checks if Options.options.with_acl_support: @@ -440,6 +469,8 @@ return acl_get_perm_np(permset_d, perm); conf.CHECK_CODE('struct aiocb a; return aio_error64(&a);', 'HAVE_AIO_ERROR64', msg='Checking for aio_error64', headers='aio.h', lib='aio rt') conf.CHECK_CODE('struct aiocb a; return aio_cancel64(1, &a);', 'HAVE_AIO_CANCEL64', msg='Checking for aio_cancel64', headers='aio.h', lib='aio rt') conf.CHECK_CODE('struct aiocb a; return aio_suspend64(&a, 1, NULL);', 'HAVE_AIO_SUSPEND64', msg='Checking for aio_suspend64', headers='aio.h', lib='aio rt') + if not conf.CONFIG_SET('HAVE_AIO'): + conf.DEFINE('HAVE_NO_AIO', '1') else: conf.DEFINE('HAVE_NO_AIO', '1') @@ -465,98 +496,6 @@ msg.msg_acctrightslen = sizeof(fd); msg='Checking if we can use msg_acctrights for passing file descriptors', headers='sys/types.h stdlib.h stddef.h sys/socket.h sys/un.h') - default_static_modules=TO_LIST('''pdb_smbpasswd pdb_tdbsam pdb_wbc_sam pdb_ldap - auth_sam auth_unix auth_winbind auth_wbc auth_server - auth_domain auth_builtin vfs_default - nss_info_template idmap_ldap idmap_tdb idmap_passdb - idmap_nss''') - - default_shared_modules=TO_LIST('''vfs_recycle vfs_audit vfs_extd_audit vfs_full_audit vfs_netatalk - vfs_fake_perms vfs_default_quota vfs_readonly vfs_cap - vfs_expand_msdfs vfs_shadow_copy vfs_shadow_copy2 charset_CP850 - charset_CP437 auth_script vfs_readahead vfs_xattr_tdb - vfs_streams_xattr vfs_streams_depot vfs_acl_xattr vfs_acl_tdb - vfs_smb_traffic_analyzer vfs_preopen vfs_catia vfs_scannedonly - vfs_crossrename vfs_linux_xfs_sgid - vfs_time_audit idmap_autorid''') - - if Options.options.developer: - default_static_modules.extend(TO_LIST('pdb_ads auth_netlogond')) - default_shared_modules.extend(TO_LIST('charset_weird perfcount_test')) - - if Options.options.with_acl_support and conf.CONFIG_SET('HAVE_POSIX_ACLS'): - default_static_modules.extend(TO_LIST('vfs_posixacl')) - - if conf.CONFIG_SET('HAVE_FREEBSD_SUNACL_H'): - default_shared_modules.extend(TO_LIST('vfs_zfsacl')) - - if conf.CONFIG_SET('HAVE_DIRFD_DECL'): - default_shared_modules.extend(TO_LIST('vfs_syncops vfs_dirsort')) - - if conf.CONFIG_SET('HAVE_STATFS_F_FSID'): - default_shared_modules.extend(TO_LIST('vfs_fileid')) - - if conf.CONFIG_SET('HAVE_AIO') and (conf.CONFIG_SET('HAVE_MSGHDR_MSG_CONTROL') or conf.CONFIG_SET('HAVE_MSGHDR_MSG_ACCTRIGHTS')): - default_shared_modules.extend(TO_LIST('vfs_aio_fork')) - - explicit_shared_modules = TO_LIST(Options.options.shared_modules, delimiter=',') - explicit_static_modules = TO_LIST(Options.options.static_modules, delimiter=',') - - final_static_modules = default_static_modules - final_shared_modules = default_shared_modules - - for m in explicit_static_modules: - if m in final_shared_modules: - final_shared_modules.remove(m) - final_static_modules.append(m) - for m in explicit_shared_modules: - if m in final_static_modules: - final_static_modules.remove(m) - final_shared_modules.append(m) - - conf.env['static_modules'] = final_static_modules - conf.env['shared_modules'] = final_shared_modules - - conf.DEFINE('STRING_STATIC_MODULES', ' '.join(final_static_modules), quote=True) - - static_list = {} - shared_list = {} - - prefixes = ['vfs', 'pdb', 'auth', 'nss_info', 'charset', 'idmap', 'gpext', 'perfcount'] - conf.env['MODULE_PREFIXES'] = prefixes - for p in prefixes: - for m in final_static_modules: - if m.find(p) == 0: - if not p in static_list: - static_list[p] = [] - static_list[p].append(m) - for m in final_shared_modules: - if m.find(p) == 0: - if not p in shared_list: - shared_list[p] = [] - shared_list[p].append(m) - - for p in prefixes: - static_env = "%s_STATIC" % p.upper() - shared_env = "%s_SHARED" % p.upper() - conf.env[static_env] = [] - conf.env[shared_env] = [] - if p in static_list: - decl_list="" - for entry in static_list[p]: - decl_list += "extern NTSTATUS %s_init(void); " % entry - conf.env[static_env].append('%s' % entry) - decl_list = decl_list.rstrip() - conf.DEFINE('static_decl_%s' % p, decl_list) - conf.DEFINE('static_init_%s' % p, '{ %s_init(); }' % '_init(); '.join(static_list[p])) - else: - conf.DEFINE('static_decl_%s' % p, '') - conf.DEFINE('static_init_%s' % p, '{}') - if p in shared_list: - for entry in shared_list[p]: - conf.DEFINE('%s_init' % entry, 'init_samba_module') - conf.env[shared_env].append('%s' % entry) - if Options.options.with_winbind: conf.env.build_winbind = True conf.DEFINE('WITH_WINBIND', '1') @@ -585,29 +524,40 @@ msg.msg_acctrightslen = sizeof(fd); define='HAVE_DIRENT_D_OFF') conf.CHECK_FUNCS('setnetgrent getnetgrent endnetgrent') + if conf.CHECK_CFLAGS('-Werror-implicit-function-declaration'): + netgrent_cflags = '-Werror-implicit-function-declaration' + else: + netgrent_cflags = '' conf.CHECK_CODE('setnetgrent("foo")', 'HAVE_SETNETGRENT_PROTOTYPE', msg="Checking for setnetgrent prototype", headers='netdb.h netgroup.h', - cflags="-Werror-implicit-function-declaration") + cflags=netgrent_cflags) conf.CHECK_CODE('getnetgrent', 'HAVE_GETNETGRENT_PROTOTYPE', msg="Checking for getnetgrent prototype", headers='netdb.h netgroup.h', - cflags="-Werror-implicit-function-declaration") + cflags=netgrent_cflags) conf.CHECK_CODE('endnetgrent', 'HAVE_ENDNETGRENT_PROTOTYPE', msg="Checking for endnetgrent prototype", headers='netdb.h netgroup.h', - cflags="-Werror-implicit-function-declaration") + cflags=netgrent_cflags) # Look for CUPS if Options.options.with_cups: conf.find_program('cups-config', var='CUPS_CONFIG') if conf.env.CUPS_CONFIG: - conf.check_cfg(path=conf.env.CUPS_CONFIG, args="--cflags --ldflags --libs", + # we would normally use --libs here, but cups-config incorrectly adds + # gssapi_krb5 and other libraries to its --libs output. That breaks the use + # of an in-tree heimdal kerberos + conf.check_cfg(path=conf.env.CUPS_CONFIG, args="--cflags --ldflags", package="", uselib_store="cups") conf.CHECK_HEADERS('cups/cups.h cups/language.h', lib='cups') - conf.CHECK_LIB('cups') conf.CHECK_FUNCS_IN('httpConnect httpConnectEncrypt', 'cups') + if conf.CONFIG_SET('HAVE_CUPS_CUPS_H') and conf.CONFIG_SET('HAVE_CUPS_LANGUAGE_H'): + conf.DEFINE('HAVE_CUPS', '1') + else: + conf.undefine('HAVE_CUPS') + conf.SET_TARGET_TYPE('cups', 'EMPTY') else: # define an empty subsystem for cups, to allow it to be used as an empty dependency conf.SET_TARGET_TYPE('cups', 'EMPTY') @@ -616,7 +566,7 @@ msg.msg_acctrightslen = sizeof(fd); if conf.CONFIG_SET('HAVE_CUPS'): conf.DEFINE('HAVE_IPRINT', '1') else: - print "--enable-iprint=yes but cups support not sufficient" + Logs.warn("--enable-iprint=yes but cups support not sufficient") if Options.options.with_syslog: conf.DEFINE('WITH_SYSLOG', '1') if Options.options.with_automount: @@ -628,11 +578,6 @@ msg.msg_acctrightslen = sizeof(fd); conf.CHECK_TYPE('ber_tag_t', 'unsigned int', headers='ldap.h lber.h') conf.CHECK_FUNCS_IN('ber_scanf ber_sockbuf_add_io', 'lber') conf.CHECK_VARIABLE('LDAP_OPT_SOCKBUF', headers='ldap.h') - # if ber_sockbuf_add_io() and LDAP_OPT_SOCKBUF are available, we can add - # SASL wrapping hooks - if conf.CONFIG_SET('HAVE_BER_SOCKBUF_ADD_IO') and \ - conf.CONFIG_SET('HAVE_LDAP_OPT_SOCKBUF'): - conf.DEFINE('HAVE_LDAP_SASL_WRAPPING', '1') # if we LBER_OPT_LOG_PRINT_FN we can intercept ldap logging and print it out # for the samba logs @@ -655,14 +600,20 @@ msg.msg_acctrightslen = sizeof(fd); if conf.CONFIG_SET('HAVE_LDAP_INIT'): conf.DEFINE('HAVE_LDAP', '1') conf.DEFINE('LDAP_DEPRECATED', '1') - conf.env['SMBLDAP'] = 'lib/smbldap.c' - conf.env['SMBLDAPUTIL'] = 'lib/smbldap_util.c' + conf.env['HAVE_LDAP'] = '1' + # if ber_sockbuf_add_io() and LDAP_OPT_SOCKBUF are available, we can add + # SASL wrapping hooks + if conf.CONFIG_SET('HAVE_BER_SOCKBUF_ADD_IO') and \ + conf.CONFIG_SET('HAVE_LDAP_OPT_SOCKBUF'): + conf.DEFINE('HAVE_LDAP_SASL_WRAPPING', '1') else: conf.SET_TARGET_TYPE('ldap', 'EMPTY') conf.SET_TARGET_TYPE('lber', 'EMPTY') # Check for kerberos - if Options.options.with_krb5: + have_gssapi=False + if Options.options.with_krb5 and not conf.env.toplevel_build: + Logs.info("Looking for kerberos features") conf.find_program('krb5-config', var='KRB5_CONFIG') if conf.env.KRB5_CONFIG: conf.check_cfg(path="krb5-config", args="--cflags --libs", @@ -678,9 +629,10 @@ msg.msg_acctrightslen = sizeof(fd); conf.CHECK_FUNCS_IN('crypto', 'des_set_key') conf.CHECK_FUNCS_IN('copy_Authenticator', 'asn1') conf.CHECK_FUNCS_IN('roken_getaddrinfo_hostspec', 'roken') - if conf.CHECK_FUNCS_IN('gss_display_status', 'gssapi gssapi_krb5'): - conf.DEFINE('HAVE_GSSAPI', '1') - conf.CHECK_FUNCS_IN('gss_wrap_iov', 'gssapi gssapi_krb5 krb5') + if conf.CHECK_FUNCS_IN('gss_display_status', 'gssapi') or \ + conf.CHECK_FUNCS_IN('gss_display_status', 'gssapi_krb5'): + have_gssapi=True + conf.CHECK_FUNCS_IN('gss_wrap_iov gss_krb5_import_cred', 'gssapi gssapi_krb5 krb5') conf.CHECK_FUNCS_IN('krb5_mk_req_extended krb5_kt_compare', 'krb5') conf.CHECK_FUNCS(''' krb5_set_real_time krb5_set_default_in_tkt_etypes krb5_set_default_tgs_enctypes @@ -793,6 +745,17 @@ return 0; headers='krb5.h', lib='krb5', addmain=False, msg="Checking whether the macro krb5_princ_realm is defined") + conf.CHECK_CODE(''' +int main(void) { + krb5_context context; + krb5_principal principal; + const char *realm; realm = krb5_principal_get_realm(context, principal); + return 0; +}''', + 'HAVE_KRB5_PRINCIPAL_GET_REALM', + headers='krb5.h', lib='krb5', + addmain=False, + msg="Checking whether krb5_principal_get_realm is defined") if conf.CHECK_CODE('''krb5_verify_checksum(0, 0, 0, 0, 0, 0, 0);''', 'KRB5_VERIFY_CHECKSUM_ARGS', headers='krb5.h', lib='krb5', @@ -836,7 +799,13 @@ return krb5_kt_resolve(context, "WRFILE:api", &keytab); headers='krb5.h', lib='krb5', execute=True, msg="Checking whether the WRFILE:-keytab is supported"); - else: + # Check for KRB5_DEPRECATED handling + conf.CHECK_CODE('''#define KRB5_DEPRECATED 1 +#include ''', + 'HAVE_KRB5_DEPRECATED_WITH_IDENTIFIER', addmain=False, + link=False, + msg="Checking for KRB5_DEPRECATED define taking an identifier") + elif not conf.env.toplevel_build: conf.SET_TARGET_TYPE('krb5', 'EMPTY') conf.SET_TARGET_TYPE('gssapi', 'EMPTY') conf.SET_TARGET_TYPE('gssapi_krb5', 'EMPTY') @@ -847,42 +816,45 @@ return krb5_kt_resolve(context, "WRFILE:api", &keytab); use_ads=True if not conf.CONFIG_SET('HAVE_ENCTYPE_ARCFOUR_HMAC_MD5') and \ not conf.CONFIG_SET('HAVE_ENCTYPE_ARCFOUR_HMAC'): - print "arcfour-hmac-md5 encryption type not found in -lkrb5" + Logs.warn("arcfour-hmac-md5 encryption type not found in -lkrb5") use_ads=False if not conf.CONFIG_SET('HAVE_KRB5_MK_REQ_EXTENDED'): - print "krb5_mk_req_extended not found in -lkrb5" + Logs.warn("krb5_mk_req_extended not found in -lkrb5") use_ads=False if not conf.CONFIG_SET('HAVE_KRB5_PRINCIPAL2SALT') and \ not conf.CONFIG_SET('HAVE_KRB5_GET_PW_SALT'): - print "no CREATE_KEY_FUNCTIONS detected" + Logs.warn("no CREATE_KEY_FUNCTIONS detected") use_ads=False if not conf.CONFIG_SET('HAVE_KRB5_GET_PERMITTED_ENCTYPES') and \ not conf.CONFIG_SET('HAVE_KRB5_GET_DEFAULT_IN_TKT_ETYPES'): - print "no GET_ENCTYPES_FUNCTIONS detected" + Logs.warn("no GET_ENCTYPES_FUNCTIONS detected") use_ads=False if not conf.CONFIG_SET('HAVE_KRB5_KT_FREE_ENTRY') and \ not conf.CONFIG_SET('HAVE_KRB5_FREE_KEYTAB_ENTRY_CONTENTS'): - print "no KT_FREE_FUNCTION detected" + Logs.warn("no KT_FREE_FUNCTION detected") use_ads=False if not conf.CONFIG_SET('HAVE_KRB5_C_VERIFY_CHECKSUM') and \ not conf.CONFIG_SET('HAVE_KRB5_VERIFY_CHECKSUM'): - print "no KRB5_VERIFY_CHECKSUM_FUNCTION detected" + Logs.warn("no KRB5_VERIFY_CHECKSUM_FUNCTION detected") use_ads=False if not conf.CONFIG_SET('KRB5_TICKET_HAS_KEYINFO'): # We only need the following functions if we can't get the enctype # and kvno out of the ticket directly (ie. on Heimdal). - if not conf.CONFIG_SET('free_AP_REQ'): - print "no KRB5_AP_REQ_FREE_FUNCTION detected" + if not conf.CONFIG_SET('HAVE_FREE_AP_REQ'): + Logs.warn("no KRB5_AP_REQ_FREE_FUNCTION detected") use_ads=False if not conf.CONFIG_SET('HAVE_KRB5_DECODE_AP_REQ'): - print "no KRB5_AP_REQ_DECODING_FUNCTION detected" + Logs.warn("no KRB5_AP_REQ_DECODING_FUNCTION detected") use_ads=False if use_ads: conf.DEFINE('WITH_ADS', '1') conf.DEFINE('HAVE_KRB5', '1') - conf.DEFINE('HAVE_GSSAPI', '1') + if have_gssapi: + conf.DEFINE('HAVE_GSSAPI', '1') + if conf.CONFIG_SET('HAVE_LDAP'): + conf.env['HAVE_ADS'] = '1' else: - print "krb5 libs don't have all features required for Active Directory support" + Logs.warn("krb5 libs don't have all features required for Active Directory support") conf.undefine('HAVE_KRB5_H') conf.undefine('HAVE_GSSAPI_H') conf.undefine('HAVE_GSSAPI_GSSAPI_GENERIC_H') @@ -938,13 +910,16 @@ return krb5_kt_resolve(context, "WRFILE:api", &keytab); conf.DEFINE('HAVE_ICONV', 1) if Options.options.with_pam: + use_pam=True conf.CHECK_HEADERS('security/pam_appl.h pam/pam_appl.h') if not conf.CONFIG_SET('HAVE_SECURITY_PAM_APPL_H') and not conf.CONFIG_SET('HAVE_PAM_PAM_APPL_H'): - print "--with-pam=yes but pam_appl.h not found" - conf.CHECK_FUNCS_IN('pam_get_data', 'pam', mandatory=True) - conf.CHECK_HEADERS('security/pam_modules.h pam/pam_modules.h') - if not conf.CONFIG_SET('HAVE_SECURITY_PAM_MODULES_H') and not conf.CONFIG_SET('HAVE_PAM_PAM_MODULES_H'): - print "--with-pam=yes but pam_modules.h not found" + Logs.warn("--with-pam=yes but pam_appl.h not found") + use_pam=False + conf.CHECK_FUNCS_IN('pam_get_data', 'pam') + conf.CHECK_HEADERS('security/pam_modules.h pam/pam_modules.h') + if not conf.CONFIG_SET('HAVE_SECURITY_PAM_MODULES_H') and not conf.CONFIG_SET('HAVE_PAM_PAM_MODULES_H'): + Logs.warn("--with-pam=yes but pam_modules.h not found") + use_pam=False conf.CHECK_HEADERS('security/pam_ext.h security/_pam_macros.h') conf.CHECK_HEADERS('pam/pam_ext.h pam/_pam_macros.h') conf.CHECK_FUNCS_IN('pam_vsyslog', 'pam') @@ -1003,8 +978,9 @@ int i; i = PAM_RADIO_TYPE; 'HAVE_PAM_RADIO_TYPE', lib='pam', msg="Checking whether PAM_RADIO_TYPE is available"); - conf.DEFINE('WITH_PAM', 1) - conf.DEFINE('WITH_PAM_MODULES', 1) + if use_pam: + conf.DEFINE('WITH_PAM', 1) + conf.DEFINE('WITH_PAM_MODULES', 1) seteuid = False if not seteuid: @@ -1052,9 +1028,9 @@ int i; i = PAM_RADIO_TYPE; conf.CHECK_HEADERS('uuid/uuid.h') conf.CHECK_FUNCS_IN('uuid_generate', 'uuid') if not conf.CONFIG_SET('HAVE_UUID_UUID_H') and not conf.CONFIG_SET('HAVE_UUID_GENERATE'): - print "--with-dnsupdate=yes but uuid support not sufficient" + Logs.warn("--with-dnsupdate=yes but uuid support not sufficient") elif not conf.CONFIG_SET('HAVE_GSSAPI'): - print "--with-dnsupdate=yes but gssapi support not sufficient" + Logs.warn("--with-dnsupdate=yes but gssapi support not sufficient") else: conf.DEFINE('WITH_DNS_UPDATES', 1) else: @@ -1077,6 +1053,688 @@ int i; i = PAM_RADIO_TYPE; ''', 'HAVE_LINUX_RTNETLINK_H', msg='Checking whether Linux rtnetlink is available') + if conf.CHECK_TYPE('struct dirent64', headers='sys/types.h dirent.h') and conf.CONFIG_SET('HAVE_READDIR64'): + conf.DEFINE('HAVE_STRUCT_DIRENT64', '1') + else: + conf.undefine('HAVE_STRUCT_DIRENT64') + + conf.CHECK_CODE(''' +#include "../tests/fcntl_lock.c" +''', + 'HAVE_FCNTL_LOCK', + addmain=False, + execute=True, + msg='Checking whether fcntl locking is available') + + conf.CHECK_CODE(''' +#include "../tests/fcntl_lock64.c" +''', + 'HAVE_BROKEN_FCNTL64_LOCKS', + addmain=False, + execute=True, + msg='Checking whether fcntl64 locks are broken') + + if not conf.CONFIG_SET('HAVE_BROKEN_FCNTL64_LOCKS'): + conf.CHECK_CODE(''' +#if defined(HAVE_UNISTD_H) +#include +#endif +#include +#include + +#ifdef HAVE_FCNTL_H +#include +#endif + +#ifdef HAVE_SYS_FCNTL_H +#include +#endif +main() { struct flock64 fl64; +#if defined(F_SETLKW64) && defined(F_SETLK64) && defined(F_GETLK64) +exit(0); +#else +exit(1); +#endif +} +''', + 'HAVE_STRUCT_FLOCK64', + addmain=False, + execute=True, + msg="Checking whether the flock64 struct is available") + + conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_mtim.tv_nsec', + define='HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC') # Linux, Solaris + conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_mtimensec', + define='HAVE_STRUCT_STAT_ST_MTIMENSEC') # BSD, if defined _POSIX_SOURCE + conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_mtimespec.tv_nsec', + define='HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC') # BSD, if not defined _POSIX_SOURCE + conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_mtime_n', + define='HAVE_STRUCT_STAT_ST_MTIME_N') # AIX + conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_umtime', + define='HAVE_STRUCT_STAT_ST_UMTIME') # Tru64 + if conf.CONFIG_SET('HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC') or \ + conf.CONFIG_SET('HAVE_STRUCT_STAT_ST_MTIMENSEC') or \ + conf.CONFIG_SET('HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC') or \ + conf.CONFIG_SET('HAVE_STRUCT_STAT_ST_MTIME_N') or \ + conf.CONFIG_SET('HAVE_STRUCT_STAT_ST_UMTIME'): + conf.DEFINE('HAVE_STAT_HIRES_TIMESTAMPS', '1') + + # recent FreeBSD, NetBSD have creation timestamps called birthtime: + conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_birthtime', + define='HAVE_STRUCT_STAT_ST_BIRTHTIME') + conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_birthtimespec.tv_nsec', + define='HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC') + conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_birthtimensec', + define='HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC') + + conf.CHECK_CODE(''' +#if defined(HAVE_UNISTD_H) +#include +#endif +#include ], +ssize_t err = posix_fadvise(0,0,0x80000,POSIX_FADV_WILLNEED); +''', + 'HAVE_POSIX_FADVISE', + msg='Checking whether posix_fadvise is available') + + for v in ['_SC_NGROUPS_MAX', '_SC_NPROC_ONLN', '_SC_NPROCESSORS_ONLN', '_SC_PAGESIZE' ]: + conf.CHECK_CODE(''' + #include + return sysconf(%s) == -1 ? 1 : 0; + ''' % v, + 'SYSCONF%s' % v, + msg='Checking whether sysconf(%s) is available' % v) + + conf.CHECK_DECLS('__NR_inotify_init', reverse=True, headers='asm/unistd.h') + + conf.CHECK_CODE(''' +#include +#include +syscall(SYS_initgroups, 16, NULL, NULL, 0); + ''', + 'HAVE_DARWIN_INITGROUPS', + msg='Checking whether to use the Darwin-specific initgroups system call') + + conf.CHECK_CODE('''struct utimbuf tbuf; tbuf.actime = 0; tbuf.modtime = 1; exit(utime("foo.c",&tbuf));''', + 'HAVE_UTIMBUF', + headers='sys/types.h utime.h', + msg='Checking whether struct utimbuf is available') + + if conf.CHECK_CODE('''struct sigevent s;''', + 'HAVE_STRUCT_SIGEVENT', + headers='sys/types.h stdlib.h stddef.h signal.h', + msg='Checking whether we have the struct sigevent'): + conf.CHECK_STRUCTURE_MEMBER('struct sigevent', 'sigev_value.sival_ptr', + define='HAVE_STRUCT_SIGEVENT_SIGEV_VALUE_SIVAL_PTR', + headers='signal.h'); + conf.CHECK_STRUCTURE_MEMBER('struct sigevent', 'sigev_value.sigval_ptr', + define='HAVE_STRUCT_SIGEVENT_SIGEV_VALUE_SIGVAL_PTR', + headers='signal.h'); + + if os.path.exists('/proc/sys/kernel/core_pattern'): + conf.DEFINE('HAVE_SYS_KERNEL_PROC_CORE_PATTERN', '1') + + if conf.CHECK_CODE(''' +#include +main() { + struct tm *tm; + if (sizeof(time_t) == 8) { + time_t max_time = 0x7fffffffffffffffll; + tm = gmtime(&max_time); + /* This should fail with 32-bit tm_year. */ + if (tm == NULL) { + /* Max time_t that works with 32-bit int tm_year in struct tm. */ + max_time = 67768036191676799ll; + tm = gmtime(&max_time); + if (tm) { + exit(0); + } + } + } + exit(1); +}''', + '__TIME_T_MAX', + addmain=False, + execute=True, + msg="Checking for the maximum value of the 'time_t' type"): + conf.DEFINE('TIME_T_MAX', '67768036191676799ll') + + conf.CHECK_CODE(''' +#if defined(HAVE_UNISTD_H) +#include +#endif +#include +main() { dev_t dev = makedev(1,2); return 0; } +''', + 'HAVE_MAKEDEV', + addmain=False, + msg='Checking whether the macro for makedev is available') + + conf.CHECK_CODE(''' +#include +#include +#include + +void exit_on_core(int ignored) { + exit(1); +} + +main() { + char *newpath; + signal(SIGSEGV, exit_on_core); + newpath = realpath("/tmp", NULL); + exit((newpath != NULL) ? 0 : 1); +} +''', + 'REALPATH_TAKES_NULL', + addmain=False, + execute=True, + msg='Checking whether the realpath function allows a NULL argument') + + conf.CHECK_CODE('''#include "../tests/ftruncate.c"''', + 'HAVE_FTRUNCATE_EXTEND', + msg='Checking for ftruncate extend', + addmain=False, + execute=True) + if os.getenv('RUN_FROM_BUILD_FARM'): + Logs.info("enabling buildfarm hacks") + conf.DEFINE('ENABLE_BUILD_FARM_HACKS', '1') + + if Options.options.with_sendfile_support: + 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): + conf.CHECK_CODE(''' + int tofd, fromfd; + off64_t offset; + size_t total; + ssize_t nwritten = sendfile64(tofd, fromfd, &offset, total); + ''', + '_HAVE_SENDFILE64', + headers='sys/sendfile', + msg='Checking for linux sendfile64 support') + conf.CHECK_CODE(''' + int tofd, fromfd; + off_t offset; + size_t total; + ssize_t nwritten = sendfile(tofd, fromfd, &offset, total); + ''', + '_HAVE_SENDFILE', + headers='sys/sendfile', + msg='Checking for linux sendfile support') + + # Try and cope with broken Linux sendfile.... + conf.CHECK_CODE('''#if defined(_FILE_OFFSET_BITS) && (_FILE_OFFSET_BITS == 64) + #undef _FILE_OFFSET_BITS + #endif + #include + int tofd, fromfd; + off_t offset; + size_t total; + ssize_t nwritten = sendfile(tofd, fromfd, &offset, total); + ''', + '_HAVE_BROKEN_LINUX_SENDFILE', + msg='Checking for broken linux sendfile support') + if conf.CONFIG_SET('_HAVE_SENDFILE64'): + conf.DEFINE('HAVE_SENDFILE64', '1') + conf.DEFINE('LINUX_SENDFILE_API', '1') + conf.DEFINE('WITH_SENDFILE', '1') + elif conf.CONFIG_SET('_HAVE_SENDFILE'): + conf.DEFINE('HAVE_SENDFILE', '1') + conf.DEFINE('LINUX_SENDFILE_API', '1') + conf.DEFINE('WITH_SENDFILE', '1') + elif conf.CONFIG_SET('_HAVE_BROKEN_LINUX_SENDFILE'): + conf.DEFINE('LINUX_BROKEN_SENDFILE_API', '1') + conf.DEFINE('WITH_SENDFILE', '1') + elif (host_os.rfind('freebsd') > -1) or (host_os.rfind('dragonfly') > -1): + conf.CHECK_CODE(''' + #include + #include + #include + #include + int fromfd, tofd, ret, total=0; + off_t offset, nwritten; + struct sf_hdtr hdr; + struct iovec hdtrl; + hdr.headers = &hdtrl; + hdr.hdr_cnt = 1; + hdr.trailers = NULL; + hdr.trl_cnt = 0; + hdtrl.iov_base = NULL; + hdtrl.iov_len = 0; + ret = sendfile(fromfd, tofd, offset, total, &hdr, &nwritten, 0) + ''', + '_HAVE_SENDFILE', + msg='Checking for freebsd sendfile support') + if conf.CONFIG_SET('_HAVE_SENDFILE'): + conf.DEFINE('HAVE_SENDFILE', '1') + conf.DEFINE('FREEBSD_SENDFILE_API', '1') + conf.DEFINE('WITH_SENDFILE', '1') + elif (host_os.rfind('hpux') > -1): + conf.CHECK_CODE(''' + #include + #include + int fromfd, tofd; + size_t total=0; + struct iovec hdtrl[2]; + ssize_t nwritten; + off64_t offset; + hdtrl[0].iov_base = 0; + hdtrl[0].iov_len = 0; + nwritten = sendfile64(tofd, fromfd, offset, total, &hdtrl[0], 0); + ''', + '_HAVE_SENDFILE64', + msg='Checking for hpux sendfile64 support') + conf.CHECK_CODE(''' + #include + #include + int fromfd, tofd; + size_t total=0; + struct iovec hdtrl[2]; + ssize_t nwritten; + off_t offset; + hdtrl[0].iov_base = 0; + hdtrl[0].iov_len = 0; + nwritten = sendfile(tofd, fromfd, offset, total, &hdtrl[0], 0); + ''', + '_HAVE_SENDFILE', + msg='Checking for hpux sendfile support') + if conf.CONFIG_SET('_HAVE_SENDFILE64'): + conf.DEFINE('HAVE_SENDFILE64', '1') + conf.DEFINE('HPUX_SENDFILE_API', '1') + conf.DEFINE('WITH_SENDFILE', '1') + elif conf.CONFIG_SET('_HAVE_SENDFILE'): + conf.DEFINE('HAVE_SENDFILE', '1') + conf.DEFINE('HPUX_SENDFILE_API', '1') + conf.DEFINE('WITH_SENDFILE', '1') + elif (host_os.rfind('solaris') > -1): + conf.CHECK_FUNCS_IN('sendfile', 'sendfilev') + conf.CHECK_CODE(''' + #include + int sfvcnt; + size_t xferred; + struct sendfilevec vec[2]; + ssize_t nwritten; + int tofd; + sfvcnt = 2; + vec[0].sfv_fd = SFV_FD_SELF; + vec[0].sfv_flag = 0; + vec[0].sfv_off = 0; + vec[0].sfv_len = 0; + vec[1].sfv_fd = 0; + vec[1].sfv_flag = 0; + vec[1].sfv_off = 0; + vec[1].sfv_len = 0; + nwritten = sendfilev64(tofd, vec, sfvcnt, &xferred); + ''', + '_HAVE_SENDFILEV64', + msg='Checking for solaris sendfilev64 support') + conf.CHECK_CODE(''' + #include , + int sfvcnt; + size_t xferred; + struct sendfilevec vec[2]; + ssize_t nwritten; + int tofd; + sfvcnt = 2; + vec[0].sfv_fd = SFV_FD_SELF; + vec[0].sfv_flag = 0; + vec[0].sfv_off = 0; + vec[0].sfv_len = 0; + vec[1].sfv_fd = 0; + vec[1].sfv_flag = 0; + vec[1].sfv_off = 0; + vec[1].sfv_len = 0; + nwritten = sendfilev(tofd, vec, sfvcnt, &xferred); + ''', + '_HAVE_SENDFILEV', + msg='Checking for solaris sendfilev support') + if conf.CONFIG_SET('_HAVE_SENDFILEV64'): + conf.DEFINE('HAVE_SENDFILEV64', '1') + conf.DEFINE('SOLARIS_SENDFILE_API', '1') + conf.DEFINE('WITH_SENDFILE', '1') + elif conf.CONFIG_SET('_HAVE_SENDFILEV'): + conf.DEFINE('HAVE_SENDFILEV', '1') + conf.DEFINE('SOLARIS_SENDFILE_API', '1') + conf.DEFINE('WITH_SENDFILE', '1') + elif (host_os.rfind('aix') > -1): + conf.CHECK_CODE(''' + #include + int fromfd, tofd; + size_t total=0; + struct sf_parms hdtrl; + ssize_t nwritten; + off64_t offset; + hdtrl.header_data = 0; + hdtrl.header_length = 0; + hdtrl.file_descriptor = fromfd; + hdtrl.file_offset = 0; + hdtrl.file_bytes = 0; + hdtrl.trailer_data = 0; + hdtrl.trailer_length = 0; + nwritten = send_file(&tofd, &hdtrl, 0); + ''', + '_HAVE_SENDFILE', + msg='Checking for AIX send_file support') + if conf.CONFIG_SET('_HAVE_SENDFILE'): + conf.DEFINE('HAVE_SENDFILE', '1') + conf.DEFINE('AIX_SENDFILE_API', '1') + conf.DEFINE('WITH_SENDFILE', '1') + + conf.CHECK_CODE('''enum TDB_ERROR err = TDB_ERR_NESTING''', + 'HAVE_TDB_ERR_NESTING', + headers='tdb.h', + msg='Checking whether we have TDB_ERR_NESTING') + + # UnixWare 7.x has its getspnam in -lgen + conf.CHECK_FUNCS_IN('getspnam', 'gen') + conf.CHECK_FUNCS_IN('getspnam', 'security') + conf.CHECK_FUNCS_IN('getspnam', 'sec') + + if Options.options.with_quotas: + # For quotas on Veritas VxFS filesystems + conf.CHECK_HEADERS('sys/fs/vx_quota.h') + # For quotas on Linux XFS filesystems + conf.CHECK_HEADERS('linux/dqblk_xfs.h') + # For sys/quota.h and linux/quota.h + conf.CHECK_HEADERS('sys/quota.h') + + + # + # checking for clustering extensions (CTDB) + # + if not Options.options.with_cluster_support: + have_cluster_support = False + + else: + + if Options.options.ctdb_dir: + conf.ADD_EXTRA_INCLUDES(Options.options.ctdb_dir + '/include') + + srcdir = os.path.realpath(conf.srcdir) + if 'EXTRA_INCLUDES' in conf.env: + includes = ' '.join(conf.env['EXTRA_INCLUDES']).replace('#', srcdir + '/') + else: + includes = '' + + have_cluster_support = True + ctdb_broken = "" + + conf.CHECK_CODE(''' + #define NO_CONFIG_H + #include "replace.h" + #include "system/wait.h" + #include "system/network.h" + #define private #error __USED_RESERVED_WORD_private__ + #include + #include + #include + + int main(void) + { + return 0; + } + ''', + 'HAVE_CTDB_H', + addmain=False, + includes=includes, + msg='Checking for header ctdb.h') + + if not conf.CONFIG_SET('HAVE_CTDB_H'): + have_cluster_support = False + ctdb_broken = "ctdb.h is required for cluster support" + + if have_cluster_support: + conf.CHECK_CODE(''' + #define NO_CONFIG_H + #include "replace.h" + #include "system/wait.h" + #include "system/network.h" + #define private #error __USED_RESERVED_WORD_private__ + #include + #include + #include + #include + + int main(void) + { + return 0; + } + ''', + 'HAVE_CTDB_PRIVATE_H', + addmain=False, + includes=includes, + msg='Checking for header ctdb_private.h') + + if not conf.CONFIG_SET('HAVE_CTDB_PRIVATE_H'): + have_cluster_support = False + ctdb_broken = "ctdb_private.h is required for cluster support" + + if have_cluster_support: + conf.CHECK_CODE(''' + #define NO_CONFIG_H + #include "replace.h" + #include "system/wait.h" + #include "system/network.h" + #include + #include + #include + #include + + int main(void) + { + int i = (int)CTDB_CONTROL_TRANS3_COMMIT; + return 0; + } + ''', + 'HAVE_CTDB_CONTROL_TRANS3_COMMIT_DECL', + addmain=False, + includes=includes, + msg='Checking for transaction support (TRANS3_COMMIT control)') + + if not conf.CONFIG_SET('HAVE_CTDB_CONTROL_TRANS3_COMMIT_DECL'): + have_cluster_support = False + ctdb_broken = "ctdb transaction support missing or too old" + + if have_cluster_support: + conf.CHECK_CODE(''' + #define NO_CONFIG_H + #include "replace.h" + #include "system/wait.h" + #include "system/network.h" + #include + #include + #include + #include + + int main(void) + { + int i = (int)CTDB_CONTROL_SCHEDULE_FOR_DELETION; + return 0; + } + ''', + 'HAVE_CTDB_CONTROL_SCHEDULE_FOR_DELETION_DECL', + addmain=False, + includes=includes, + msg='Checking for SCHEDULE_FOR_DELETION control') + + if not conf.CONFIG_SET('HAVE_CTDB_CONTROL_SCHEDULE_FOR_DELETION_DECL'): + if not Options.options.enable_old_ctdb: + have_cluster_support = False + ctdb_broken = "SCHEDULE_FOR_DELETION control missing" + else: + Logs.warn("ignoring missing SCHEDULE_FOR_DELETION control (--enable-old-ctdb)") + + if have_cluster_support: + conf.CHECK_CODE(''' + #define NO_CONFIG_H + #include "replace.h" + #include "system/wait.h" + #include "system/network.h" + #include + #include + #include + #include + + int main(void) + { + struct ctdb_control_tcp _x; + return 0; + } + ''', + 'HAVE_STRUCT_CTDB_CONTROL_TCP', + addmain=False, + includes=includes, + msg='Checking for ctdb ipv4 support') + + if not conf.CONFIG_SET('HAVE_STRUCT_CTDB_CONTROL_TCP'): + have_cluster_support = False + ctdb_broken = "missing struct ctdb_control_tcp" + + if have_cluster_support: + conf.CHECK_CODE(''' + #define NO_CONFIG_H + #include "replace.h" + #include "system/wait.h" + #include "system/network.h" + #include + #include + #include + #include + + int main(void) + { + struct ctdb_control_tcp_addr _x; + return 0; + } + ''', + 'HAVE_STRUCT_CTDB_CONTROL_TCP_ADDR', + addmain=False, + includes=includes, + msg='Checking for ctdb ipv6 support') + + if have_cluster_support: + Logs.info("building with cluster support") + conf.DEFINE('CLUSTER_SUPPORT', 1); + else: + if not Options.options.with_cluster_support: + Logs.info("building without cluster support") + else: + Logs.warn("building without cluster support: " + ctdb_broken) + conf.undefine('CLUSTER_SUPPORT') + + + + conf.CHECK_CODE('__attribute__((destructor)) static void cleanup(void) { }', + 'HAVE_FUNCTION_ATTRIBUTE_DESTRUCTOR', + addmain=False, + link=False, + msg='Checking whether we can compile with __attribute__((destructor))') + + conf.CHECK_CODE('void seekdir(DIR *d, long loc) { return; }', + 'SEEKDIR_RETURNS_VOID', + headers='sys/types.h dirent.h', + msg='Checking whether seekdir returns void') + + if Options.options.with_profiling_data: + conf.DEFINE('WITH_PROFILE', 1); + + + default_static_modules=TO_LIST('''pdb_smbpasswd pdb_tdbsam pdb_wbc_sam + auth_sam auth_unix auth_winbind auth_wbc auth_server + auth_domain auth_builtin vfs_default + nss_info_template idmap_tdb idmap_passdb + idmap_nss''') + + default_shared_modules=TO_LIST('''vfs_recycle vfs_audit vfs_extd_audit vfs_full_audit vfs_netatalk + vfs_fake_perms vfs_default_quota vfs_readonly vfs_cap + vfs_expand_msdfs vfs_shadow_copy vfs_shadow_copy2 charset_CP850 + charset_CP437 auth_script vfs_readahead vfs_xattr_tdb + vfs_streams_xattr vfs_streams_depot vfs_acl_xattr vfs_acl_tdb + vfs_smb_traffic_analyzer vfs_preopen vfs_catia vfs_scannedonly + vfs_crossrename vfs_linux_xfs_sgid + vfs_time_audit idmap_autorid''') + + if Options.options.developer: + default_static_modules.extend(TO_LIST('pdb_ads auth_netlogond')) + default_shared_modules.extend(TO_LIST('charset_weird perfcount_test')) + + if Options.options.with_acl_support and conf.CONFIG_SET('HAVE_POSIX_ACLS'): + default_static_modules.extend(TO_LIST('vfs_posixacl')) + + if conf.CONFIG_SET('HAVE_FREEBSD_SUNACL_H'): + default_shared_modules.extend(TO_LIST('vfs_zfsacl')) + + if conf.CONFIG_SET('HAVE_DIRFD_DECL'): + default_shared_modules.extend(TO_LIST('vfs_syncops vfs_dirsort')) + + if conf.CONFIG_SET('HAVE_STATFS_F_FSID'): + default_shared_modules.extend(TO_LIST('vfs_fileid')) + + if conf.CONFIG_SET('HAVE_AIO') and (conf.CONFIG_SET('HAVE_MSGHDR_MSG_CONTROL') or conf.CONFIG_SET('HAVE_MSGHDR_MSG_ACCTRIGHTS')): + default_shared_modules.extend(TO_LIST('vfs_aio_fork')) + + if conf.CONFIG_SET('HAVE_LDAP'): + default_static_modules.extend(TO_LIST('pdb_ldap idmap_ldap')) + + if conf.CONFIG_SET('DARWINOS'): + default_shared_modules.extend(TO_LIST('charset_macosxfs')) + + explicit_shared_modules = TO_LIST(Options.options.shared_modules, delimiter=',') + explicit_static_modules = TO_LIST(Options.options.static_modules, delimiter=',') + + final_static_modules = default_static_modules + final_shared_modules = default_shared_modules + + for m in explicit_static_modules: + if m in final_shared_modules: + final_shared_modules.remove(m) + final_static_modules.append(m) + for m in explicit_shared_modules: + if m in final_static_modules: + final_static_modules.remove(m) + final_shared_modules.append(m) + + conf.env['static_modules'] = final_static_modules + conf.env['shared_modules'] = final_shared_modules + + conf.DEFINE('STRING_STATIC_MODULES', ' '.join(final_static_modules), quote=True) + + static_list = {} + shared_list = {} + + prefixes = ['vfs', 'pdb', 'auth', 'nss_info', 'charset', 'idmap', 'gpext', 'perfcount'] + conf.env['MODULE_PREFIXES'] = prefixes + for p in prefixes: + for m in final_static_modules: + if m.find(p) == 0: + if not p in static_list: + static_list[p] = [] + static_list[p].append(m) + for m in final_shared_modules: + if m.find(p) == 0: + if not p in shared_list: + shared_list[p] = [] + shared_list[p].append(m) + + for p in prefixes: + static_env = "%s_STATIC" % p.upper() + shared_env = "%s_SHARED" % p.upper() + conf.env[static_env] = [] + conf.env[shared_env] = [] + if p in static_list: + decl_list="" + for entry in static_list[p]: + decl_list += "extern NTSTATUS %s_init(void); " % entry + conf.env[static_env].append('%s' % entry) + decl_list = decl_list.rstrip() + conf.DEFINE('static_decl_%s' % p, decl_list) + conf.DEFINE('static_init_%s' % p, '{ %s_init(); }' % '_init(); '.join(static_list[p])) + else: + conf.DEFINE('static_decl_%s' % p, '') + conf.DEFINE('static_init_%s' % p, '{}') + if p in shared_list: + for entry in shared_list[p]: + conf.DEFINE('%s_init' % entry, 'init_samba_module') + conf.env[shared_env].append('%s' % entry) conf.SAMBA_CONFIG_H('include/config.h') @@ -1087,3 +1745,13 @@ def ctags(ctx): cmd = 'ctags $(find %s/.. -name "*.[ch]" | grep -v "*_proto\.h")' % source_root print("Running: %s" % cmd) os.system(cmd) + +if not os.getenv('TOPLEVEL_BUILD'): + def wildcard_cmd(cmd): + '''called on a unknown command''' + from samba_wildcard import run_named_build_task + run_named_build_task(cmd) + def main(): + from samba_wildcard import wildcard_main + wildcard_main(wildcard_cmd) + Scripting.main = main