s4-waf: inline LIBREPLACE_NETWORK into 'replace'
[samba.git] / lib / replace / wscript
index f45ca33be834190c48b9a8f448ccdf23407d7d4c..bfe9142669e1d2205624ca55be632a79731b39e0 100644 (file)
-#! /usr/bin/env python
+#!/usr/bin/env python
+
+APPNAME = 'libreplace'
+VERSION = '1.2.1'
 
-srcdir = '../..'
 blddir = 'bin'
 
-import sys
-sys.path.insert(0, srcdir+"/buildtools/wafsamba")
-import wafsamba
+import sys, os, Utils
+
+# find the buildtools directory
+srcdir = '.'
+while not os.path.exists(srcdir+'/buildtools') and len(srcdir.split('/')) < 5:
+    srcdir = '../' + srcdir
+sys.path.insert(0, srcdir + '/buildtools/wafsamba')
+
+import wafsamba, samba_dist
 import Options, os, preproc
 
+samba_dist.DIST_DIRS('lib/replace buildtools:buildtools')
+
 def set_options(opt):
-    opt.tool_options('compiler_cc')
-    # TODO: we are not yet obeying these default paths at install time
-    opt.add_option('--libdir',
-                   help=("object code libraries [PREFIX/lib"),
-                   action="store", dest='LIBDIR', default='${PREFIX}/lib')
-    opt.add_option('--bindir',
-                   help=("user executables [PREFIX/bin]"),
-                   action="store", dest='BINDIR', default='${PREFIX}/bin')
-    opt.add_option('--sbindir',
-                   help=("system admin executables [PREFIX/sbin]"),
-                   action="store", dest='SBINDIR', default='${PREFIX}/sbin')
-    opt.add_option('--disable-shared',
-                   help=("Disable all use of shared libraries"),
-                   action="store_true", dest='disable_shared', default=False)
-    opt.add_option('--disable-rpath',
-                   help=("Disable use of rpath for build binaries"),
-                   action="store_true", dest='disable_rpath_build', default=False)
-    opt.add_option('--disable-rpath-install',
-                   help=("Disable use of rpath for installed binaries"),
-                   action="store_true", dest='disable_rpath_install', default=False)
-    opt.add_option('--enable-developer',
-                   help=("Turn on developer warnings and debugging"),
-                   action="store_true", dest='developer', default=False)
-    opt.add_option('--enable-gccdeps',
-                   help=("Enable use gcc -MD dependency module"),
-                   action="store_true", dest='enable_gccdeps', default=False)
-    opt.add_option('--timestamp-dependencies',
-                   help=("use file timestamps instead of content for build dependencies (BROKEN)"),
-                   action="store_true", dest='timestamp_dependencies', default=False)
-    opt.add_option('-C',
-                   help='enable configure cacheing',
-                   action='store_true', dest='enable_configure_cache')
-    opt.add_option('--pedantic',
-                  help=("Enable even more compiler warnings"),
-                  action='store_true', dest='pedantic', default=False)
+    opt.BUILTIN_DEFAULT('NONE')
+    opt.BUNDLED_EXTENSION_DEFAULT('')
+    opt.RECURSE('buildtools/wafsamba')
 
 @wafsamba.runonce
 def configure(conf):
-    conf.env.hlist = []
-    conf.env.srcdir = conf.srcdir
-
-    if Options.options.timestamp_dependencies:
-        conf.ENABLE_TIMESTAMP_DEPENDENCIES()
-
-    conf.SETUP_CONFIGURE_CACHE(Options.options.enable_configure_cache)
-
-    # load our local waf extensions
-    conf.check_tool('wafsamba', tooldir=conf.srcdir + "/buildtools/wafsamba")
-
-    conf.CHECK_CC_ENV()
-
-    conf.check_tool('compiler_cc')
-
-    if Options.options.enable_gccdeps:
-        # don't enable gccdeps by default as it needs a very recent version gcc
-        conf.check_tool('gccdeps', tooldir=conf.srcdir + "/buildtools/wafsamba")
-
-    # make the install paths available in environment
-    conf.env.LIBDIR = Options.options.LIBDIR
-    conf.env.BINDIR = Options.options.BINDIR
-    conf.env.SBINDIR = Options.options.SBINDIR
-
-    conf.env.DISABLE_SHARED = Options.options.disable_shared
-
-    # see if we can compile and run a simple C program
-    conf.CHECK_CODE('#include "test/simple.c"\n',
-                    addmain=False,
-                    define='HAVE_SIMPLE_C_PROG',
-                    mandatory=True,
-                    execute=True,
-                    msg='Checking simple C program')
-
-    # check for rpath
-    if not conf.env.DISABLE_SHARED and conf.CHECK_RPATH_SUPPORT():
-        conf.env.RPATH_ON_BUILD   = not Options.options.disable_rpath_build
-        conf.env.RPATH_ON_INSTALL = (conf.env.RPATH_ON_BUILD and
-                                     not Options.options.disable_rpath_install)
-    else:
-        conf.env.RPATH_ON_INSTALL = False
-        conf.env.RPATH_ON_BUILD   = False
+    conf.RECURSE('buildtools/wafsamba')
 
-    # we should use the PIC options in waf instead
-    conf.ADD_CFLAGS('-fPIC')
-
-    # check for pkgconfig
-    conf.check_cfg(atleast_pkgconfig_version='0.0.0')
-
-    conf.DEFINE('_GNU_SOURCE', 1, add_to_cflags=True)
-    conf.DEFINE('_XOPEN_SOURCE_EXTENDED', 1, add_to_cflags=True)
     conf.DEFINE('LIBREPLACE_NETWORK_CHECKS', 1)
 
-    # get the base headers we'll use for the rest of the tests
-    conf.CHECK_HEADERS('stdio.h sys/types.h sys/stat.h stdlib.h stddef.h memory.h string.h',
-                       add_headers=True)
-    conf.CHECK_HEADERS('strings.h inttypes.h stdint.h unistd.h minix/config.h', add_headers=True)
-    conf.CHECK_HEADERS('ctype.h standards.h stdbool.h stdint.h stdarg.h vararg.h', add_headers=True)
-
-    # see if we need special largefile flags
-    conf.CHECK_LARGEFILE()
-
     conf.CHECK_HEADERS('crypt.h locale.h acl/libacl.h compat.h')
     conf.CHECK_HEADERS('acl/libacl.h attr/xattr.h compat.h ctype.h dustat.h')
     conf.CHECK_HEADERS('fcntl.h fnmatch.h glob.h history.h krb5.h langinfo.h')
@@ -121,7 +41,7 @@ def configure(conf):
     conf.CHECK_HEADERS('sys/vfs.h sys/xattr.h termio.h termios.h')
     conf.CHECK_HEADERS('sys/wait.h sys/stat.h malloc.h grp.h')
     conf.CHECK_HEADERS('sys/select.h setjmp.h utime.h sys/syslog.h syslog.h')
-    conf.CHECK_HEADERS('sys/time.h time.h stdarg.h vararg.h sys/mount.h mntent.h')
+    conf.CHECK_HEADERS('stdarg.h vararg.h sys/mount.h mntent.h')
     conf.CHECK_HEADERS('stropts.h unix.h string.h strings.h sys/param.h limits.h')
     conf.CHECK_HEADERS('''sys/socket.h netinet/in.h netdb.h arpa/inet.h netinet/in_systm.h
                           netinet/ip.h netinet/tcp.h netinet/in_ip.h
@@ -130,26 +50,18 @@ def configure(conf):
     conf.CHECK_HEADERS('windows.h winsock2.h ws2tcpip.h')
     conf.CHECK_HEADERS('libintl.h errno.h')
     conf.CHECK_HEADERS('gcrypt.h getopt.h iconv.h')
-    conf.CHECK_HEADERS('sys/inotify.h memory.h nss.h popt.h sasl/sasl.h')
+    conf.CHECK_HEADERS('sys/inotify.h memory.h nss.h sasl/sasl.h')
     conf.CHECK_HEADERS('security/pam_appl.h sys/inotify.h zlib.h asm/unistd.h')
     conf.CHECK_HEADERS('aio.h sys/unistd.h rpc/rpc.h rpc/nettype.h alloca.h float.h')
 
-    conf.CHECK_HEADERS('rpcsvc/nis.h rpcsvc/ypclnt.h sys/prctl.h sys/sysctl.h', add_headers=False)
-    conf.CHECK_HEADERS('sys/fileio.h sys/filesys.h sys/dustat.h sys/sysmacros.h', add_headers=False)
-    conf.CHECK_HEADERS('xfs/libxfs.h netgroup.h rpcsvc/yp_prot.h', add_headers=False)
-    conf.CHECK_HEADERS('valgrind.h valgrind/valgrind.h valgrind/memcheck.h', add_headers=False)
-    conf.CHECK_HEADERS('nss_common.h nsswitch.h ns_api.h', add_headers=False)
-    conf.CHECK_HEADERS('sys/extattr.h sys/ea.h sys/proplist.h sys/cdefs.h', add_headers=False)
-    conf.CHECK_HEADERS('utmp.h utmpx.h lastlog.h', add_headers=False)
-    conf.CHECK_HEADERS('syscall.h sys/syscall.h', add_headers=False)
-
-    if 'HAVE_STDDEF_H' in conf.env and 'HAVE_STDLIB_H' in conf.env:
-        conf.DEFINE('STDC_HEADERS', 1)
-
-    if 'HAVE_SYS_TIME_H' in conf.env and 'HAVE_TIME_H' in conf.env:
-        conf.DEFINE('TIME_WITH_SYS_TIME', 1)
-
-    conf.define('SHLIBEXT', "so", quote=True)
+    conf.CHECK_HEADERS('rpcsvc/nis.h rpcsvc/ypclnt.h sys/prctl.h sys/sysctl.h')
+    conf.CHECK_HEADERS('sys/fileio.h sys/filesys.h sys/dustat.h sys/sysmacros.h')
+    conf.CHECK_HEADERS('xfs/libxfs.h netgroup.h rpcsvc/yp_prot.h')
+    conf.CHECK_HEADERS('valgrind.h valgrind/valgrind.h valgrind/memcheck.h')
+    conf.CHECK_HEADERS('nss_common.h nsswitch.h ns_api.h')
+    conf.CHECK_HEADERS('sys/extattr.h sys/ea.h sys/proplist.h sys/cdefs.h')
+    conf.CHECK_HEADERS('utmp.h utmpx.h lastlog.h')
+    conf.CHECK_HEADERS('syscall.h sys/syscall.h inttypes.h')
 
     conf.CHECK_TYPES('"long long" intptr_t uintptr_t ptrdiff_t')
     conf.CHECK_TYPES('comparison_fn_t bool')
@@ -169,11 +81,7 @@ def configure(conf):
     conf.CHECK_TYPE('bool', 'off_t')
     conf.CHECK_TYPE('offset_t', 'loff_t')
     conf.CHECK_TYPE('volatile int', define='HAVE_VOLATILE')
-
-    conf.CHECK_CODE('long one = 1; return ((char *)(&one))[0]',
-                    execute=True,
-                    define='WORDS_BIGENDIAN')
-
+    conf.CHECK_TYPE('uint_t', 'unsigned int')
 
     conf.CHECK_TYPES('socklen_t', headers='sys/socket.h')
     conf.CHECK_TYPE_IN('struct ifaddrs', 'ifaddrs.h')
@@ -207,12 +115,6 @@ def configure(conf):
                     lib='nsl socket',
                     headers='sys/socket.h netdb.h netinet/in.h')
 
-    # check if signal() takes a void function
-    if conf.CHECK_CODE('return *(signal (0, 0)) (0) == 1', define='RETSIGTYPE_INT', msg='Checking return type of signal handlers'):
-        conf.DEFINE('RETSIGTYPE', 'int')
-    else:
-        conf.DEFINE('RETSIGTYPE', 'void')
-
     # these may be builtins, so we need the link=False strategy
     conf.CHECK_FUNCS('strdup memmem printf memset memcpy memmove strcpy strncpy bzero', link=False)
 
@@ -223,11 +125,11 @@ def configure(conf):
     conf.CHECK_FUNCS('ftruncate chsize rename waitpid wait4 strlcpy strlcat')
     conf.CHECK_FUNCS('initgroups pread pwrite strndup strcasestr')
     conf.CHECK_FUNCS('strtok_r mkdtemp dup2 dprintf vdprintf isatty chown lchown')
-    conf.CHECK_FUNCS('link readlink symlink realpath fdatasync snprintf vsnprintf')
+    conf.CHECK_FUNCS('link readlink symlink realpath snprintf vsnprintf')
     conf.CHECK_FUNCS('asprintf vasprintf setenv unsetenv strnlen strtoull __strtoull')
     conf.CHECK_FUNCS('strtouq strtoll __strtoll strtoq')
-    conf.CHECK_FUNCS('if_nametoindex')
-    conf.CHECK_FUNCS('dirfd getdirentries getdents syslog')
+    conf.CHECK_FUNCS('if_nametoindex strerror_r')
+    conf.CHECK_FUNCS('getdirentries getdents syslog')
     conf.CHECK_FUNCS('gai_strerror get_current_dir_name')
     conf.CHECK_FUNCS('timegm getifaddrs freeifaddrs mmap setgroups setsid')
     conf.CHECK_FUNCS('getgrent_r getgrgid_r getgrnam_r getgrouplist getpagesize')
@@ -235,7 +137,11 @@ def configure(conf):
 
     conf.CHECK_FUNCS_IN('dlopen dlsym dlerror dlclose', 'dl',
                         checklibc=True, headers='dlfcn.h dl.h')
-    conf.CHECK_FUNCS_IN('poptGetContext', 'popt')
+
+    conf.CHECK_C_PROTOTYPE('dlopen', 'void *dlopen(const char* filename, unsigned int flags)',
+                           define='DLOPEN_TAKES_UNSIGNED_FLAGS', headers='dlfcn.h dl.h')
+
+    conf.CHECK_FUNCS_IN('fdatasync', 'rt', checklibc=True)
 
     # these headers need to be tested as a group on freebsd
     conf.CHECK_HEADERS(headers='sys/socket.h net/if.h', together=True)
@@ -251,16 +157,14 @@ def configure(conf):
     conf.CHECK_VARIABLE('rl_event_hook', define='HAVE_DECL_RL_EVENT_HOOK', always=True,
                         headers='readline.h readline/readline.h readline/history.h')
 
-    conf.CHECK_VARIABLE('__FUNCTION__', define='HAVE_FUNCTION_MACRO')
-
     conf.CHECK_DECLS('snprintf vsnprintf asprintf vasprintf')
 
-    conf.CHECK_DECLS('dirfd', reverse=True, headers='dirent.h')
     conf.CHECK_DECLS('errno', headers='errno.h', reverse=True)
     conf.CHECK_DECLS('environ getgrent_r getpwent_r', reverse=True, headers='pwd.h grp.h')
     conf.CHECK_DECLS('pread pwrite setenv setresgid setresuid', reverse=True)
 
     conf.CHECK_SIZEOF('char int "long long" long off_t short size_t ssize_t')
+    conf.CHECK_SIZEOF('dev_t ino_t time_t')
     conf.CHECK_SIZEOF('void*', define='SIZEOF_VOID_P')
 
     if conf.CONFIG_SET('HAVE_EPOLL_CREATE') and conf.CONFIG_SET('HAVE_SYS_EPOLL_H'):
@@ -273,17 +177,6 @@ def configure(conf):
         conf.DEFINE('REPLACE_STRPTIME', 1)
 
 
-
-
-    conf.CHECK_CODE('va_list ap1,ap2; va_copy(ap1,ap2)',
-                    define="HAVE_VA_COPY",
-                    msg="Checking for va_copy")
-
-    conf.CHECK_CODE('''
-                    #define eprintf(...) fprintf(stderr, __VA_ARGS__)
-                    eprintf("bla", "bar")
-                    ''', define='HAVE__VA_ARGS__MACRO')
-
     conf.CHECK_CODE('gettimeofday(NULL, NULL)', 'HAVE_GETTIMEOFDAY_TZ', execute=False)
 
     conf.CHECK_CODE('#include "test/snprintf.c"',
@@ -292,32 +185,8 @@ def configure(conf):
                     addmain=False,
                     msg="Checking for C99 vsnprintf")
 
-    if Options.options.pedantic and conf.CHECK_CFLAGS('-W'):
-       conf.ADD_CFLAGS('-W')
-
-    conf.SAMBA_CONFIG_H()
     conf.SAMBA_BUILD_ENV()
 
-    # look for a method of finding the list of network interfaces
-    for method in ['HAVE_IFACE_GETIFADDRS', 'HAVE_IFACE_AIX', 'HAVE_IFACE_IFCONF', 'HAVE_IFACE_IFREQ']:
-        if conf.CHECK_CODE('''
-                           #define %s 1
-                           #define NO_CONFIG_H 1
-                           #define AUTOCONF_TEST 1
-                           #define SOCKET_WRAPPER_NOT_REPLACE
-                           #include "replace.c"
-                           #include "inet_ntop.c"
-                           #include "snprintf.c"
-                           #include "getifaddrs.c"
-                           #define getifaddrs_test main
-                           #include "test/getifaddrs.c"
-                           ''' % method,
-                           method,
-                           lib='nsl socket',
-                           addmain=False,
-                           execute=True):
-            break
-
     conf.CHECK_CODE('''
                    typedef struct {unsigned x;} FOOBAR;
                     #define X_FOOBAR(x) ((FOOBAR) { x })
@@ -381,39 +250,82 @@ def configure(conf):
                         cflags=conf.env.VISIBILITY_CFLAGS,
                         define='HAVE_VISIBILITY_ATTR')
 
+    if not conf.CHECK_CODE('''#define LIBREPLACE_CONFIGURE_TEST_STRPTIME
+                      #include "$libreplacedir/test/strptime.c"''',
+                           define='HAVE_STRPTIME',
+                           msg='Checking for working strptime'):
+        conf.DEFINE('REPLACE_STRPTIME', 1)
+
+
+    # look for a method of finding the list of network interfaces
+    for method in ['HAVE_IFACE_GETIFADDRS', 'HAVE_IFACE_AIX', 'HAVE_IFACE_IFCONF', 'HAVE_IFACE_IFREQ']:
+        if conf.CHECK_CODE('''
+                           #define %s 1
+                           #define NO_CONFIG_H 1
+                           #define AUTOCONF_TEST 1
+                           #define SOCKET_WRAPPER_NOT_REPLACE
+                           #include "replace.c"
+                           #include "inet_ntop.c"
+                           #include "snprintf.c"
+                           #include "getifaddrs.c"
+                           #define getifaddrs_test main
+                           #include "test/getifaddrs.c"
+                           ''' % method,
+                           method,
+                           lib='nsl socket',
+                           addmain=False,
+                           execute=True):
+            break
+
     if conf.CHECK_FUNCS('getpass getpassphrase'):
         # if we have both, then we prefer getpassphrase
         conf.DEFINE('REPLACE_GETPASS_BY_GETPASSPHRASE', 1)
         conf.DEFINE('REPLACE_GETPASS', 1)
-
-    conf.CHECK_CODE('''#include "getpass.c"
+    else:
+        conf.CHECK_CODE('''#include "getpass.c"
                        int main(void) { return 0; }''',
                     addmain=False,
                     define='REPLACE_GETPASS',
                     cflags='-DNO_CONFIG_H')
 
-    conf.sub_config('system')
+    conf.RECURSE('system')
+    conf.SAMBA_CONFIG_H()
 
 
 def build(bld):
-    # libreplace needs to put the library in the right build groups
-    # as libreplace is a base library for everything, even for our
-    # compilers, we need libreplace to build very early
-    bld.SETUP_BUILD_GROUPS()
+    bld.RECURSE('buildtools/wafsamba')
 
-    REPLACE_SOURCE = 'replace.c snprintf.c'
+    REPLACE_HOSTCC_SOURCE = 'replace.c snprintf.c'
+
+    if bld.CONFIG_SET('REPLACE_STRPTIME'):       REPLACE_HOSTCC_SOURCE += ' strptime.c'
+    if not bld.CONFIG_SET('HAVE_TIMEGM'):        REPLACE_HOSTCC_SOURCE += ' timegm.c'
+
+    bld.SAMBA_SUBSYSTEM('LIBREPLACE_H',
+        REPLACE_HOSTCC_SOURCE,
+
+        cflags='-DSOCKET_WRAPPER_DISABLE=1 -DNSS_WRAPPER_DISABLE=1 -D_SAMBA_HOSTCC_',
+        group='compiler_libraries'
+    )
+
+    REPLACE_SOURCE = REPLACE_HOSTCC_SOURCE
+
+    if bld.CONFIG_SET('REPLACE_GETPASS'):        REPLACE_SOURCE += ' getpass.c'
 
-    if bld.CONFIG_SET('REPLACE_STRPTIME'):       REPLACE_SOURCE += ' strptime.c'
-    if not bld.CONFIG_SET('HAVE_TIMEGM'):        REPLACE_SOURCE += ' timegm.c'
-    if not bld.CONFIG_SET('HAVE_GETIFADDRS'):    REPLACE_SOURCE += ' getifaddrs.c'
     if not bld.CONFIG_SET('HAVE_DLOPEN'):        REPLACE_SOURCE += ' dlfcn.c'
+
     if not bld.CONFIG_SET('HAVE_SOCKETPAIR'):    REPLACE_SOURCE += ' socketpair.c'
     if not bld.CONFIG_SET('HAVE_CONNECT'):       REPLACE_SOURCE += ' socket.c'
+    if not bld.CONFIG_SET('HAVE_GETIFADDRS'):    REPLACE_SOURCE += ' getifaddrs.c'
+    if not bld.CONFIG_SET('HAVE_GETADDRINFO'):   REPLACE_SOURCE += ' getaddrinfo.c'
+    if not bld.CONFIG_SET('HAVE_INET_NTOA'):     REPLACE_SOURCE += ' inet_ntoa.c'
+    if not bld.CONFIG_SET('HAVE_INET_ATON'):     REPLACE_SOURCE += ' inet_aton.c'
+    if not bld.CONFIG_SET('HAVE_INET_NTOP'):     REPLACE_SOURCE += ' inet_ntop.c'
+    if not bld.CONFIG_SET('HAVE_INET_PTON'):     REPLACE_SOURCE += ' inet_pton.c'
 
     bld.SAMBA_LIBRARY('replace',
                       source=REPLACE_SOURCE,
                       group='base_libraries',
-                      deps='LIBREPLACE_GETPASS nsl socket')
+                      deps='nsl socket')
 
     TEST_SOURCES = '''test/testsuite.c test/main.c test/strptime.c
                       test/os2_delete.c test/getifaddrs.c'''
@@ -424,22 +336,25 @@ def build(bld):
                      deps='replace',
                      install=False)
 
-    NET_SOURCES = []
-    if bld.CONFIG_SET('HAVE_INET_NTOA'):  NET_SOURCES.append('inet_ntoa.c')
-    if bld.CONFIG_SET('HAVE_INET_ATON'):  NET_SOURCES.append('inet_aton.c')
-    if bld.CONFIG_SET('HAVE_INET_NTOP'):  NET_SOURCES.append('inet_ntop.c')
-    if bld.CONFIG_SET('HAVE_INET_PTON'):  NET_SOURCES.append('inet_pton.c')
-    if bld.CONFIG_SET('HAVE_SOCKETPAIR'): NET_SOURCES.append('socketpair.c')
-
-    bld.SAMBA_SUBSYSTEM('LIBREPLACE_NETWORK', NET_SOURCES, deps='replace')
-
-
     CRYPT_SOURCES = []
     if not 'HAVE_CRYPT' in bld.env: CRYPT_SOURCES.append('crypt.c')
 
-    bld.SAMBA_SUBSYSTEM('LIBREPLACE_EXT', CRYPT_SOURCES)
-
-    bld.SAMBA_SUBSYSTEM('LIBREPLACE_GETPASS', 'getpass.c',
-                        enabled=bld.CONFIG_SET('REPLACE_GETPASS'))
-
-    bld.CHECK_PROJECT_RULES()
+    bld.SAMBA_SUBSYSTEM('LIBREPLACE_EXT',
+                        CRYPT_SOURCES,
+                        group='base_libraries')
+
+    # build replacements for stdint.h and stdbool.h if needed
+    bld.SAMBA_GENERATOR('replace_stdint_h',
+                        rule='cp ${SRC} ${TGT}',
+                        source='hdr_replace.h',
+                        target='stdint.h',
+                        enabled = not bld.CONFIG_SET('HAVE_STDINT_H'))
+    bld.SAMBA_GENERATOR('replace_stdbool_h',
+                        rule='cp ${SRC} ${TGT}',
+                        source='hdr_replace.h',
+                        target='stdbool.h',
+                        enabled = not bld.CONFIG_SET('HAVE_STDBOOL_H'))
+
+def dist():
+    '''makes a tarball for distribution'''
+    samba_dist.dist()