#!/usr/bin/env python APPNAME = 'ctdb' blddir = 'bin' import sys, os # 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, Options, Logs, Utils import samba_utils, samba_version env = samba_utils.LOAD_ENVIRONMENT() if os.path.isfile('./VERSION'): vdir = '.' elif os.path.isfile('../VERSION'): vdir = '..' else: Logs.error("VERSION file not found") version = samba_version.samba_version_file('%s/VERSION' % vdir, vdir, env) VERSION = version.STRING.replace('-', '.') default_prefix = Options.default_prefix = '/usr/local' samba_dist.DIST_DIRS('''ctdb:. lib/replace:lib/replace lib/talloc:lib/talloc lib/tevent:lib/tevent lib/tdb:lib/tdb lib/socket_wrapper:lib/socket_wrapper third_party/popt:third_party/popt lib/util:lib/util lib/tdb_wrap:lib/tdb_wrap lib/ccan:lib/ccan libcli/util:libcli/util lib/async_req:lib/async_req buildtools:buildtools third_party/waf:third_party/waf''') manpages = [ 'ctdb.1', 'ctdb.7', 'ctdbd.1', 'ctdbd.conf.5', 'ctdbd_wrapper.1', 'ctdb-statistics.7', 'ctdb-tunables.7', 'ltdbtool.1', 'onnode.1', 'ping_pong.1' ] def set_options(opt): opt.PRIVATE_EXTENSION_DEFAULT('ctdb') opt.RECURSE('lib/replace') opt.RECURSE('lib/util') opt.RECURSE('lib/talloc') opt.RECURSE('lib/tevent') opt.RECURSE('lib/tdb') opt.add_option('--enable-infiniband', help=("Turn on infiniband support (default=no)"), action="store_true", dest='ctdb_infiniband', default=False) opt.add_option('--enable-pmda', help=("Turn on PCP pmda support (default=no)"), action="store_true", dest='ctdb_pmda', default=False) opt.add_option('--with-logdir', help=("Path to log directory"), action="store", dest='ctdb_logdir', default=None) opt.add_option('--with-socketpath', help=("path to CTDB daemon socket"), action="store", dest='ctdb_sockpath', default=None) def configure(conf): # No need to build python bindings for talloc/tevent/tdb if conf.IN_LAUNCH_DIR(): conf.env.standalone_ctdb = True Options.options.disable_python = True conf.RECURSE('lib/replace') if conf.env.standalone_ctdb: conf.SAMBA_CHECK_PERL(mandatory=True) conf.SAMBA_CHECK_PYTHON(mandatory=True, version=(2,5,0)) conf.SAMBA_CHECK_PYTHON_HEADERS(mandatory=True) if conf.CHECK_FOR_THIRD_PARTY(): conf.RECURSE('third_party/popt') else: if not conf.CHECK_POPT(): raise Utils.WafError('popt development packages have not been found\nIf third_party is installed, check that it is in the proper place.') else: conf.define('USING_SYSTEM_POPT', 1) conf.RECURSE('lib/util') conf.RECURSE('lib/talloc') conf.RECURSE('lib/tevent') conf.RECURSE('lib/tdb') if conf.env.standalone_ctdb or conf.CONFIG_GET('ENABLE_SELFTEST'): conf.RECURSE('lib/socket_wrapper') conf.env.SOCKET_WRAPPER_SO_PATH = conf.CONFIG_GET('LIBSOCKET_WRAPPER_SO_PATH') conf.CHECK_HEADERS('sched.h') conf.CHECK_HEADERS('procinfo.h') if sys.platform.startswith('aix') and not conf.CHECK_FUNCS('thread_setsched'): Logs.error('Need thread_setsched() on AIX') sys.exit(1) elif not conf.CHECK_FUNCS('sched_setscheduler'): Logs.error('Need sched_setscheduler()') sys.exit(1) conf.CHECK_FUNCS('mlockall') if not conf.CHECK_VARIABLE('ETIME', headers='errno.h'): conf.DEFINE('ETIME', 'ETIMEDOUT') if sys.platform.startswith('linux'): conf.SET_TARGET_TYPE('pcap', 'EMPTY') else: if not conf.CHECK_HEADERS('pcap.h'): Logs.error('Need libpcap') sys.exit(1) if not conf.CHECK_FUNCS_IN('pcap_open_live', 'pcap', headers='pcap.h'): Logs.error('Need libpcap') sys.exit(1) if not conf.CHECK_FUNCS_IN('backtrace backtrace_symbols', 'execinfo', checklibc=True, headers='execinfo.h'): Logs.error('backtrace support not available') have_pmda = False if Options.options.ctdb_pmda: pmda_support = True if not conf.CHECK_HEADERS('pcp/pmapi.h pcp/impl.h pcp/pmda.h', together=True): pmda_support = False if not conf.CHECK_FUNCS_IN('pmProgname', 'pcp'): pmda_support = False if not conf.CHECK_FUNCS_IN('pmdaDaemon', 'pcp_pmda'): pmda_support = False if pmda_support: have_pmda = True else: Logs.error("PMDA support not available") sys.exit(1) if have_pmda: Logs.info('Building with PMDA support') conf.define('HAVE_PMDA', 1) conf.env.CTDB_PMDADIR = os.path.join(conf.env.LOCALSTATEDIR, 'lib/pcp/pmdas/ctdb') have_infiniband = False if Options.options.ctdb_infiniband: ib_support = True if not conf.CHECK_HEADERS('infiniband/verbs.h rdma/rdma_cma.h'): ib_support = False if not conf.CHECK_FUNCS_IN('ibv_create_qp', 'ibverbs'): ib_support = False if not conf.CHECK_FUNCS_IN('rdma_connect', 'rdmacm'): ib_support = False if ib_support: have_infiniband = True else: Logs.error("Infiniband support not available") sys.exit(1) if have_infiniband: Logs.info('Building with Infiniband support') conf.define('HAVE_INFINIBAND', 1) conf.define('USE_INFINIBAND', 1) conf.env.CTDB_BINDIR = os.path.join(conf.env.EXEC_PREFIX, 'bin') conf.env.CTDB_ETCDIR = os.path.join(conf.env.SYSCONFDIR, 'ctdb') conf.env.CTDB_VARDIR = os.path.join(conf.env.LOCALSTATEDIR, 'lib/ctdb') conf.env.CTDB_RUNDIR = os.path.join(conf.env.LOCALSTATEDIR, 'run/ctdb') conf.env.CTDB_HELPER_BINDIR = os.path.join(conf.env.LIBEXECDIR, 'ctdb') if Options.options.ctdb_logdir: conf.env.CTDB_LOGDIR = Options.options.ctdb_logdir else: conf.env.CTDB_LOGDIR = os.path.join(conf.env.LOCALSTATEDIR, 'log') if Options.options.ctdb_sockpath: conf.env.CTDB_SOCKPATH = Options.options.ctdb_sockpath else: conf.env.CTDB_SOCKPATH = os.path.join(conf.env.CTDB_RUNDIR, 'ctdbd.socket') conf.define('CTDB_SOCKET', conf.env.CTDB_SOCKPATH) conf.ADD_CFLAGS('''-DCTDB_HELPER_BINDIR=\"%s\" -DLOGDIR=\"%s\" -DCTDB_ETCDIR=\"%s\" -DCTDB_VARDIR=\"%s\" -DCTDB_RUNDIR=\"%s\"''' % ( conf.env.CTDB_HELPER_BINDIR, conf.env.CTDB_LOGDIR, conf.env.CTDB_ETCDIR, conf.env.CTDB_VARDIR, conf.env.CTDB_RUNDIR)) conf.env.CTDB_TEST_DATADIR = os.path.join(conf.env.EXEC_PREFIX, 'share/ctdb-tests') conf.env.CTDB_TEST_LIBDIR = os.path.join(conf.env.LIBDIR, 'ctdb-tests') # Allow unified compilation and separate compilation of utilities # to find includes if not conf.env.standalone_ctdb: conf.ADD_EXTRA_INCLUDES('#include/public #ctdb/include #ctdb') else: if srcdir == '.': # Building from tarball conf.ADD_EXTRA_INCLUDES('#include') else: # Building standalone CTDB from within Samba tree conf.ADD_EXTRA_INCLUDES('#ctdb/include') conf.ADD_EXTRA_INCLUDES('#ctdb') conf.ADD_EXTRA_INCLUDES('#lib #lib/replace') conf.DEFINE('HAVE_CONFIG_H', 1, add_to_cflags=True) conf.DEFINE('SAMBA_UTIL_CORE_ONLY', 1, add_to_cflags=True) conf.SAMBA_CONFIG_H() if 'XSLTPROC_MANPAGES' in conf.env and conf.env['XSLTPROC_MANPAGES']: conf.env.ctdb_generate_manpages = True else: conf.env.ctdb_generate_manpages = False Logs.info("xsltproc unavailable, checking for pre-built manpages") conf.env.ctdb_prebuilt_manpages = [] for m in manpages: if os.path.exists(os.path.join("doc", m)): Logs.info(" %s: yes" % (m)) conf.env.ctdb_prebuilt_manpages.append(m) else: Logs.info(" %s: no" % (m)) def build(bld): if bld.env.standalone_ctdb: # enable building of public headers in the build tree bld.env.build_public_headers = 'include/public' version_h = samba_utils.os_path_relpath(os.path.join(Options.launch_dir, "version.h"), bld.curdir) if bld.env.standalone_ctdb: ctdb_mkversion = '../packaging/mkversion.sh' t = bld.SAMBA_GENERATOR('ctdb-version-header', target='include/ctdb_version.h', rule='%s ${TGT} %s' % (ctdb_mkversion, VERSION), dep_vars=['VERSION']) t.env.VERSION = VERSION t = bld.SAMBA_GENERATOR('ctdb-samba-version-header', target=version_h, rule='printf "#include \\"ctdb_version.h\\" \\n#define SAMBA_VERSION_STRING CTDB_VERSION_STRING\\n" > ${TGT}', dep_vars=['VERSION']) t.env.VERSION = VERSION else: t = bld.SAMBA_GENERATOR('ctdb-samba-version-header', target='include/ctdb_version.h', rule='printf "#include \\"%s\\" \\n#define CTDB_VERSION_STRING SAMBA_VERSION_STRING\\n" > ${TGT}' % version_h, dep_vars=['VERSION']) t.env.VERSION = VERSION bld.env.PKGCONFIGDIR = '${LIBDIR}/pkgconfig' bld.RECURSE('lib/replace') if bld.CHECK_FOR_THIRD_PARTY(): bld.RECURSE('third_party/popt') bld.RECURSE('lib/tdb_wrap') bld.RECURSE('lib/util') bld.RECURSE('lib/async_req') bld.RECURSE('lib/talloc') bld.RECURSE('lib/tevent') bld.RECURSE('lib/tdb') if bld.env.standalone_ctdb or bld.CONFIG_GET('SOCKET_WRAPPER'): bld.RECURSE('lib/socket_wrapper') if bld.env.standalone_ctdb: # If a combined build is implemented, CTDB will want to # build against samba-util rather than samba-util-core. # Similarly, other Samba subsystems expect samba-util. So, # for a standalone build, just define a fake samba-util # subsystem that pulls in samba-util-core. bld.SAMBA_SUBSYSTEM('samba-util', source='', deps='samba-util-core') bld.SAMBA_SUBSYSTEM('ctdb-tcp', source=bld.SUBDIR('tcp', 'tcp_connect.c tcp_init.c tcp_io.c'), includes='include', deps='replace tdb talloc tevent') ib_deps = '' if bld.env.HAVE_INFINIBAND: bld.SAMBA_SUBSYSTEM('ctdb-ib', source=bld.SUBDIR('ib', '''ibwrapper.c ibw_ctdb.c ibw_ctdb_init.c'''), includes='include', deps='replace talloc tevent tdb') ib_deps = ' ctdb-ib rdmacm ibverbs' if sys.platform.startswith('linux'): CTDB_SYSTEM_SRC = bld.SUBDIR('common', 'system_linux.c') elif sys.platform.startswith('aix'): CTDB_SYSTEM_SRC = bld.SUBDIR('common', 'system_aix.c') elif sys.platform.startswith('freebsd'): CTDB_SYSTEM_SRC = bld.SUBDIR('common', 'system_freebsd.c') elif sys.platform.startswith('gnukfreebsd'): CTDB_SYSTEM_SRC = bld.SUBDIR('common', 'system_kfreebsd.c') elif sys.platform == 'gnu': CTDB_SYSTEM_SRC = bld.SUBDIR('common', 'system_gnu.c') else: Logs.error("Platform %s not supported" % sys.platform) bld.SAMBA_SUBSYSTEM('ctdb-system', source=bld.SUBDIR('common', 'system_common.c system_util.c') + CTDB_SYSTEM_SRC, includes='include', deps='replace talloc tevent tdb pcap samba-util') bld.SAMBA_SUBSYSTEM('ctdb-common', source=bld.SUBDIR('common', '''ctdb_io.c ctdb_util.c ctdb_ltdb.c cmdline.c'''), includes='include', deps='replace popt talloc tevent tdb popt ctdb-system') bld.SAMBA_SUBSYSTEM('ctdb-util', source=bld.SUBDIR('common', '''db_hash.c srvid.c reqid.c pkt_read.c pkt_write.c comm.c logging.c rb_tree.c'''), deps='replace talloc tevent tdb tevent-util') bld.SAMBA_SUBSYSTEM('ctdb-protocol', source=bld.SUBDIR('protocol', '''protocol_header.c protocol_packet.c protocol_types.c protocol_call.c protocol_message.c protocol_control.c protocol_client.c protocol_debug.c protocol_util.c'''), includes='include', deps='replace talloc tdb') bld.SAMBA_SUBSYSTEM('ctdb-client', source=bld.SUBDIR('client', 'ctdb_client.c'), includes='include', deps='''replace popt talloc tevent tdb samba-util tdb-wrap ctdb-util''') bld.SAMBA_SUBSYSTEM('ctdb-client2', source=bld.SUBDIR('client', '''client_connect.c client_call.c client_message.c client_control.c client_message_sync.c client_control_sync.c client_db.c client_util.c '''), includes='include', deps='replace talloc tevent tdb tdb-wrap') bld.SAMBA_SUBSYSTEM('ctdb-ipalloc', source=bld.SUBDIR('server', '''ipalloc_deterministic.c ipalloc_nondeterministic.c ipalloc_lcp2.c ipalloc_common.c ipalloc.c '''), includes='include', deps='ctdb-protocol replace talloc tevent') bld.SAMBA_SUBSYSTEM('ctdb-server', source='server/ctdbd.c ' + bld.SUBDIR('server', '''ctdb_daemon.c ctdb_recoverd.c ctdb_recover.c ctdb_freeze.c ctdb_tunables.c ctdb_monitor.c ctdb_server.c ctdb_control.c ctdb_call.c ctdb_ltdb_server.c ctdb_traverse.c eventscript.c ctdb_takeover.c ctdb_persistent.c ctdb_keepalive.c ctdb_cluster_mutex.c ctdb_logging.c ctdb_logging_syslog.c ctdb_logging_file.c ctdb_uptime.c ctdb_vacuum.c ctdb_banning.c ctdb_statistics.c ctdb_update_record.c ctdb_lock.c ctdb_fork.c'''), includes='include', deps='ctdb-ipalloc replace popt talloc tevent tdb talloc_report') bld.SAMBA_BINARY('ctdbd', source='', deps='''ctdb-server ctdb-client ctdb-common ctdb-system ctdb-tcp ctdb-util''' + ib_deps, install_path='${SBINDIR}', manpages='ctdbd.1') bld.SAMBA_BINARY('ctdb', source='tools/ctdb.c', deps='ctdb-client ctdb-common ctdb-system ctdb-util', includes='include', install_path='${BINDIR}', manpages='ctdb.1') bld.SAMBA_BINARY('ctdb_killtcp', source='tools/ctdb_killtcp.c', deps='''ctdb-protocol ctdb-util ctdb-system samba-util replace''', install_path='${CTDB_HELPER_BINDIR}') bld.SAMBA_BINARY('ltdbtool', source='tools/ltdbtool.c', includes='include', deps='tdb', install_path='${BINDIR}', manpages='ltdbtool.1') bld.SAMBA_BINARY('ctdb_lock_helper', source='server/ctdb_lock_helper.c', deps='samba-util ctdb-system talloc tdb', includes='include', install_path='${CTDB_HELPER_BINDIR}') bld.SAMBA_BINARY('ctdb_event_helper', source='server/ctdb_event_helper.c', includes='include', deps='samba-util ctdb-system replace tdb', install_path='${CTDB_HELPER_BINDIR}') bld.SAMBA_BINARY('ctdb_recovery_helper', source='server/ctdb_recovery_helper.c', deps='''ctdb-client2 ctdb-protocol ctdb-util samba-util replace tdb''', install_path='${CTDB_HELPER_BINDIR}') bld.SAMBA_BINARY('ctdb_mutex_fcntl_helper', source='server/ctdb_mutex_fcntl_helper.c', deps='ctdb-system', includes='include', install_path='${CTDB_HELPER_BINDIR}') bld.SAMBA_GENERATOR('ctdb-smnotify-h', source='utils/smnotify/smnotify.x', target='utils/smnotify/smnotify.h', rule='rpcgen -h ${SRC} > ${TGT}') xdr_buf_hack = 'sed -e "s@^\([ \t]*register int32_t \*buf\);@\\1 = buf;@"' bld.SAMBA_GENERATOR('ctdb-smnotify-x', source='utils/smnotify/smnotify.x', target='utils/smnotify/gen_xdr.c', rule='rpcgen -c ${SRC} | ' + xdr_buf_hack + ' > ${TGT}') bld.SAMBA_GENERATOR('ctdb-smnotify-c', source='utils/smnotify/smnotify.x', target='utils/smnotify/gen_smnotify.c', rule='rpcgen -l ${SRC} > ${TGT}') bld.SAMBA_BINARY('smnotify', source=bld.SUBDIR('utils/smnotify', 'smnotify.c gen_smnotify.c gen_xdr.c'), deps='ctdb-smnotify-h ctdb-smnotify-c ctdb-smnotify-x popt', includes='utils utils/smnotify', install_path='${CTDB_HELPER_BINDIR}') bld.SAMBA_BINARY('ping_pong', source='utils/ping_pong/ping_pong.c', deps='', install_path='${BINDIR}', manpages='ping_pong.1') if bld.env.HAVE_PMDA: bld.SAMBA_BINARY('pmdactdb', source='utils/pmda/pmda_ctdb.c', includes='include', deps='ctdb-client ctdb-common pcp_pmda pcp', install_path='${CTDB_PMDADIR}') bld.INSTALL_FILES('${CTDB_PMDADIR}', 'utils/pmda/Install', destname='Install') bld.INSTALL_FILES('${CTDB_PMDADIR}', 'utils/pmda/Remove', destname='Remove') bld.INSTALL_FILES('${CTDB_PMDADIR}', 'utils/pmda/pmns', destname='pmns') bld.INSTALL_FILES('${CTDB_PMDADIR}', 'utils/pmda/domain.h', destname='domain.h') bld.INSTALL_FILES('${CTDB_PMDADIR}', 'utils/pmda/help', destname='help') bld.INSTALL_FILES('${CTDB_PMDADIR}', 'utils/pmda/README', destname='README') sed_expr1 = 's|/usr/local/var/lib/ctdb|%s|g' % (bld.env.CTDB_VARDIR) sed_expr2 = 's|/usr/local/etc/ctdb|%s|g' % (bld.env.CTDB_ETCDIR) sed_expr3 = 's|/usr/local/var/log|%s|g' % (bld.env.CTDB_LOGDIR) sed_expr4 = 's|/usr/local/var/run/ctdb|%s|g' % (bld.env.CTDB_RUNDIR) sed_expr5 = 's|/usr/local/sbin|%s|g' % (bld.env.SBINDIR) sed_expr6 = 's|/usr/local/libexec/ctdb|%s|g' % (bld.env.CTDB_HELPER_BINDIR) sed_expr7 = 's|/usr/local/bin|%s|g' % (bld.env.BINDIR) sed_cmdline = '-e "%s" -e "%s" -e "%s" -e "%s" -e "%s" -e "%s" -e "%s"' % \ (sed_expr1, sed_expr2, sed_expr3, sed_expr4, sed_expr5, sed_expr6, sed_expr7) for f in manpages: x = '%s.xml' % (f) bld.SAMBA_GENERATOR(x, source=os.path.join('doc', x), target=x, rule='sed %s ${SRC} > ${TGT}' % (sed_cmdline)) if bld.env.ctdb_generate_manpages: bld.MANPAGES('''onnode.1 ctdbd_wrapper.1 ctdbd.conf.5 ctdb.7 ctdb-statistics.7 ctdb-tunables.7''', True) else: for m in bld.env.ctdb_prebuilt_manpages: bld.SAMBA_GENERATOR(m, source=os.path.join("doc", m), target=m, rule='sed %s ${SRC} > ${TGT}' % (sed_cmdline)) bld.INSTALL_FILES('${MANDIR}/man%s' % m[-1], m) bld.SAMBA_GENERATOR('ctdb-onnode', source='tools/onnode', target='onnode', rule='sed %s ${SRC} > ${TGT}' % (sed_cmdline)) bld.INSTALL_FILES('${BINDIR}', 'onnode', destname='onnode', chmod=0755) bld.SAMBA_GENERATOR('ctdb-diagnostics', source='tools/ctdb_diagnostics', target='ctdb_diagnostics', rule='sed %s ${SRC} > ${TGT}' % (sed_cmdline)) bld.INSTALL_FILES('${BINDIR}', 'ctdb_diagnostics', destname='ctdb_diagnostics', chmod=0755) bld.SAMBA_GENERATOR('ctdb-natgw', source='tools/ctdb_natgw', target='ctdb_natgw', rule='sed %s ${SRC} > ${TGT}' % (sed_cmdline)) bld.INSTALL_FILES('${CTDB_HELPER_BINDIR}', 'ctdb_natgw', destname='ctdb_natgw', chmod=0755) bld.SAMBA_GENERATOR('ctdb-lvs', source='tools/ctdb_lvs', target='ctdb_lvs', rule='sed %s ${SRC} > ${TGT}' % (sed_cmdline)) bld.INSTALL_FILES('${CTDB_HELPER_BINDIR}', 'ctdb_lvs', destname='ctdb_lvs', chmod=0755) bld.SAMBA_GENERATOR('ctdbd-wrapper', source='config/ctdbd_wrapper', target='ctdbd_wrapper', rule='sed %s ${SRC} > ${TGT}' % (sed_cmdline)) bld.INSTALL_FILES('${SBINDIR}', 'ctdbd_wrapper', destname='ctdbd_wrapper', chmod=0755) def SUBDIR_MODE_callback(arg, dirname, fnames): for f in fnames: fl = os.path.join(dirname, f) if os.path.isdir(fl) or os.path.islink(fl): continue mode = os.lstat(fl).st_mode & 0777 if arg['trim_path']: fl = samba_utils.os_path_relpath(fl, arg['trim_path']) arg['file_list'].append([fl, mode]) def SUBDIR_MODE(path, trim_path=None): pd = {'trim_path': trim_path, 'file_list': []} os.path.walk(path, SUBDIR_MODE_callback, pd) return pd['file_list'] etc_subdirs = [ 'events.d', 'nfs-checks.d' ] if bld.env.standalone_ctdb: configdir = 'config' else: configdir = 'ctdb/config' for t in etc_subdirs: files = SUBDIR_MODE('%s/%s' % (configdir, t), trim_path=configdir) for fmode in files: bld.INSTALL_FILES(bld.env.CTDB_ETCDIR, 'config/%s' % fmode[0], destname=fmode[0], chmod=fmode[1]) bld.SAMBA_GENERATOR('ctdb-functions', source='config/functions', target='functions', rule='sed %s ${SRC} > ${TGT}' % (sed_cmdline)) bld.INSTALL_FILES(bld.env.CTDB_ETCDIR, 'functions', destname='functions') etc_scripts = [ 'ctdb-crash-cleanup.sh', 'debug-hung-script.sh', 'debug_locks.sh', 'gcore_trace.sh', 'nfs-linux-kernel-callout', 'notify.sh', 'statd-callout' ] for t in etc_scripts: bld.INSTALL_FILES(bld.env.CTDB_ETCDIR, 'config/%s' % t, destname=t, chmod=0755) bld.SAMBA_GENERATOR('ctdb-sudoers', source='config/ctdb.sudoers', target='ctdb.sudoers', rule='sed %s ${SRC} > ${TGT}' % (sed_cmdline)) bld.INSTALL_FILES('${SYSCONFDIR}/sudoers.d', 'ctdb.sudoers', destname='ctdb') bld.INSTALL_FILES('${CTDB_ETCDIR}/notify.d', 'config/notify.d.README', destname='README') bld.install_dir(bld.env.CTDB_LOGDIR) bld.install_dir(bld.env.CTDB_RUNDIR) bld.install_dir(bld.env.CTDB_VARDIR) # Unit tests ctdb_unit_tests = [ 'db_hash_test', 'srvid_test', 'pkt_read_test', 'pkt_write_test', 'comm_test', 'comm_server_test', 'comm_client_test', 'protocol_types_test', 'protocol_client_test', ] for target in ctdb_unit_tests: src = 'tests/src/' + target + '.c' bld.SAMBA_BINARY(target, source=src, deps='''talloc tevent tdb tevent-util LIBASYNC_REQ samba-util''', install_path='${CTDB_TEST_LIBDIR}') bld.SAMBA_BINARY('reqid_test', source='tests/src/reqid_test.c', deps='samba-util', install_path='${CTDB_TEST_LIBDIR}') bld.SAMBA_BINARY('ctdb_packet_parse', source='tests/src/ctdb_packet_parse.c', deps='talloc tevent tdb ctdb-protocol', install_path='${CTDB_TEST_LIBDIR}') # Test binaries ctdb_tests = [ 'rb_test', 'ctdb_bench', 'ctdb_fetch', 'ctdb_fetch_one', 'ctdb_fetch_readonly_once', 'ctdb_fetch_readonly_loop', 'ctdb_trackingdb_test', 'ctdb_update_record', 'ctdb_update_record_persistent', 'ctdb_store', 'ctdb_traverse', 'ctdb_randrec', 'ctdb_persistent', 'ctdb_porting_tests', 'ctdb_transaction', 'ctdb_lock_tdb' ] for target in ctdb_tests: src = 'tests/src/' + target + '.c' bld.SAMBA_BINARY(target, source=src, includes='include', deps='ctdb-client ctdb-common ctdb-util', install_path='${CTDB_TEST_LIBDIR}') bld.SAMBA_SUBSYSTEM('ctdb-tests-common', source=bld.SUBDIR('tests/src', 'cluster_wait.c test_options.c'), includes='include', deps='replace popt talloc tevent tdb') ctdb_tests = [ 'g_lock_loop' ] for target in ctdb_tests: src = 'tests/src/' + target + '.c' bld.SAMBA_BINARY(target, source=src, includes='include', deps='''ctdb-client2 ctdb-protocol ctdb-util samba-util ctdb-tests-common''', install_path='${CTDB_TEST_LIBDIR}') bld.SAMBA_BINARY('ctdb_takeover_tests', source='tests/src/ctdb_takeover_tests.c', deps='''replace popt tdb tevent talloc ctdb-system samba-util tdb-wrap talloc_report ctdb-ipalloc ctdb-protocol ctdb-util''', includes='include', install_path='${CTDB_TEST_LIBDIR}') bld.SAMBA_BINARY('fake_ctdbd', source='tests/src/fake_ctdbd.c', deps='''ctdb-util ctdb-protocol ctdb-system samba-util tevent-util LIBASYNC_REQ popt''', install_path='${CTDB_TEST_LIBDIR}') if bld.env.HAVE_INFINIBAND: bld.SAMBA_BINARY('ibwrapper_test', source='ib/ibwrapper_test.c', includes='include', deps='replace talloc ctdb-client ctdb-common' + ib_deps, install_path='${CTDB_TEST_LIBDIR}') test_subdirs = [ 'complex', 'cunit', 'events.d', 'eventscripts', 'onnode', 'shellcheck', 'simple', 'takeover', 'tool' ] for t in test_subdirs: files = SUBDIR_MODE('tests/%s' % t, trim_path='tests') for fmode in files: bld.INSTALL_FILES(bld.env.CTDB_TEST_DATADIR, 'tests/%s' % fmode[0], destname=fmode[0], chmod=fmode[1]) # Install tests/scripts directory without test_wrap test_scripts = [ 'common.sh', 'integration.bash', 'unit.sh' ] for t in test_scripts: bld.INSTALL_FILES(bld.env.CTDB_TEST_DATADIR, os.path.join('tests/scripts', t), destname=os.path.join('scripts', t)) sed_expr = 's@^TEST_SCRIPTS_DIR=.*@&\\nexport TEST_BIN_DIR=\"%s\"@' % ( bld.env.CTDB_TEST_LIBDIR) bld.SAMBA_GENERATOR('ctdb-test-wrap', source='tests/scripts/test_wrap', target='test_wrap', rule='sed -e "%s" ${SRC} > ${TGT}' % sed_expr) bld.INSTALL_FILES(bld.env.CTDB_TEST_DATADIR+"/scripts", 'test_wrap', destname='test_wrap', chmod=0755) bld.SAMBA_GENERATOR('ctdb-test-script-install-paths', source='tests/scripts/script_install_paths.sh', target='script_install_paths.sh', rule='sed %s ${SRC} > ${TGT}' % (sed_cmdline)) bld.INSTALL_FILES(bld.env.CTDB_TEST_DATADIR+"/scripts", 'script_install_paths.sh', destname='script_install_paths.sh', chmod=0644) sed_expr1 = 's@^test_dir=.*@test_dir=%s\\nexport TEST_BIN_DIR=\"%s\"@' % ( bld.env.CTDB_TEST_DATADIR, bld.env.CTDB_TEST_LIBDIR) sed_expr2 = 's@^\(export CTDB_TESTS_ARE_INSTALLED\)=false@\\1=true@' bld.SAMBA_GENERATOR('ctdb-test-runner', source='tests/run_tests.sh', target='ctdb_run_tests.sh', rule='sed -e "%s" -e "%s" ${SRC} > ${TGT}' % ( sed_expr1, sed_expr2)) bld.INSTALL_FILES('${BINDIR}', 'ctdb_run_tests.sh', destname='ctdb_run_tests', chmod=0755) bld.symlink_as(os.path.join(bld.env.BINDIR, 'ctdb_run_cluster_tests'), 'ctdb_run_tests') test_eventscript_links = [ 'events.d', 'functions', 'nfs-checks.d', 'nfs-linux-kernel-callout', 'statd-callout' ] test_link_dir = os.path.join(bld.env.CTDB_TEST_DATADIR, 'eventscripts/etc-ctdb') for t in test_eventscript_links: bld.symlink_as(os.path.join(test_link_dir, t), os.path.join(bld.env.CTDB_ETCDIR, t)) # Tests that use onnode need to overwrite link to in-tree # functions file when installed bld.symlink_as(os.path.join(bld.env.CTDB_TEST_DATADIR, 'onnode/functions'), os.path.join(bld.env.CTDB_ETCDIR, 'functions')) bld.symlink_as(os.path.join(bld.env.CTDB_TEST_DATADIR, 'simple/functions'), os.path.join(bld.env.CTDB_ETCDIR, 'functions')) # Need a link to nodes file because $CTDB_BASE is overridden bld.symlink_as(os.path.join(bld.env.CTDB_TEST_DATADIR, 'simple/nodes'), os.path.join(bld.env.CTDB_ETCDIR, 'nodes')) def testonly(ctx): cmd = 'tests/run_tests.sh -V tests/var' ret = samba_utils.RUN_COMMAND(cmd) if ret != 0: print('tests exited with exit status %d' % ret) sys.exit(ret) def test(ctx): import Scripting Scripting.commands.append('build') Scripting.commands.append('testonly') def autotest(ctx): env = samba_utils.LOAD_ENVIRONMENT() ld = 'LD_PRELOAD=%s' % env.SOCKET_WRAPPER_SO_PATH cmd = '%s tests/run_tests.sh -e -S -C' % ld ret = samba_utils.RUN_COMMAND(cmd) if ret != 0: print('autotest exited with exit status %d' % ret) sys.exit(ret) def show_version(ctx): print VERSION def dist(): samba_dist.DIST_FILES('VERSION:VERSION', extend=True) t = 'include/ctdb_version.h' cmd = 'packaging/mkversion.sh %s %s' % (t, VERSION) ret = samba_utils.RUN_COMMAND(cmd) if ret != 0: print('Command "%s" failed with exit status %d' % (cmd, ret)) sys.exit(ret) samba_dist.DIST_FILES('ctdb/%s:%s' % (t, t), extend=True) t = 'ctdb.spec' sed_expr1 = 's/@VERSION@/%s/g' % VERSION sed_expr2 = 's/@RELEASE@/%s/g' % '1' cmd = 'sed -e "%s" -e "%s" packaging/RPM/ctdb.spec.in > %s' % ( sed_expr1, sed_expr2, t) ret = samba_utils.RUN_COMMAND(cmd) if ret != 0: print('Command "%s" failed with exit status %d' % (cmd, ret)) sys.exit(ret) samba_dist.DIST_FILES('ctdb/%s:%s' % (t, t), extend=True) cmd = 'make -C doc' ret = samba_utils.RUN_COMMAND(cmd) if ret != 0: print('Command "%s" failed with exit status %d' % (cmd, ret)) sys.exit(ret) for t in manpages: samba_dist.DIST_FILES('ctdb/doc/%s:doc/%s' % (t, t), extend=True) samba_dist.DIST_FILES('ctdb/doc/%s.html:doc/%s.html' % (t, t), extend=True) samba_dist.dist() def rpmonly(ctx): opts = os.getenv('RPM_OPTIONS') or '' cmd = 'rpmbuild -ta --clean --rmsource %s ctdb-%s.tar.gz' % (opts, VERSION) ret = samba_utils.RUN_COMMAND(cmd) if ret != 0: print('rpmbuild exited with exit status %d' % ret) sys.exit(ret) def rpm(ctx): import Scripting Scripting.commands.append('dist') Scripting.commands.append('rpmonly') def ctags(ctx): "build 'tags' file using ctags" import Utils source_root = os.path.dirname(Utils.g_module.root_path) cmd = 'ctags $(find %s -name "*.[ch]")' % source_root print("Running: %s" % cmd) ret = samba_utils.RUN_COMMAND(cmd) if ret != 0: print('ctags failed with exit status %d' % ret) sys.exit(ret)