s3:winbind: remove the method SET_MAPPING from winbind's API
[ira/wip.git] / source3 / wscript
index 08044ecef78d43960638f8d73a0ee72e86a7b01b..b61d11066766053f0ed4cd7341bf20ae603bffbf 100644 (file)
@@ -11,6 +11,10 @@ import build.charset
 import samba_utils
 import samba3
 
+version = wafsamba.samba_version_file("./VERSION")
+
+VERSION=version.STRING
+
 def set_options(opt):
     opt.BUILTIN_DEFAULT('NONE')
     opt.BUNDLED_EXTENSION_DEFAULT('s3')
@@ -44,23 +48,26 @@ def set_options(opt):
     opt.SAMBA3_ADD_OPTION('sendfile-support')
     opt.SAMBA3_ADD_OPTION('utmp')
     opt.SAMBA3_ADD_OPTION('pthreadpool', with_name="enable", without_name="disable")
+    opt.SAMBA3_ADD_OPTION('avahi', with_name="enable", without_name="disable")
+    opt.SAMBA3_ADD_OPTION('iconv')
 
 
 def configure(conf):
     from samba_utils import TO_LIST
 
-    conf.define('PACKAGE_NAME', 'Samba')
-    conf.define('PACKAGE_STRING', 'Samba 3')
-    conf.define('PACKAGE_TARNAME', 'samba')
-    conf.define('PACKAGE_URL', '')
-    conf.define('PACKAGE_VERSION', '3')
-    conf.define('PACKAGE_BUGREPORT', 'samba-technical@samba.org')
+    conf.DEFINE('PACKAGE_NAME', 'Samba', quote=True)
+    conf.DEFINE('PACKAGE_STRING', 'Samba %s' % version.MAJOR, quote=True)
+    conf.DEFINE('PACKAGE_TARNAME',  'samba', quote=True)
+    conf.DEFINE('PACKAGE_URL', "", quote=True)
+    conf.DEFINE('PACKAGE_VERSION', "%s" % version.MAJOR, quote=True)
+    conf.DEFINE('PACKAGE_BUGREPORT', 'samba-technical@samba.org', quote=True)
 
     conf.DEFINE('CONFIG_H_IS_FROM_SAMBA', 1)
-    conf.DEFINE('_SAMBA_BUILD_', 3, add_to_cflags=True)
+    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
 
     if Options.options.with_swat:
         conf.env['build_swat'] = True
@@ -82,13 +89,13 @@ def configure(conf):
     conf.RECURSE('../lib/socket_wrapper')
     conf.RECURSE('../lib/zlib')
 
-    conf.CHECK_HEADERS('execinfo.h libexc.h libunwind.h')
+    conf.CHECK_HEADERS('execinfo.h libexc.h libunwind.h netdb.h')
 
     conf.CHECK_FUNCS('getcwd fchown chmod fchmod mknod mknod64')
     conf.CHECK_FUNCS('strtol strchr strupr chflags')
     conf.CHECK_FUNCS('getrlimit fsync fdatasync setpgid')
     conf.CHECK_FUNCS('setsid glob strpbrk crypt16 getauthuid')
-    conf.CHECK_FUNCS('sigprocmask sigblock sigaction sigset innetgr setnetgrent getnetgrent endnetgrent')
+    conf.CHECK_FUNCS('sigprocmask sigblock sigaction sigset innetgr')
     conf.CHECK_FUNCS('initgroups select poll rdchk getgrnam getgrent pathconf')
     conf.CHECK_FUNCS('setpriv setgidx setuidx setgroups sysconf stat64 fstat64')
     conf.CHECK_FUNCS('lstat64 fopen64 atexit grantpt lseek64 ftruncate64 posix_fallocate posix_fallocate64')
@@ -196,6 +203,9 @@ main() {
         conf.CHECK_CODE('uint32 testvar;', 'HAVE_INT16_FROM_RPC_RPC_H',
                         headers='sys/types.h rpc/rpc.h',
                         msg="Checking for uint32 typedef included by rpc/rpc.h")
+    conf.CHECK_CODE('int i;', 'BROKEN_NISPLUS_INCLUDE_FILES',
+                    headers='sys/types.h sys/acl.h rpcsvc/nis.h',
+                    msg="Checking for broken nisplus include files")
 
     # Check if the compiler will optimize out functions
     conf.CHECK_CODE('''
@@ -206,12 +216,18 @@ if (0) {
 }''', 'HAVE_COMPILER_WILL_OPTIMIZE_OUT_FNS',
         msg="Checking if the compiler will optimize out functions")
 
+    # Check if the compiler supports the LL suffix on long long integers
+    # AIX needs this
+    conf.CHECK_CODE('long long i = 0x8000000000LL', 'COMPILER_SUPPORTS_LL',
+                    headers='stdio.h',
+                    msg="Checking for LL suffix on long long integers")
+
     conf.CHECK_FUNCS('''
 _acl __acl add_proplist_entry atexit attr_getf attr_list attr_listf
 attropen attr_remove attr_removef attr_set attr_setf backtrace_symbols
 bindtextdomain _chdir __chdir chflags chmod _close __close _closedir
 __closedir closedir64 creat64 crypt16 delproplist devnm dgettext dirfd
-DNSServiceRegister _dup __dup _dup2 __dup2 endmntent endnetgrent execl
+DNSServiceRegister _dup __dup _dup2 __dup2 endmntent execl
 extattr_delete_fd extattr_delete_link extattr_get_fd extattr_get_file
 extattr_get_link extattr_list_fd extattr_list_file extattr_list_link
 extattr_set_fd extattr_set_file extattr_set_link _facl __facl _fchdir
@@ -221,9 +237,9 @@ _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 getnetgrent getpagesize
+getgrent getgrnam getgrouplist getmntent getpagesize
 getproplist get_proplist_entry getpwanam getpwent_r getrlimit gettext
-getutmpx getutxent glob grantpt hstrerror initgroups innetgr
+glob grantpt hstrerror initgroups innetgr
 inotify_init lgetea lgetxattr listea listxattr llistea llistxattr
 llseek _llseek __llseek lremoveea lremovexattr _lseek __lseek lseek64
 lsetea lsetxattr _lstat __lstat lstat64 _lstat64 __lstat64 lutimes
@@ -231,16 +247,16 @@ __lxstat memalign mknod mknod64 mlock mlockall munlock munlockall
 nl_langinfo _open __open open64 _open64 __open64 _opendir __opendir
 opendir64 pathconf poll posix_fallocate posix_fallocate64
 posix_memalign prctl pread _pread __pread pread64 _pread64 __pread64
-pututline pututxline pwrite _pwrite __pwrite pwrite64 _pwrite64
+pwrite _pwrite __pwrite pwrite64 _pwrite64
 __pwrite64 rdchk _read __read _readdir __readdir readdir64 _readdir64
 __readdir64 removeea removexattr rewinddir64 _seekdir __seekdir
 seekdir64 select setea setenv setgidx setgroups setlocale setluid
-setmntent setnetgrent setpgid setpriv setproplist setsid setuidx
+setmntent setpgid setpriv setproplist setsid setuidx
 setxattr shmget shm_open sigaction sigblock sigprocmask sigset
 sizeof_proplist_entry _stat __stat stat64 _stat64 __stat64 statvfs
 strcasecmp strchr strpbrk strsignal strtol strupr sysconf sysctlbyname
 __sys_llseek syslog _telldir __telldir telldir64 textdomain timegm
-updwtmp updwtmpx utimensat vsyslog _write __write __xstat
+utimensat vsyslog _write __write __xstat
 ''')
 
     conf.CHECK_TYPE('struct timespec', headers='sys/time.h time.h')
@@ -305,12 +321,20 @@ updwtmp updwtmpx utimensat vsyslog _write __write __xstat
         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.upper())
-            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]))
+            if p == "rpc":
+                for entry in static_list[p]:
+                    decl_list += "extern NTSTATUS %s_init(const struct rpc_srv_callbacks *rpc_srv_cb); " % entry
+                    conf.env[static_env].append('%s' % entry.upper())
+                decl_list = decl_list.rstrip()
+                conf.DEFINE('static_decl_%s' % p, decl_list)
+                conf.DEFINE('static_init_%s' % p, '{ %s_init(NULL); }' % '_init(NULL);  '.join(static_list[p]))
+            else:
+                for entry in static_list[p]:
+                    decl_list += "extern NTSTATUS %s_init(void); " % entry
+                    conf.env[static_env].append('%s' % entry.upper())
+                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, '{}')
@@ -323,6 +347,42 @@ updwtmp updwtmpx utimensat vsyslog _write __write __xstat
         conf.env.build_winbind = True
         conf.DEFINE('WITH_WINBIND', '1')
 
+    conf.find_program('awk', var='AWK')
+
+    # Darwin has extra options to xattr-family functions
+    conf.CHECK_CODE('getxattr(0, 0, 0, 0, 0, 0);',
+                    'XATTR_ADD_OPT',
+                    msg="Checking whether xattr interface takes additional options",
+                    headers='sys/types.h attr/xattr.h sys/xattr.h')
+
+    conf.CHECK_HEADERS('asm/types.h')
+
+    conf.CHECK_CODE('dev_t dev; int i = major(dev); return 0', "HAVE_DEVICE_MAJOR_FN",
+                    headers='unistd.h sys/types.h',
+                    msg="Checking for major macro")
+
+    conf.CHECK_CODE('dev_t dev; int i = minor(dev); return 0', "HAVE_DEVICE_MINOR_FN",
+                    headers='unistd.h sys/types.h',
+                    msg="Checking for minor macro")
+
+    conf.CHECK_STRUCTURE_MEMBER('struct dirent', 'd_off',
+                                headers='unistd.h sys/types.h dirent.h',
+                                define='HAVE_DIRENT_D_OFF')
+
+    conf.CHECK_FUNCS('setnetgrent getnetgrent endnetgrent')
+    conf.CHECK_CODE('setnetgrent("foo")', 'HAVE_SETNETGRENT_PROTOTYPE',
+                    msg="Checking for setnetgrent prototype",
+                    headers='netdb.h netgroup.h',
+                    cflags="-Werror-implicit-function-declaration")
+    conf.CHECK_CODE('getnetgrent', 'HAVE_GETNETGRENT_PROTOTYPE',
+                    msg="Checking for getnetgrent prototype",
+                    headers='netdb.h netgroup.h',
+                    cflags="-Werror-implicit-function-declaration")
+    conf.CHECK_CODE('endnetgrent', 'HAVE_ENDNETGRENT_PROTOTYPE',
+                    msg="Checking for endnetgrent prototype",
+                    headers='netdb.h netgroup.h',
+                    cflags="-Werror-implicit-function-declaration")
+
     #FIXME: Should just be set when krb5 and ldap requirements are fulfilled
     if Options.options.with_ads:
         conf.DEFINE('WITH_ADS', '1')
@@ -393,7 +453,8 @@ updwtmp updwtmpx utimensat vsyslog _write __write __xstat
         conf.CHECK_FUNCS_IN('crypto', 'des_set_key')
         conf.CHECK_FUNCS_IN('copy_Authenticator', 'asn1')
         conf.CHECK_FUNCS_IN('roken_getaddrinfo_hostspec', 'roken')
-        conf.CHECK_FUNCS_IN('gss_display_status', 'gssapi gssapi_krb5')
+        if conf.CHECK_FUNCS_IN('gss_display_status', 'gssapi gssapi_krb5'):
+            conf.DEFINE('HAVE_GSSAPI', '1')
         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
@@ -418,11 +479,126 @@ krb5_get_credentials_for_user krb5_get_host_realm krb5_free_host_realm''',
                             krb5_auth_con_set_req_cksumtype''',
                             headers='krb5.h', always=True)
         conf.CHECK_VARIABLE('AP_OPTS_USE_SUBKEY', headers='krb5.h')
+        conf.CHECK_VARIABLE('KV5M_KEYTAB', headers='krb5.h')
+        conf.CHECK_VARIABLE('KRB5_KU_OTHER_CKSUM', headers='krb5.h')
+        conf.CHECK_VARIABLE('KRB5_KEYUSAGE_APP_DATA_CKSUM', headers='krb5.h')
+        conf.CHECK_STRUCTURE_MEMBER('krb5_keytab_entry', 'key', headers='krb5.h',
+                                    define='HAVE_KRB5_KEYTAB_ENTRY_KEY')
+        conf.CHECK_STRUCTURE_MEMBER('krb5_keytab_entry', 'keyblock', headers='krb5.h',
+                                    define='HAVE_KRB5_KEYTAB_ENTRY_KEYBLOCK')
+        conf.CHECK_STRUCTURE_MEMBER('krb5_address', 'magic', headers='krb5.h',
+                                    define='HAVE_MAGIC_IN_KRB5_ADDRESS')
+        conf.CHECK_STRUCTURE_MEMBER('krb5_address', 'addrtype', headers='krb5.h',
+                                    define='HAVE_ADDRTYPE_IN_KRB5_ADDRESS')
+        conf.CHECK_STRUCTURE_MEMBER('krb5_ticket', 'enc_part2', headers='krb5.h',
+                                    define='HAVE_KRB5_TKT_ENC_PART2')
+        conf.CHECK_STRUCTURE_MEMBER('krb5_creds', 'keyblock', headers='krb5.h',
+                                    define='HAVE_KRB5_KEYBLOCK_IN_CREDS')
+        conf.CHECK_STRUCTURE_MEMBER('krb5_creds', 'session', headers='krb5.h',
+                                    define='HAVE_KRB5_SESSION_IN_CREDS')
+        conf.CHECK_TYPE('krb5_encrypt_block', headers='krb5.h')
+        conf.CHECK_CODE('''
+krb5_context ctx;
+krb5_get_init_creds_opt *opt = NULL;
+krb5_get_init_creds_opt_free(ctx, opt);
+''',
+                        'KRB5_CREDS_OPT_FREE_REQUIRES_CONTEXT',
+                        headers='krb5.h', link=False,
+                        msg="Checking whether krb5_get_init_creds_opt_free takes a context argument")
+        conf.CHECK_CODE('krb5_mk_error(0,0,0)',
+                        'HAVE_SHORT_KRB5_MK_ERROR_INTERFACE',
+                        headers='krb5.h', link=False,
+                        msg="Checking whether krb5_mk_error takes 3 arguments MIT or 9 Heimdal")
+        conf.CHECK_CODE('''
+const krb5_data *pkdata;
+krb5_context context;
+krb5_principal principal;
+pkdata = krb5_princ_component(context, principal, 0);
+''',
+                        'HAVE_KRB5_PRINC_COMPONENT',
+                        headers='krb5.h', lib='krb5',
+                        msg="Checking whether krb5_princ_component is available")
+
+        conf.CHECK_CODE('''
+int main(void) {
+char buf[256];
+krb5_enctype_to_string(1, buf, 256);
+return 0;
+}''',
+                        'HAVE_KRB5_ENCTYPE_TO_STRING_WITH_SIZE_T_ARG',
+                        headers='krb5.h', lib='krb5',
+                        addmain=False, cflags='-Werror',
+                        msg="Checking whether krb5_enctype_to_string takes size_t argument")
+
+        conf.CHECK_CODE('''
+int main(void) {
+krb5_context context = NULL;
+char *str = NULL;
+krb5_enctype_to_string(context, 1, &str);
+if (str) free (str);
+return 0;
+}''',
+                        'HAVE_KRB5_ENCTYPE_TO_STRING_WITH_KRB5_CONTEXT_ARG',
+                        headers='krb5.h stdlib.h', lib='krb5',
+                        addmain=False, cflags='-Werror',
+                        msg="Checking whether krb5_enctype_to_string takes krb5_context argument")
+        conf.DEFINE('HAVE_KRB5', '1')
 
     else:
         conf.SET_TARGET_TYPE('krb5', 'EMPTY')
         conf.SET_TARGET_TYPE('gssapi', 'EMPTY')
         conf.SET_TARGET_TYPE('gssapi_krb5', 'EMPTY')
+        conf.SET_TARGET_TYPE('com_err', 'EMPTY')
+        conf.SET_TARGET_TYPE('k5crypto', 'EMPTY')
+
+    if Options.options.with_utmp:
+        conf.CHECK_FUNCS('pututline pututxline updwtmp updwtmpx getutmpx getutxent')
+        conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_name', headers='utmp.h',
+                                    define='HAVE_UT_UT_NAME')
+        conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_user', headers='utmp.h',
+                                    define='HAVE_UT_UT_USER')
+        conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_id', headers='utmp.h',
+                                    define='HAVE_UT_UT_ID')
+        conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_host', headers='utmp.h',
+                                    define='HAVE_UT_UT_HOST')
+        conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_time', headers='utmp.h',
+                                    define='HAVE_UT_UT_TIME')
+        conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_tv', headers='utmp.h',
+                                    define='HAVE_UT_UT_TV')
+        conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_type', headers='utmp.h',
+                                    define='HAVE_UT_UT_TYPE')
+        conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_pid', headers='utmp.h',
+                                    define='HAVE_UT_UT_PID')
+        conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_exit.e_exit', headers='utmp.h',
+                                    define='HAVE_UT_UT_EXIT')
+        conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_addr_v6', headers='utmp.h',
+                                    define='HAVE_UT_UT_ADDR_V6')
+        conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_addr', headers='utmp.h',
+                                    define='HAVE_UT_UT_ADDR')
+        conf.CHECK_STRUCTURE_MEMBER('struct utmpx', 'ut_syslen', headers='utmpx.h',
+                                    define='HAVE_UX_UT_SYSLEN')
+        conf.CHECK_CODE('struct utmp utarg; struct utmp *utreturn; utreturn = pututline(&utarg);',
+                        'PUTUTLINE_RETURNS_UTMP', headers='utmp.h',
+                        msg="Checking whether pututline returns pointer")
+        conf.DEFINE('WITH_UTMP', 1)
+
+    if Options.options.with_avahi:
+        conf.env.with_avahi = True
+        if not conf.CHECK_HEADERS('avahi-common/watch.h avahi-client/client.h'): conf.env.with_avahi = False
+        if not conf.CHECK_FUNCS_IN('avahi_client_new', 'avahi-client'): conf.env.with_avahi = False
+        if not conf.CHECK_FUNCS_IN('avahi_strerror', 'avahi-common'): conf.env.with_avahi = False
+        if conf.env.with_avahi:
+            conf.DEFINE('WITH_AVAHI_SUPPORT', 1)
+    else:
+        conf.SET_TARGET_TYPE('avahi-common', 'EMPTY')
+        conf.SET_TARGET_TYPE('avahi-client', 'EMPTY')
+
+    if Options.options.with_iconv:
+        conf.env.with_iconv = True
+        if not conf.CHECK_FUNCS_IN('iconv_open', 'iconv', headers='iconv.h'):
+            conf.env.with_iconv = False
+        if conf.env.with_iconv:
+            conf.DEFINE('HAVE_ICONV', 1)
 
     # FIXME: these should be tests for features, but the old build system just
     # checks for OSes.
@@ -438,6 +614,10 @@ krb5_get_credentials_for_user krb5_get_host_realm krb5_free_host_realm''',
         elif host_os.rfind('qnx') > -1:
             conf.DEFINE('QNX', '1')
         conf.DEFINE('STAT_ST_BLOCKSIZE', '512')
+    elif (host_os.rfind('darwin') > -1):
+        conf.DEFINE('DARWINOS', 1)
+        conf.DEFINE('STAT_ST_BLOCKSIZE', '512')
+        conf.ADD_CFLAGS('-fno-common')
     # FIXME: Add more checks here.
     else:
         print "Unknown host_os '%s', please report this to samba-technical@samba.org" % host_os