diff options
Diffstat (limited to '')
-rw-r--r-- | ctdb/wscript | 1329 |
1 files changed, 1329 insertions, 0 deletions
diff --git a/ctdb/wscript b/ctdb/wscript new file mode 100644 index 0000000..a7b0454 --- /dev/null +++ b/ctdb/wscript @@ -0,0 +1,1329 @@ +#!/usr/bin/env python + +APPNAME = 'ctdb' + +import sys, os + +# find the buildtools directory +top = '.' +while not os.path.exists(top+'/buildtools') and len(top.split('/')) < 5: + top = top + '/..' +sys.path.insert(0, top + '/buildtools/wafsamba') + +out = 'bin' + +from waflib import Options, Logs, Errors, Context +import wafsamba +from wafsamba import samba_dist, samba_utils +from samba_utils import MODE_644, MODE_744, MODE_755, MODE_777 + +if os.path.isfile('./VERSION'): + vdir = '.' +elif os.path.isfile('../VERSION'): + vdir = '..' +else: + Logs.error("VERSION file not found") + +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 + third_party/socket_wrapper:third_party/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 + lib/pthreadpool:lib/pthreadpool + lib/messaging:lib/messaging + buildtools:buildtools third_party/waf:third_party/waf''') + +manpages_binary = [ + 'ctdb.1', + 'ctdbd.1', + 'ltdbtool.1', + 'ping_pong.1' +] + +manpages_misc = [ + 'ctdb_diagnostics.1', + 'onnode.1', + 'ctdb.conf.5', + 'ctdb-script.options.5', + 'ctdb.sysconfig.5', + 'ctdb.7', + 'ctdb-statistics.7', + 'ctdb-tunables.7', +] + +manpages_etcd = [ + 'ctdb-etcd.7', +] + +manpages_ceph = [ + 'ctdb_mutex_ceph_rados_helper.7', +] + +VERSION = '' + +def get_version(): + import samba_version + env = samba_utils.LOAD_ENVIRONMENT() + + return samba_version.samba_version_file('%s/VERSION' % vdir, vdir, env) + +def get_version_string(): + if Context.g_module.VERSION: + return Context.g_module.VERSION + version = get_version() + Context.g_module.VERSION = version.STRING.replace('-', '.') + return Context.g_module.VERSION + +def 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('--enable-etcd-reclock', + help=("Enable etcd recovery lock helper (default=no)"), + action="store_true", dest='ctdb_etcd_reclock', default=False) + opt.add_option('--enable-pcap', + help=("Use pcap for packet capture (default=no)"), + action="store_true", dest='ctdb_pcap', default=False) + + opt.add_option('--with-libcephfs', + help=("Directory under which libcephfs is installed"), + action="store", dest='libcephfs_dir', default=None) + opt.add_option('--enable-ceph-reclock', + help=("Enable Ceph CTDB recovery lock helper (default=no)"), + action="store_true", dest='ctdb_ceph_reclock', 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') + + conf.CHECK_HEADERS(headers='''sys/socket.h + netinet/in.h + netinet/if_ether.h + netinet/ip.h + netinet/ip6.h + netinet/icmp6.h''', + together=True) + + conf.CHECK_CODE('int s = socket(AF_PACKET, SOCK_RAW, 0);', + define='HAVE_AF_PACKET', + headers='sys/socket.h linux/if_packet.h') + + conf.CHECK_CODE('struct sockaddr_ll sall; sall.sll_family = AF_PACKET;', + define='HAVE_PACKETSOCKET', + headers='sys/socket.h linux/if_packet.h') + + conf.CHECK_CODE('''pthread_mutex_t m; + int pid = 0; + m.__data.__owner = pid; + ''', + 'HAVE_PTHREAD_INTERNAL_MUTEX_OWNER', + headers='pthread.h', + msg='Checking for internal POSIX mutex owner field') + if not conf.env.HAVE_PTHREAD_INTERNAL_MUTEX_OWNER: + # This is unsupported - please see note in debug_locks.sh + Logs.info('Building without unsupported mutex debugging hack') + + if conf.env.standalone_ctdb: + conf.SAMBA_CHECK_PERL(mandatory=True) + + # This is just for consistency and to check the version for the + # build system, see Options.options.disable_python = True above + conf.SAMBA_CHECK_PYTHON() + conf.SAMBA_CHECK_PYTHON_HEADERS() + + # We just want gnutls_rnd for rand subsystem + conf.CHECK_FUNCS_IN('gnutls_rnd', 'gnutls') + + + if conf.CHECK_FOR_THIRD_PARTY(): + conf.RECURSE('third_party/popt') + if conf.env.standalone_ctdb or conf.CONFIG_GET('ENABLE_SELFTEST'): + conf.RECURSE('third_party/socket_wrapper') + conf.env.SOCKET_WRAPPER_SO_PATH = conf.CONFIG_GET('LIBSOCKET_WRAPPER_SO_PATH') + else: + if not conf.CHECK_POPT(): + raise Errors.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.env.SOCKET_WRAPPER_SO_PATH = '' + + + if conf.env.standalone_ctdb or conf.CONFIG_GET('ENABLE_SELFTEST'): + if not conf.CHECK_SOCKET_WRAPPER(): + raise Errors.WafError('socket_wrapper package has not been found.\nIf third_party is installed, check that it is in the proper place.') + else: + conf.define('USING_SYSTEM_SOCKET_WRAPPER', 1) + conf.env.SOCKET_WRAPPER_SO_PATH = conf.CONFIG_GET('LIBSOCKET_WRAPPER_SO_PATH') + + conf.RECURSE('lib/util') + + conf.RECURSE('lib/talloc') + conf.RECURSE('lib/tevent') + conf.RECURSE('lib/tdb') + + 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') + conf.CHECK_FUNCS('getrusage', headers="sys/time.h sys/resource.h") + + if not conf.CHECK_VARIABLE('ETIME', headers='errno.h'): + conf.DEFINE('ETIME', 'ETIMEDOUT') + + if Options.options.ctdb_pcap or not sys.platform.startswith('linux'): + conf.DEFINE('ENABLE_PCAP', 1) + if not conf.env.ENABLE_PCAP: + conf.SET_TARGET_TYPE('pcap', 'EMPTY') + else: + conf.find_program('pcap-config', var='PCAP_CONFIG') + if conf.env.PCAP_CONFIG: + conf.CHECK_CFG(path=conf.env.PCAP_CONFIG, + args="--cflags --libs", + package="", + uselib_store="PCAP") + 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) + conf.CHECK_FUNCS_IN('pcap_set_immediate_mode', 'pcap', headers='pcap.h') + + 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: + conf.CHECK_TYPE_IN('__pmID_int', 'pcp/pmapi.h pcp/impl.h') + 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) + + have_etcd_reclock = False + if Options.options.ctdb_etcd_reclock: + try: + conf.check_python_module('etcd') + have_etcd_reclock = True + except: + Logs.error('etcd support not available') + sys.exit(1) + if have_etcd_reclock: + Logs.info('Building with etcd support') + conf.env.etcd_reclock = have_etcd_reclock + + if Options.options.libcephfs_dir: + Logs.error('''--with-libcephfs no longer supported, please use compiler + flags instead, e.g. GCC LIBRARY_PATH and C_INCLUDE_PATH''') + sys.exit(1) + + if Options.options.ctdb_ceph_reclock: + if (conf.CHECK_HEADERS('rados/librados.h', False, False, 'rados') and + conf.CHECK_LIB('rados', shlib=True)): + Logs.info('Building with Ceph librados recovery lock support') + conf.define('HAVE_LIBRADOS', 1) + else: + Logs.error("Missing librados for Ceph recovery lock support") + sys.exit(1) + + conf.env.CTDB_BINDIR = os.path.join(conf.env.EXEC_PREFIX, 'bin') + conf.env.CTDB_DATADIR = os.path.join(conf.env.EXEC_PREFIX, 'share/ctdb') + 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_DATADIR=\"%s\" + -DCTDB_ETCDIR=\"%s\" + -DCTDB_VARDIR=\"%s\" + -DCTDB_RUNDIR=\"%s\"''' % ( + conf.env.CTDB_HELPER_BINDIR, + conf.env.CTDB_LOGDIR, + conf.env.CTDB_DATADIR, + conf.env.CTDB_ETCDIR, + conf.env.CTDB_VARDIR, + conf.env.CTDB_RUNDIR)) + + conf.env.CTDB_TEST_DATADIR = os.path.join(conf.env.CTDB_DATADIR, 'tests') + conf.env.CTDB_TEST_LIBEXECDIR = os.path.join(conf.env.LIBEXECDIR, '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 Context.g_module.top == '.': + # 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 = [] + manpages = manpages_binary + manpages_misc + if conf.env.etcd_reclock: + manpages += manpages_etcd + if conf.env.HAVE_LIBRADOS: + manpages += manpages_ceph + 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' + + if bld.env.standalone_ctdb: + bld.SAMBA_MKVERSION('version.h', '%s/VERSION' % vdir) + + bld.env.PKGCONFIGDIR = '${LIBDIR}/pkgconfig' + + bld.RECURSE('lib/replace') + if bld.CHECK_FOR_THIRD_PARTY(): + bld.RECURSE('third_party/popt') + if bld.env.standalone_ctdb or bld.CONFIG_GET('SOCKET_WRAPPER'): + bld.RECURSE('third_party/socket_wrapper') + + bld.RECURSE('lib/tdb_wrap') + bld.RECURSE('lib/util') + bld.RECURSE('lib/async_req') + bld.RECURSE('lib/pthreadpool') + bld.RECURSE('lib/messaging') + + bld.RECURSE('lib/talloc') + bld.RECURSE('lib/tevent') + bld.RECURSE('lib/tdb') + + 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' + + bld.SAMBA_SUBSYSTEM('ctdb-system', + source=bld.SUBDIR('common', + 'system_socket.c system.c'), + 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 + sock_io.c'''), + includes='include', + deps='''replace popt talloc tevent tdb popt ctdb-system + ctdb-protocol-util''') + + bld.SAMBA_SUBSYSTEM('ctdb-util', + source=bld.SUBDIR('common', + '''cmdline.c + comm.c + conf.c + db_hash.c + event_script.c + hash_count.c + line.c + logging.c + path.c + pidfile.c + pkt_read.c + pkt_write.c + rb_tree.c + reqid.c + run_event.c + run_proc.c + sock_client.c + srvid.c + tmon.c + tunable.c + '''), + deps='''samba-util + LIBASYNC_REQ + sys_rw + tevent-util + replace + talloc + tevent + tdb + popt + ''') + + bld.SAMBA_SUBSYSTEM('ctdb-logging-conf', + source='common/logging_conf.c', + deps='ctdb-util talloc') + + bld.SAMBA_SUBSYSTEM('ctdb-protocol-basic', + source=bld.SUBDIR('protocol', 'protocol_basic.c'), + deps='talloc tdb') + + 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_keepalive.c + protocol_tunnel.c + protocol_client.c + protocol_debug.c + protocol_sock.c'''), + deps='ctdb-protocol-basic replace talloc tdb') + + bld.SAMBA_SUBSYSTEM('ctdb-protocol-util', + source='protocol/protocol_util.c', + deps='ctdb-util replace talloc tdb') + + bld.SAMBA_SUBSYSTEM('ctdb-client', + 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 + client_tunnel.c + '''), + deps='''ctdb-protocol + ctdb-util + samba-util + replace + talloc + tevent + tdb + tdb-wrap + ''') + + bld.SAMBA_SUBSYSTEM('ctdb-server-util', + source=bld.SUBDIR('common', + '''sock_daemon.c'''), + deps='''samba-util ctdb-util ctdb-system tevent-util + LIBASYNC_REQ replace talloc tevent''') + + 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-util replace talloc tevent') + + bld.SAMBA_BINARY('ctdb-path', + source='common/path_tool.c', + cflags='-DCTDB_PATH_TOOL', + deps='''ctdb-util samba-util talloc replace popt''', + install_path='${CTDB_HELPER_BINDIR}') + + bld.SAMBA_SUBSYSTEM('ctdb-cluster-conf', + source='cluster/cluster_conf.c', + deps='ctdb-util') + + bld.SAMBA_SUBSYSTEM('ctdb-database-conf', + source='database/database_conf.c', + deps='ctdb-util') + + bld.SAMBA_SUBSYSTEM('ctdb-event-conf', + source='event/event_conf.c', + deps='ctdb-util') + + bld.SAMBA_SUBSYSTEM('ctdb-failover-conf', + source='failover/failover_conf.c', + deps='ctdb-util') + + bld.SAMBA_SUBSYSTEM('ctdb-legacy-conf', + source='server/legacy_conf.c', + deps='ctdb-util') + + bld.SAMBA_BINARY('ctdb-config', + source='common/conf_tool.c', + cflags='-DCTDB_CONF_TOOL', + deps='''ctdb-logging-conf + ctdb-event-conf + ctdb-cluster-conf + ctdb-database-conf + ctdb-failover-conf + ctdb-legacy-conf + ctdb-util samba-util talloc replace popt''', + install_path='${CTDB_HELPER_BINDIR}') + + bld.SAMBA_SUBSYSTEM('ctdb-event-protocol', + source=bld.SUBDIR('event', + '''event_protocol.c + event_protocol_util.c + '''), + deps='ctdb-protocol-basic') + + bld.SAMBA_LIBRARY('ctdb-event-client', + source='event/event_client.c', + deps='ctdb-event-protocol ctdb-util tevent talloc', + private_library=True) + + bld.SAMBA_BINARY('ctdb-eventd', + source=bld.SUBDIR('event', + '''event_cmd.c + event_config.c + event_context.c + event_daemon.c + event_request.c + '''), + deps='''ctdb-event-protocol + ctdb-event-conf ctdb-logging-conf + ctdb-server-util samba-util ctdb-util + talloc tevent replace popt''', + install_path='${CTDB_HELPER_BINDIR}') + + bld.SAMBA_BINARY('ctdb-event', + source='event/event_tool.c', + cflags='-DCTDB_EVENT_TOOL', + deps='''ctdb-event-client ctdb-event-protocol + ctdb-util samba-util talloc replace''', + install_path='${CTDB_HELPER_BINDIR}') + + bld.SAMBA_BINARY('ctdbd', + 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_uptime.c + ctdb_vacuum.c ctdb_banning.c + ctdb_statistics.c + ctdb_update_record.c + ctdb_lock.c ctdb_fork.c + ctdb_tunnel.c ctdb_client.c + ctdb_config.c + '''), + includes='include', + deps='''ctdb-common ctdb-system ctdb-protocol + ctdb-tcp ctdb-util replace sys_rw popt + ctdb-logging-conf + ctdb-cluster-conf + ctdb-database-conf + ctdb-event-conf + ctdb-failover-conf + ctdb-legacy-conf + ctdb-event-protocol + talloc tevent tdb-wrap tdb talloc_report''' + + ib_deps, + install_path='${SBINDIR}', + manpages='ctdbd.1') + + bld.SAMBA_BINARY('ctdb', + source='tools/ctdb.c', + deps='''ctdb-client ctdb-protocol ctdb-protocol-util + ctdb-util ctdb-system samba-util sys_rw popt''', + install_path='${BINDIR}', + manpages='ctdb.1') + + bld.SAMBA_BINARY('ctdb_killtcp', + source='tools/ctdb_killtcp.c', + deps='''ctdb-protocol-util 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 sys_rw ctdb-system tevent-util + talloc tevent tdb''', + includes='include', + install_path='${CTDB_HELPER_BINDIR}') + + bld.SAMBA_BINARY('ctdb_recovery_helper', + source='server/ctdb_recovery_helper.c', + deps='''ctdb-client ctdb-protocol ctdb-util + samba-util sys_rw replace tdb''', + install_path='${CTDB_HELPER_BINDIR}') + + bld.SAMBA_BINARY('ctdb_takeover_helper', + source='server/ctdb_takeover_helper.c', + deps='''ctdb-client ctdb-protocol ctdb-util + samba-util sys_rw replace ctdb-ipalloc popt''', + install_path='${CTDB_HELPER_BINDIR}') + + bld.SAMBA_BINARY('ctdb_mutex_fcntl_helper', + source='server/ctdb_mutex_fcntl_helper.c', + deps='''sys_rw ctdb-system tevent-util ctdb-util + talloc tevent + ''', + 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 = 'grep -Fv "register int32_t *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 tirpc', + 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_PTHREAD_INTERNAL_MUTEX_OWNER: + bld.SAMBA_BINARY('tdb_mutex_check', + source='utils/tdb/tdb_mutex_check.c', + deps='tdb pthread', + install_path='${CTDB_HELPER_BINDIR}') + + if bld.env.HAVE_PMDA: + bld.SAMBA_BINARY('pmdactdb', + source='utils/pmda/pmda_ctdb.c', + deps='''ctdb-client ctdb-protocol ctdb-util + samba-util 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') + + if bld.env.HAVE_LIBRADOS: + bld.SAMBA_BINARY('ctdb_mutex_ceph_rados_helper', + source='utils/ceph/ctdb_mutex_ceph_rados_helper.c', + deps='talloc tevent rados', + includes='include', + install_path='${CTDB_HELPER_BINDIR}') + + 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_expr8 = 's|/usr/local/share/ctdb|%s|g' % (bld.env.CTDB_DATADIR) + sed_cmdline = '-e "%s" ' * 8 % \ + (sed_expr1, sed_expr2, sed_expr3, sed_expr4, sed_expr5, + sed_expr6, sed_expr7, sed_expr8) + + manpages_extra = list(manpages_misc) + if bld.env.etcd_reclock: + manpages_extra += manpages_etcd + if bld.env.HAVE_LIBRADOS: + manpages_extra += manpages_ceph + for f in manpages_binary + manpages_extra: + 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(' '.join(manpages_extra), 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=MODE_755) + + 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=MODE_755) + + if bld.env.etcd_reclock: + bld.SAMBA_GENERATOR('ctdb-etcd-lock', + source='utils/etcd/ctdb_etcd_lock', + target='ctdb_etcd_lock', + rule='sed %s ${SRC} > ${TGT}' % (sed_cmdline)) + bld.INSTALL_FILES('${CTDB_HELPER_BINDIR}', 'ctdb_etcd_lock', + destname='ctdb_etcd_lock', chmod=MODE_744) + + 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=MODE_755) + + 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=MODE_755) + + 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 & MODE_777 + 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': []} + for dirname, _subdirs, fnames in os.walk(path): + SUBDIR_MODE_callback(pd, dirname, fnames) + return pd['file_list'] + + event_script_subdirs = [ + 'events/legacy', + ] + + etc_subdirs = [ + 'nfs-checks.d' + ] + + if bld.env.standalone_ctdb: + configdir = 'config' + else: + configdir = 'ctdb/config' + + for t in event_script_subdirs: + bld.INSTALL_DIR(os.path.join(bld.env.CTDB_ETCDIR, t)) + files = SUBDIR_MODE('%s/%s' % (configdir, t), trim_path=configdir) + for fmode in files: + bld.INSTALL_FILES(bld.env.CTDB_DATADIR, 'config/%s' % fmode[0], + destname=fmode[0], chmod=fmode[1]) + + 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]) + + # If this is a direct install and there are no event scripts + # linked/enabled then enable some standard ones + if os.environ.get('DESTDIR') is None: + fmt = 'events/legacy/%s.script' + required_script = '00.ctdb' + required_path = os.path.join(bld.env.CTDB_ETCDIR, + fmt % (required_script)) + if not os.path.islink(required_path) and \ + not os.path.exists(required_path): + default_scripts = [ required_script, + '01.reclock', + '05.system', + '10.interface', + ] + for t in default_scripts: + tgt = os.path.join(bld.env.CTDB_DATADIR, fmt % (t)) + name = os.path.join(bld.env.CTDB_ETCDIR, fmt % (t)) + bld.symlink_as(name, tgt) + + 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', + '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=MODE_755) + + 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}/events/notification', + 'config/notification.README', + destname='README') + + bld.INSTALL_DIR(bld.env.CTDB_LOGDIR) + bld.INSTALL_DIR(bld.env.CTDB_RUNDIR) + bld.INSTALL_DIR(bld.env.CTDB_VARDIR) + + for d in ['volatile', 'persistent', 'state']: + bld.INSTALL_DIR(os.path.join(bld.env.CTDB_VARDIR, d)) + + # + # Test-only below this point + # + + if not bld.env.standalone_ctdb and not bld.CONFIG_GET('ENABLE_SELFTEST'): + return + + bld.SAMBA_BINARY('errcode', + source='tests/src/errcode.c', + deps='replace', + install_path='${CTDB_TEST_LIBEXECDIR}') + + bld.SAMBA_BINARY('sigcode', + source='tests/src/sigcode.c', + deps='replace', + install_path='${CTDB_TEST_LIBEXECDIR}') + + # Unit tests + ctdb_util_tests = [ + 'cmdline_test', + 'comm_client_test', + 'comm_server_test', + 'comm_test', + 'conf_test', + 'db_hash_test', + 'event_script_test', + 'hash_count_test', + 'line_test', + 'pidfile_test', + 'pkt_read_test', + 'pkt_write_test', + 'run_event_test', + 'run_proc_test', + 'sock_io_test', + 'srvid_test', + 'tunable_test', + ] + + for target in ctdb_util_tests: + src = 'tests/src/' + target + '.c' + + bld.SAMBA_BINARY(target, + source=src, + deps='''ctdb-tests-backtrace + LIBASYNC_REQ + samba-util + sys_rw + tevent-util + talloc + tevent + tdb + popt + ''', + install_path='${CTDB_TEST_LIBEXECDIR}') + + bld.SAMBA_BINARY('reqid_test', + source='tests/src/reqid_test.c', + deps='samba-util talloc', + install_path='${CTDB_TEST_LIBEXECDIR}') + + bld.SAMBA_BINARY('rb_test', + source='tests/src/rb_test.c', + deps='samba-util talloc', + install_path='${CTDB_TEST_LIBEXECDIR}') + + bld.SAMBA_BINARY('ctdb_packet_parse', + source='tests/src/ctdb_packet_parse.c', + deps='talloc tevent tdb ctdb-protocol', + install_path='${CTDB_TEST_LIBEXECDIR}') + + bld.SAMBA_BINARY('system_socket_test', + source='tests/src/system_socket_test.c', + deps='''ctdb-tests-backtrace + talloc + ctdb-protocol-util + pcap + ''', + install_path='${CTDB_TEST_LIBEXECDIR}') + + bld.SAMBA_BINARY('porting_tests', + source='tests/src/porting_tests.c', + deps='samba-util ctdb-system popt', + install_path='${CTDB_TEST_LIBEXECDIR}') + + bld.SAMBA_BINARY('sock_daemon_test', + source='tests/src/sock_daemon_test.c', + deps='''ctdb-system talloc tevent tevent-util + LIBASYNC_REQ samba-util sys_rw''', + install_path='${CTDB_TEST_LIBEXECDIR}') + + bld.SAMBA_BINARY('ctdb_io_test', + source='tests/src/ctdb_io_test.c', + deps='''talloc tevent tdb samba-util sys_rw''', + install_path='${CTDB_TEST_LIBEXECDIR}') + + bld.SAMBA_BINARY('ctdb-db-test', + source='tests/src/db_test_tool.c', + cflags='-DCTDB_DB_TEST_TOOL', + deps='''ctdb-client ctdb-protocol + ctdb-util samba-util talloc tevent replace''', + install_path='${CTDB_TEST_LIBEXECDIR}') + + for target in ['tmon_ping_test', 'tmon_test']: + src = 'tests/src/' + target + '.c' + + bld.SAMBA_BINARY(target, + source=src, + deps='''ctdb-util + ctdb-tests-backtrace + LIBASYNC_REQ + samba-util + sys_rw + tevent-util + talloc + tevent + tdb + popt + ''', + install_path='${CTDB_TEST_LIBEXECDIR}') + + bld.SAMBA_SUBSYSTEM('ctdb-protocol-tests-basic', + source=bld.SUBDIR('tests/src', + 'protocol_common_basic.c'), + deps='samba-util replace talloc') + + bld.SAMBA_SUBSYSTEM('ctdb-protocol-tests-common', + source=bld.SUBDIR('tests/src', + '''protocol_common.c + protocol_common_ctdb.c + '''), + deps='ctdb-protocol-tests-basic replace talloc tdb') + + bld.SAMBA_BINARY('protocol_basic_test', + source=bld.SUBDIR('tests/src', 'protocol_basic_test.c'), + deps='ctdb-protocol-tests-basic talloc', + install_path='${CTDB_TEST_LIBEXECDIR}') + + ctdb_protocol_tests = [ + 'protocol_types_test', + 'protocol_ctdb_test', + 'protocol_util_test', + 'protocol_types_compat_test', + 'protocol_ctdb_compat_test', + ] + + for target in ctdb_protocol_tests: + src = 'tests/src/' + target + '.c' + + bld.SAMBA_BINARY(target, + source=src, + deps='''ctdb-protocol-tests-common + samba-util ctdb-util talloc tdb''', + install_path='${CTDB_TEST_LIBEXECDIR}') + + bld.SAMBA_BINARY('event_protocol_test', + source='event/event_protocol_test.c', + deps='''ctdb-protocol-tests-basic + ctdb-protocol-basic talloc''', + install_path='${CTDB_TEST_LIBEXECDIR}') + + bld.SAMBA_SUBSYSTEM('ctdb-tests-common', + source=bld.SUBDIR('tests/src', + '''cluster_wait.c + test_options.c + '''), + deps='''ctdb-client + samba-util + replace + popt + talloc + tevent + tdb''') + + bld.SAMBA_SUBSYSTEM('ctdb-tests-backtrace', + source=bld.SUBDIR('tests/src', + 'test_backtrace.c'), + deps='''samba-util + replace''') + + # Test binaries + ctdb_tests = [ + 'g_lock_loop', + 'message_ring', + 'fetch_ring', + 'fetch_loop', + 'fetch_loop_key', + 'fetch_readonly', + 'fetch_readonly_loop', + 'transaction_loop', + 'update_record', + 'update_record_persistent', + 'lock_tdb', + 'dummy_client', + 'tunnel_test', + 'tunnel_cmd', + ] + + for target in ctdb_tests: + src = 'tests/src/' + target + '.c' + + bld.SAMBA_BINARY(target, + source=src, + includes='include', + deps='''ctdb-client ctdb-protocol ctdb-util + samba-util ctdb-tests-common''', + install_path='${CTDB_TEST_LIBEXECDIR}') + + bld.SAMBA_BINARY('ctdb_takeover_tests', + source='''tests/src/ctdb_takeover_tests.c + tests/src/ipalloc_read_known_ips.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_LIBEXECDIR}') + + bld.SAMBA_BINARY('fake_ctdbd', + source='''tests/src/fake_ctdbd.c + tests/src/ipalloc_read_known_ips.c''', + deps='''ctdb-util ctdb-protocol ctdb-protocol-util + ctdb-system samba-util tevent-util + LIBASYNC_REQ popt''', + install_path='${CTDB_TEST_LIBEXECDIR}') + + bld.SAMBA_BINARY('cluster_mutex_test', + source='tests/src/cluster_mutex_test.c', + deps='''ctdb-tests-backtrace + samba-util + talloc + tevent + ''', + install_path='${CTDB_TEST_LIBEXECDIR}') + + if bld.env.HAVE_INFINIBAND: + bld.SAMBA_BINARY('ibwrapper_test', + source='ib/ibwrapper_test.c', + includes='include', + deps='replace talloc ctdb-common sys_rw' + + ib_deps, + install_path='${CTDB_TEST_LIBEXECDIR}') + + if bld.env.HAVE_ROBUST_MUTEXES and sys.platform.startswith('linux') and bld.env.DEVELOPER: + bld.SAMBA_BINARY('test_mutex_raw', + source='tests/src/test_mutex_raw.c', + deps='pthread', + install_path='${CTDB_TEST_LIBEXECDIR}') + + test_subdirs = [ + 'CLUSTER', + 'INTEGRATION', + 'UNIT', + 'etc-ctdb' + ] + + if bld.env.standalone_ctdb: + testdir = 'tests' + else: + testdir = 'ctdb/tests' + + for t in test_subdirs: + files = SUBDIR_MODE('%s/%s' % (testdir, t), trim_path=testdir) + 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, excluding files that need munging + test_scripts = [ + 'cluster.bash', + 'common.sh', + 'integration.bash', + 'integration_local_daemons.bash', + 'integration_real_cluster.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)) + + bld.INSTALL_FILES(bld.env.CTDB_TEST_DATADIR, + 'tests/scripts/test_wrap', + destname='scripts/test_wrap', + chmod=MODE_755) + + 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=MODE_644) + + sed_expr1 = 's@^\\(%s\\)=.*@\\1=%s@' % ( + 'CTDB_TEST_DIR', bld.env.CTDB_TEST_DATADIR) + sed_expr2 = 's@^\\(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=MODE_755) + bld.symlink_as(os.path.join(bld.env.BINDIR, 'ctdb_run_cluster_tests'), + 'ctdb_run_tests') + + bld.SAMBA_GENERATOR('ctdb-local-daemons', + source='tests/local_daemons.sh', + target='ctdb_local_daemons.sh', + rule='sed -e "%s" -e "%s" ${SRC} > ${TGT}' % ( + sed_expr1, sed_expr2)) + bld.INSTALL_FILES('${BINDIR}', 'ctdb_local_daemons.sh', + destname='ctdb_local_daemons', chmod=MODE_755) + + +def testonly(ctx): + cmd = 'tests/run_tests.sh' + ret = samba_utils.RUN_COMMAND(cmd) + if ret != 0: + print('tests exited with exit status %d' % ret) + sys.exit(ret) + + +def test(ctx): + Options.commands.append('build') + Options.commands.append('testonly') + + +def autotest(ctx): + env = samba_utils.LOAD_ENVIRONMENT() + cmd = 'tests/run_tests.sh -eL -S %s' % env.SOCKET_WRAPPER_SO_PATH + 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(get_version_string()) + + +def manpages(ctx): + BASE_URL = 'http://docbook.sourceforge.net/release/xsl/current' + MAN_XSL = '%s/manpages/docbook.xsl' % BASE_URL + HTML_XSL = '%s/html/docbook.xsl' % BASE_URL + CMD_TEMPLATE = 'xsltproc --xinclude -o %s --nonet %s %s' + manpages = manpages_binary + manpages_misc + manpages_etcd + manpages_ceph + for t in manpages: + cmd = CMD_TEMPLATE % ('doc/%s' % t, MAN_XSL, 'doc/%s.xml' % t) + ret = samba_utils.RUN_COMMAND(cmd) + if ret != 0: + print('Command %s failed with exit status %d' % (cmd, ret)) + sys.exit(ret) + + cmd = CMD_TEMPLATE % ('doc/%s.html' % t, HTML_XSL, 'doc/%s.xml' % t) + ret = samba_utils.RUN_COMMAND(cmd) + if ret != 0: + print('Command %s failed with exit status %d' % (cmd, ret)) + sys.exit(ret) + + +def distonly(ctx): + samba_dist.DIST_FILES('VERSION:VERSION', extend=True) + + t = 'ctdb.spec' + sed_expr1 = 's/@VERSION@/%s/g' % get_version_string() + 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) + + manpages = manpages_binary + manpages_misc + manpages_etcd + manpages_ceph + 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 dist(): + Options.commands.append('manpages') + Options.commands.append('distonly') + + +def rpmonly(ctx): + opts = os.getenv('RPM_OPTIONS') or '' + cmd = 'rpmbuild -ta --clean --rmsource %s ctdb-%s.tar.gz' % \ + (opts, get_version_string()) + ret = samba_utils.RUN_COMMAND(cmd) + if ret != 0: + print('rpmbuild exited with exit status %d' % ret) + sys.exit(ret) + + +def rpm(ctx): + Options.commands.append('manpages') + Options.commands.append('distonly') + Options.commands.append('rpmonly') + + +def ctags(ctx): + "build 'tags' file using ctags" + source_root = os.path.dirname(Context.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) |