#!/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 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.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', '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)