#
# Copyright (c) 2012-2026 Red Hat.
# Copyright (c) 2009 Aconex.  All Rights Reserved.
# Copyright (c) 1997-2002 Silicon Graphics, Inc.  All Rights Reserved.
#

#DBG    = -DDEBUG -DMALLOC_AUDIT -g
DBG     = -DDEBUG -g

DEBUG   = $(DBG)

HAVE_64	= $(shell test `uname -m | sed -e 's/.*64/64/g'` = "64" && echo 1 || echo 0)

CFILES = disk_test.c exercise.c context_test.c chkoptfetch.c \
	xval.c xxx.c chkopenlog.c chkconnect.c t_fetch.c clienttimeout.c \
	hp-mib.c agenttimeout.c chkctx2.c pmcdgone.c chkhelp.c \
	scale.c chktrim.c store.c torture_api.c logcontrol.c xlog.c \
	hex2nbo.c chknumval.c xarch.c eofarch.c defctx.c chkacc1.c chkacc2.c \
	chkacc3.c storepast.c pmdashutdown.c exertz.c badpmcdpmid.c \
	permfetch.c archinst.c pmlcmacro.c whichtimezone.c eol.c \
	interp0.c interp1.c interp2.c interp3.c interp4.c \
	pcp_lite_crash.c compare.c mkfiles.c nameall.c nullinst.c \
	storepdu.c fetchpdu.c badloglabel.c interp_bug2.c interp_bug.c \
	xmktime.c descreqX2.c recon.c torture_indom.c \
	fetchrate.c stripmark.c pmnsinarchives.c pmnsunload.c \
	endian.c chk_memleak.c chk_metric_types.c mark-bug.c \
	parsemetricspec.c parseinterval.c parsehighresinterval.c \
	pducheck.c pducrash.c pdu-server.c \
	pmprintf.c pmsprintf.c pmsocks_objstyle.c numberstr.c \
	read-bf.c write-bf.c slow_af.c indom.c tztest.c \
	multifetch.c pmconvscale.c torture-eol.c \
	crashpmcd.c dumb_pmda.c torture_cache.c wrap_int.c \
	labels.c mergelabels.c mergelabelsets.c addlabels.c parselabels.c \
	matchInstanceName.c torture_pmns.c \
	mmv_genstats.c mmv_instances.c mmv_poke.c mmv_noinit.c mmv_nostats.c \
	mmv2_genstats.c mmv2_instances.c mmv2_nostats.c mmv2_simple.c \
	mmv3_simple.c mmv3_labels.c mmv3_bad_labels.c mmv3_nostats.c mmv3_genstats.c \
	record.c record-setarg.c clientid.c grind_ctx.c \
	check_import_append.c check_import_name.c check_import.c check_volsize.c \
	pmdacache.c unpack.c hrunpack.c aggrstore.c atomstr.c \
	semstr.c grind_conv.c getconfig.c err.c torture_logmeta.c keycache.c \
	keycache2.c pmdaqueue.c drain-server.c template.c anon-sa.c \
	username.c rtimetest.c getcontexthost.c badpmda.c chklogputresult.c \
	churnctx.c badUnitsStr_r.c units-parse.c rootclient.c derived.c \
	lookupnametest.c getversion.c pdubufbounds.c statvfs.c storepmcd.c \
	github-50.c archfetch.c sortinst.c fetchgroup.c loadconfig2.c \
	loadderived.c sum16.c badmmv.c multictx.c mmv_simple.c \
	httpfetch.c json_test.c check_pmiend_fdleak.c check_pmi_errconv.c \
	archctl_segfault.c debug.c int2pmid.c int2indom.c exectest.c \
	unpickargs.c hanoi.c progname.c countmark.c check_attribute.c \
	indom2int.c pmid2int.c scanmeta.c traverse_return_codes.c args.c \
	timeshift.c checkstructs.c bcc_profile.c sha1int2ext.c sha1ext2int.c \
	getdomainname.c profilecrash.c store_and_fetch.c test_service_notify.c \
	ctx_derive.c pmstrn.c pmfstring.c pmfg-derived.c mmv_help.c sizeof.c \
	stampconv.c time_stamp.c archend.c scandata.c wait_for_values.c \
	dumpstack.c usergroup.c derived_help.c ready-or-not.c cleanmapdir.c \
	throttle.c throttle_timeout.c y2038.c bigpmcdpmids.c pdu-gadget.c \
	strnfoo.c mmv_ondisk.c newcontext.c api_abi.c interp_bug3.c \
	pmsetmode.c scanindex.c localtime.c httpcache.c unregister.c \
	genpmns.c undelta.c series_time_parse_test.c derived_control.c \
	multithread0.c multithread1.c multithread2.c multithread3.c \
	multithread4.c multithread5.c multithread6.c multithread7.c \
	multithread8.c multithread9.c multithread10.c multithread11.c \
	multithread12.c multithread13.c multithread14.c \
	exerlock.c hashwalk.c parsehostattrs.c parsehostspec.c getoptions.c \
	check_cloexec.c check_tz.c


ifeq ($(shell test -f ../localconfig && echo 1), 1)
include ../localconfig
else
ifeq ($(shell cd ..; ( $(MAKE) localconfig >/dev/null && echo 1 )), 1)
include ../localconfig
else
$(error Cannot make qa/localconfig)
endif
endif

XTRATARGETS += getoptions_v2

ifeq ($(shell test -f /usr/include/pcp/fault.h && echo 1), 1)
# only make these ones if the fault injection version of libpcp
# appears to have been installed (assumes PCP >= 3.5), and then
# only for the setup target (so not in the build)
#
XTRATARGETS += check_fault_injection exercise_fault
endif
MYFILES += check_fault_injection.c exercise_fault.c
LDIRT += check_fault_injection exercise_fault

# in a build tree with libpcp3 present
#
LIBPCP3 = libpcp.$(DSOSUFFIX).3
ifeq "$(TARGET_OS)" "darwin"
LIBPCP3 = libpcp.3.$(DSOSUFFIX)
endif
XTRATARGETS += api_abi_v2
ifeq ($(shell test -f ../../src/libpcp3/src/include/pcp/pmapi.h -a ../../src/libpcp3/src/$(LIBPCP3) && echo 1), 1)
XTRATARGETS += api_abi_compat
endif

# POSIXFILES and TRACEFILES are ones we don't even try to build on
# non-Posix platforms like Windows
#
POSIXFILES = \
	ipc.c proc_test.c context_fd_leak.c arch_maxfd.c torture_trace.c \
	779246.c killparent.c fetchloop.c chain.c spawn.c chkacc4.c

TRACEFILES = \
	obs.c tstate.c tabort.c 

PERLFILES = \
	batch_import.perl check_import.perl import_limit_test.perl
# not installed:
PLFILES = $(shell echo $(PERLFILES) | sed -e 's/\.perl/.pl/g')

ifeq "$(HAVE_PYTHON)" "true"
PYTHONFILES = \
	test_pcp.python test_pmcc.python \
	test_pmi.python check_import.python \
	test_mmv.python test_webapi.python \
	test_pcp_derived.python test_bad_import.python \
	test_pcp_options.python test_pcp_getopts.python \
	test_pcp_time.python test_pmnswalk.python \
	pmapi_exceptions.python pmapi_daemon.python \
	fsstats.python procpid.python \
	test_set_source.python test_pmda_memleak.python \
	test_webcontainers.python test_webprocesses.python \
	test_pmfg.python pmproxy_load_test.python \
	mergelabels.python mergelabelsets.python \
	bcc_version_check.python sort_xml.python labelsets.python \
	labelsets_memleak.python labels_changing.python \
	bcc_netproc.python key_server_proxy.python pythonserver.python
# not installed:
PYFILES = $(shell echo $(PYTHONFILES) | sed -e 's/\.python/.py/g')
else
PYTHONFILES =
PYFILES =
endif

ifneq "$(TARGET_OS)" "mingw"
CFILES += $(POSIXFILES) $(TRACEFILES)
else
MYFILES += $(POSIXFILES) $(TRACEFILES)
endif

MYFILES += \
	err_v1.dump \
	root_irix root_pmns tiny.pmns sgi.bf versiondefs \
	pthread_barrier.h libpcp.h pv.c qa_test.c qa_timezone.c \
	permslist \
	qa_shmctl.c qa_sem_msg_ctl.c \
	qa_shmctl_stat.c qa_msgctl_stat.c qa_semctl_stat.c \
	qa_libpcp_compat.c addctxdm.c myprintresult.c
LDIRT += addctxdm.o myprintresult.o

MYSCRIPTS = grind-tools show-args fixhosts mkpermslist \
	memcachestats.pl indomdelta pmjson_array_sort

PSCRIPTS = $(PERLFILES) $(PYTHONFILES)

CFILES_TARGETS = $(CFILES)

TARGETS = $(subst broken_pmda,,$(basename $(patsubst %.c,%,$(CFILES_TARGETS)))) \
	chkctx2_lite template fetchrate_lite pv api_abi_v2 \
	$(XTRATARGETS)

ifeq "$(TARGET_OS)" "linux"
TARGETS += qa_shmctl.$(DSOSUFFIX) qa_sem_msg_ctl.$(DSOSUFFIX) \
	qa_shmctl_stat.$(DSOSUFFIX) qa_msgctl_stat.$(DSOSUFFIX) \
	qa_semctl_stat.$(DSOSUFFIX)
endif

ifeq ($(HAVE_64), 1)
TARGETS	+= pv64
endif

LCFLAGS = -DHAVE_TRACE
LLDLIBS	= $(LDFLAGS) $(PCPLIB)

# NVIDIA mock library for testing
ifneq ($(NVIDIAQALIB),)
LIBTARGET = true
MYCFILES += nvidia-ml.c
LDIRT += nvidia-ml.o
LCFLAGS += $(NVIDIACFLAGS)
TARGETS += $(NVIDIAQALIB)
endif

# InfiniBand mock libraries for testing
ifneq ($(IBUMADQALIB),)
LIBTARGET = true
MYCFILES += infiniband-umad.c infiniband-verbs.c
LDIRT += infiniband-umad.o infiniband-verbs.o
TARGETS += $(IBUMADQALIB) $(IBVERBSQALIB)
endif

ifeq "$(HAVE_CMOCKA)" "true"
CFILES += test_encodings.c test_hostspec.c
endif

# libpcp_trace is ready
TRACELIB	= $(LLDLIBS) -lpcp_trace

# all archives, except the ones checked into the source tree,
# then add executables beyond $(TARGETS)
#
LDIRT	+= *.log domain.h help.pag help.dir \
	big[0-2].[0-2] big[0-2].index big[0-2].meta \
	chkctx2_lite.c fetchrate_lite.c \
	localconfig.h gmon.out \
	$(PLFILES) $(PYFILES) \
	$(TARGETS)

.ORDER:	torture_api \
	chkctx2 fetchrate

default default_pcp: \
	$(CFILES_TARGETS) $(TARGETS) \
	$(SRCARCHPART) \
	$(PLFILES) $(PYFILES)

setup: libpcp.h default $(XTRATARGETS)

$(TARGETS):

include $(BUILDRULES)

# remove just the binaries, not the archives
#
clean-exec:
	rm -f $(TARGETS)
	rm -f $(OBJECTS)
	rm -f pv64

OBJECTS = $(shell echo $(CFILES) | sed -e 's/\.c/.o/g')

# make just the archives, not the binaries
#
arch:	$(SRCARCHPART)

# --- do NOT need libpcp
#

statvfs:	statvfs.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ statvfs.c

chain:	chain.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ chain.c

spawn:	spawn.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ spawn.c

endian:	endian.c localconfig.h
	rm -f $@
	$(CCF) $(CDEFS) -o $@ endian.c

pmlcmacro:	pmlcmacro.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ pmlcmacro.c

anon-sa: anon-sa.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ anon-sa.c

bcc_profile: bcc_profile.c
	rm -f $@
	$(CCF) $(CDEFS) -g -fno-omit-frame-pointer -o $@ bcc_profile.c

sizeof:	sizeof.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $<

args:	args.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $<

hanoi:	hanoi.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $<

infiniband-verbs:	infiniband-verbs.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $<

killparent:	killparent.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $<

matchInstanceName:	matchInstanceName.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $<

qa_msgctl_stat:	qa_msgctl_stat.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $<

qa_sem_msg_ctl:	qa_sem_msg_ctl.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $<

qa_semctl_stat:	qa_semctl_stat.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $<

qa_shmctl_stat:	qa_shmctl_stat.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $<

qa_shmctl:	qa_shmctl.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $<

qa_test:	qa_test.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $<

sum16:	sum16.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $<

time_stamp:	time_stamp.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $<

wrap_int:	wrap_int.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $<

# --- need libpcp
#

template:	template.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

exercise:	exercise.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

chkacc1:	chkacc1.c localconfig.h
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

chkacc2:	chkacc2.c localconfig.h
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

chkacc3:	chkacc3.c localconfig.h
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

ipc:	ipc.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

chk_memleak:	chk_memleak.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

chknumval:	chknumval.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

logcontrol:	logcontrol.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

numberstr: numberstr.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

pmcdgone:	pmcdgone.c localconfig.h
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

slow_af:	slow_af.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

mmv_poke:	mmv_poke.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

labels:	labels.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

mergelabels:	mergelabels.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

mergelabelsets:	mergelabelsets.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

parselabels:	parselabels.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

traverse_return_codes:	traverse_return_codes.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

getdomainname:	getdomainname.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

pmstrn:	pmstrn.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

pmfstring:	pmfstring.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

usergroup:	usergroup.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

derived_help:	derived_help.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

derived_control:	derived_control.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

ready-or-not:	ready-or-not.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

throttle:	throttle.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

throttle_timeout:	throttle_timeout.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

y2038:	y2038.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

pdu-gadget:	pdu-gadget.c myprintresult.o
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< myprintresult.o $(LDLIBS)
	$(LINKER_MAKERULE)

strnfoo:	strnfoo.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

mmv_ondisk:	mmv_ondisk.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

newcontext:	newcontext.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

scanindex:	scanindex.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

localtime:	localtime.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

unregister:	unregister.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

genpmns:	genpmns.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

undelta:	undelta.c libpcp.h
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

series_time_parse_test:	series_time_parse_test.c libpcp.h
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

context_test:	context_test.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

chkoptfetch:	chkoptfetch.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

archfetch:	archfetch.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

779246:	779246.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

addctxdm:	addctxdm.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

addlabels:	addlabels.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

agenttimeout:	agenttimeout.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

aggrstore:	aggrstore.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

api_abi:	api_abi.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

arch_maxfd:	arch_maxfd.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

archctl_segfault:	archctl_segfault.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

archend:	archend.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

archinst:	archinst.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

badloglabel:	badloglabel.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

badmmv:	badmmv.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

badpmcdpmid:	badpmcdpmid.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

badUnitsStr_r:	badUnitsStr_r.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

bigpmcdpmids:	bigpmcdpmids.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

check_attribute:	check_attribute.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

checkstructs:	checkstructs.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

chk_metric_types:	chk_metric_types.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

chkacc4:	chkacc4.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

chkconnect:	chkconnect.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

chkctx2:	chkctx2.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

chkhelp:	chkhelp.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

chklogputresult:	chklogputresult.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

chkopenlog:	chkopenlog.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

chktrim:	chktrim.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

cleanmapdir:	cleanmapdir.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

clientid:	clientid.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

clienttimeout:	clienttimeout.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

compare:	compare.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

context_fd_leak:	context_fd_leak.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

countmark:	countmark.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

crashpmcd:	crashpmcd.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

ctx_derive:	ctx_derive.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

debug:	debug.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

defctx:	defctx.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

derived:	derived.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

descreqX2:	descreqX2.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

disk_test:	disk_test.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

drain-server:	drain-server.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

eofarch:	eofarch.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

eol:	eol.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

err:	err.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

exectest:	exectest.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

exertz:	exertz.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

fetchgroup:	fetchgroup.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

fetchloop:	fetchloop.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

fetchpdu:	fetchpdu.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

fetchrate:	fetchrate.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

getconfig:	getconfig.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

getcontexthost:	getcontexthost.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

getoptions:	getoptions.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

getversion:	getversion.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

github-50:	github-50.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

grind_conv:	grind_conv.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

hashwalk:	hashwalk.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

hex2nbo:	hex2nbo.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

hrunpack:	hrunpack.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

indom:	indom.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

indom2int:	indom2int.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

infiniband-umad:	infiniband-umad.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

int2indom:	int2indom.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

int2pmid:	int2pmid.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

interp_bug:	interp_bug.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

interp_bug2:	interp_bug2.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

interp_bug3:	interp_bug3.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

interp0:	interp0.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

interp1:	interp1.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

interp2:	interp2.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

interp3:	interp3.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

interp4:	interp4.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

loadconfig2:	loadconfig2.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

loadderived:	loadderived.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

lookupnametest:	lookupnametest.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

mark-bug:	mark-bug.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

mkfiles:	mkfiles.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

multictx:	multictx.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

multifetch:	multifetch.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

myprintresult:	myprintresult.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

nameall:	nameall.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

nullinst:	nullinst.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

nvidia-ml:	nvidia-ml.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

parsehighresinterval:	parsehighresinterval.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

parsehostattrs:	parsehostattrs.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

parsehostspec:	parsehostspec.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

parseinterval:	parseinterval.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

parsemetricspec:	parsemetricspec.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

pdubufbounds:	pdubufbounds.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

permfetch:	permfetch.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

pmconvscale:	pmconvscale.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

pmfg-derived:	pmfg-derived.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

pmid2int:	pmid2int.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

pmnsinarchives:	pmnsinarchives.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

pmnsunload:	pmnsunload.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

pmprintf:	pmprintf.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

pmsetmode:	pmsetmode.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

pmsocks_objstyle:	pmsocks_objstyle.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

pmsprintf:	pmsprintf.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

proc_test:	proc_test.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

profilecrash:	profilecrash.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

progname:	progname.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

pv:	pv.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

qa_libpcp_compat:	qa_libpcp_compat.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

qa_timezone:	qa_timezone.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

read-bf:	read-bf.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

recon:	recon.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

rtimetest:	rtimetest.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

scale:	scale.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

scandata:	scandata.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

scanmeta:	scanmeta.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

stampconv:	stampconv.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

storepast:	storepast.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

storepdu:	storepdu.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

storepmcd:	storepmcd.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

stripmark:	stripmark.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

t_fetch:	t_fetch.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

test_service_notify:	test_service_notify.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

timeshift:	timeshift.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

torture_api:	torture_api.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

torture_logmeta:	torture_logmeta.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

torture-eol:	torture-eol.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

tztest:	tztest.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

unpack:	unpack.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

unpickargs:	unpickargs.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

username:	username.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

wait_for_values:	wait_for_values.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

whichtimezone:	whichtimezone.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

write-bf:	write-bf.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

xarch:	xarch.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

xlog:	xlog.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

xmktime:	xmktime.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

xval:	xval.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

xxx:	xxx.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

# --- need libpcp but different versions of PMAPI_VERSION and/or
#     libpcp.$(DSOSUFFIX)
#

getoptions_v2:	getoptions.c
	rm -f $@
	$(CCF) $(CDEFS) -DPMAPI_VERSION=2 -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

api_abi_v2:	api_abi.c
	rm -f $@
	$(CCF) $(CDEFS) -DPMAPI_VERSION=2 -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

# have to play games with libpcp.h so we include the one from
# ../../src/libpcp3/src/include/pcp, not ./libpcp.h
# ... trap games are to preserve libpcp.h if the compile or
# $(LINKER_MAKERULE) step fail [thanks coderabbitai], but extra
# " :" needed after $(LINKER_MAKERULE) to avoid shell
#	Syntax error: ";" unexpected
# when $(LINKER_MAKERULE) expands to nothing (like everywhere except
# macOS)
#
api_abi_compat:	api_abi.c libpcp.h
	rm -f $@ 
	`set -e; \
	mv libpcp.h libpcp.h.save; \
	trap 'mv -f libpcp.h.save libpcp.h' 0 1 2 3 15; \
	$(CC) -I../../src/libpcp3/src/include/pcp $(CFLAGS) $(CDEFS) -o $@ $< ../../src/libpcp3/src/$(LIBPCP3); \
	$(LINKER_MAKERULE) :; \
	mv -f libpcp.h.save libpcp.h; \
	trap - 0`

# --- need libpcp but also PM_CONTEXT_LOCAL
#

fetchrate_lite:	fetchrate_lite.c
	rm -f $@
	$(CCF) $(CDEFS) -DLITE=1 -o $@ fetchrate_lite.c $(LDLIBS)
	$(LINKER_MAKERULE)

fetchrate_lite.c:	fetchrate.c
	rm -f $@
	ln -s fetchrate.c fetchrate_lite.c

chkctx2_lite:	chkctx2_lite.c
	rm -f $@
	$(CCF) $(CDEFS) -DLITE=1 -o $@ chkctx2_lite.c $(LDLIBS)
	$(LINKER_MAKERULE)

chkctx2_lite.c:	chkctx2.c
	rm -f $@
	ln -s chkctx2.c chkctx2_lite.c

hp-mib: hp-mib.c
	rm -f $@
	$(CCF) $(CDEFS) -DLITE=1 -o $@ hp-mib.c $(LDLIBS)
	$(LINKER_MAKERULE)

pcp_lite_crash: pcp_lite_crash.c
	rm -f $@
	$(CCF) $(CDEFS) -DLITE=1 -o $@ pcp_lite_crash.c $(LDLIBS)
	$(LINKER_MAKERULE)

store: store.c
	rm -f $@
	$(CCF) $(CDEFS) -DLITE=1 -o $@ store.c $(LDLIBS)
	$(LINKER_MAKERULE)

store_and_fetch: store_and_fetch.c
	rm -f $@
	$(CCF) $(CDEFS) -DLITE=1 -o $@ store_and_fetch.c $(LDLIBS)
	$(LINKER_MAKERULE)

# --- need libpcp_pmda
#

domain.h:	$(PCP_VAR_DIR)/pmns/stdpmid
	rm -f $@
	echo "/*" >domain.h
	echo " * built from $(PCP_VAR_DIR)/pmns/stdpmid on `date`" >>domain.h
	echo " */" >>domain.h
	sed -n -e 's/[ 	]*$$//' -e '/define[ 	]BROKEN[ 	]/s/.*[ 	]/#define BROKEN /p' $(PCP_VAR_DIR)/pmns/stdpmid >>domain.h
	sed -n -e 's/[ 	]*$$//' -e '/define[ 	]DYNAMIC[ 	]/s/.*[ 	]/#define DYNAMIC /p' $(PCP_VAR_DIR)/pmns/stdpmid >>domain.h

pmdashutdown:	pmdashutdown.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LDLIBS) -lpcp_pmda
	$(LINKER_MAKERULE)

dumb_pmda: dumb_pmda.c localconfig.h
	$(CCF) $(LCDEFS) $(LCOPTS) -o $@ $@.c $(LDLIBS) -lpcp_pmda
	$(LINKER_MAKERULE)

pmdacache: pmdacache.c
	$(CCF) $(LCDEFS) $(LCOPTS) -o $@ $@.c $(LDLIBS) -lpcp_pmda
	$(LINKER_MAKERULE)

pmdaqueue: pmdaqueue.c
	$(CCF) $(LCDEFS) $(LCOPTS) -o $@ $@.c $(LDLIBS) -lpcp_pmda
	$(LINKER_MAKERULE)

rootclient: rootclient.c
	$(CCF) $(LCDEFS) $(LCOPTS) -o $@ $@.c $(LDLIBS) -lpcp_pmda
	$(LINKER_MAKERULE)

atomstr: atomstr.c
	$(CCF) $(LCDEFS) $(LCOPTS) -o $@ $@.c $(LDLIBS) -lpcp_pmda
	$(LINKER_MAKERULE)

semstr: semstr.c
	$(CCF) $(LCDEFS) $(LCOPTS) -o $@ $@.c $(LDLIBS) -lpcp_pmda
	$(LINKER_MAKERULE)

keycache: keycache.c
	$(CCF) $(LCDEFS) $(LCOPTS) -o $@ $@.c $(LDLIBS) -lpcp_pmda
	$(LINKER_MAKERULE)

keycache2: keycache2.c
	$(CCF) $(LCDEFS) $(LCOPTS) -o $@ $@.c $(LDLIBS) -lpcp_pmda
	$(LINKER_MAKERULE)

badpmda: badpmda.c
	$(CCF) $(LCDEFS) $(LCOPTS) -o $@ $@.c $(LDLIBS) -lpcp_pmda
	$(LINKER_MAKERULE)

torture_cache:	torture_cache.o 
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.o $(LDLIBS) -lpcp_pmda
	$(LINKER_MAKERULE)

# --- need libpcp_gui
#

record:	record.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LDLIBS) -lpcp_gui
	$(LINKER_MAKERULE)

record-setarg: record-setarg.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LDLIBS) -lpcp_gui
	$(LINKER_MAKERULE)

# --- need libpcp_mmv
#
mmv%:	mmv%.o
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LDLIBS) -lpcp_mmv
	$(LINKER_MAKERULE)

# --- need extra libraries
#
pducheck:	pducheck.o 
	rm -f $@
	$(CCF) $(CDEFS) -o $@ pducheck.o $(TRACELIB) $(LDLIBS) -lpcp_pmda
	$(LINKER_MAKERULE)

pducrash:	pducrash.o 
	rm -f $@
	$(CCF) $(CDEFS) -o $@ pducrash.o $(TRACELIB) $(LDLIBS)
	$(LINKER_MAKERULE)

pdu-server:	pdu-server.o
	rm -f $@
	$(CCF) $(CDEFS) -o $@ pdu-server.o $(TRACELIB) $(LDLIBS)
	$(LINKER_MAKERULE)

obs:	obs.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ obs.c $(TRACELIB) 
	$(LINKER_MAKERULE)

torture_trace:	torture_trace.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ torture_trace.c $(LIB_FOR_PTHREADS) $(TRACELIB) 
	$(LINKER_MAKERULE)

tstate:	tstate.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ tstate.c $(TRACELIB) 
	$(LINKER_MAKERULE)

tabort:	tabort.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ tabort.c $(TRACELIB) 
	$(LINKER_MAKERULE)

sortinst:	sortinst.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ sortinst.c $(LIB_FOR_REGEX)
	$(LINKER_MAKERULE)

# --- need libpcp_import
#

check_cloexec:	check_cloexec.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LDLIBS)
	$(LINKER_MAKERULE)

check_tz:	check_tz.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LDLIBS)
	$(LINKER_MAKERULE)

check_import:	check_import.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LDLIBS) -lpcp_archive -lpcp_import
	$(LINKER_MAKERULE)

check_import_name:	check_import_name.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LDLIBS) -lpcp_archive -lpcp_import
	$(LINKER_MAKERULE)

check_import_append:	check_import_append.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LDLIBS) -lpcp_archive -lpcp_import

check_volsize:	check_volsize.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LDLIBS) -lpcp_archive -lpcp_import

check_pmiend_fdleak:	check_pmiend_fdleak.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LDLIBS) -lpcp_archive -lpcp_import
	$(LINKER_MAKERULE)

check_pmi_errconv:	check_pmi_errconv.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LDLIBS) -lpcp_archive -lpcp_import
	$(LINKER_MAKERULE)

# --- need libpcp_web
#
httpcache:	httpcache.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LDLIBS) -lpcp_pmda -lpcp_web -lpcp_mmv
	$(LINKER_MAKERULE)

httpfetch:	httpfetch.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LDLIBS) -lpcp_pmda -lpcp_web -lpcp_mmv
	$(LINKER_MAKERULE)
json_test:	json_test.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LDLIBS) -lpcp_pmda -lpcp_web -lpcp_mmv
	$(LINKER_MAKERULE)
sha1int2ext:	sha1int2ext.o
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LDLIBS) -lpcp_pmda -lpcp_web -lpcp_mmv
	$(LINKER_MAKERULE)
sha1ext2int:	sha1ext2int.o
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LDLIBS) -lpcp_pmda -lpcp_web -lpcp_mmv
	$(LINKER_MAKERULE)

# --- need libpcp_fault
#

check_fault_injection: check_fault_injection.c
	rm -f $@
	$(CCF) $(CDEFS) -DPM_FAULT_INJECTION=1 -o $@ $@.c $(LDLIBS) -lpcp_fault -lpcp -lpcp_pmda
	$(LINKER_MAKERULE)

exercise_fault: exercise_fault.c
	rm -f $@
	$(CCF) $(CDEFS) -DPM_FAULT_INJECTION=1 -o $@ $@.c $(LDLIBS) -lpcp_fault -lpcp -lpcp_pmda
	$(LINKER_MAKERULE)

# --- need lib for pthreads
#

multithread0:	multithread0.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LIB_FOR_PTHREADS) $(LDLIBS)
	$(LINKER_MAKERULE)

multithread1:	multithread1.c
	rm -f $@
ifeq "$(TARGET_OS)" "darwin"
	@# see comments in multithread1.c to explain this crock
	$(CCF) $(CDEFS) -Ddarwin_hack=1 -o $@ $@.c $(LIB_FOR_PTHREADS) -framework CoreFoundation $(LDLIBS)
	$(LINKER_MAKERULE)
else
	$(CCF) $(CDEFS) -o $@ $@.c $(LIB_FOR_PTHREADS) $(LDLIBS)
	$(LINKER_MAKERULE)
endif

multithread2:	multithread2.c localconfig.h
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LIB_FOR_PTHREADS) $(LDLIBS)
	$(LINKER_MAKERULE)

multithread3:	multithread3.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LIB_FOR_PTHREADS) $(LDLIBS)
	$(LINKER_MAKERULE)

multithread4:	multithread4.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LIB_FOR_PTHREADS) $(LDLIBS)
	$(LINKER_MAKERULE)

multithread5:	multithread5.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LIB_FOR_PTHREADS) $(LDLIBS)
	$(LINKER_MAKERULE)

multithread6:	multithread6.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LIB_FOR_PTHREADS) $(LDLIBS)
	$(LINKER_MAKERULE)

multithread7:	multithread7.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LIB_FOR_PTHREADS) $(LDLIBS)
	$(LINKER_MAKERULE)

multithread8:	multithread8.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LIB_FOR_PTHREADS) $(LDLIBS)
	$(LINKER_MAKERULE)

multithread9:	multithread9.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LIB_FOR_PTHREADS) $(LDLIBS)
	$(LINKER_MAKERULE)

multithread10:	multithread10.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LIB_FOR_PTHREADS) $(LDLIBS)
	$(LINKER_MAKERULE)

multithread11:	multithread11.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LIB_FOR_PTHREADS) $(LDLIBS)
	$(LINKER_MAKERULE)

multithread12:	multithread12.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LIB_FOR_PTHREADS) $(LDLIBS)
	$(LINKER_MAKERULE)

multithread13:	multithread13.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LIB_FOR_PTHREADS) $(LDLIBS)
	$(LINKER_MAKERULE)

multithread14:	multithread14.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LIB_FOR_PTHREADS) $(LDLIBS)
	$(LINKER_MAKERULE)

exerlock:	exerlock.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $@.c $(LIB_FOR_PTHREADS) $(LDLIBS)
	$(LINKER_MAKERULE)

# --- binary format dependencies
#

ifeq ($(HAVE_64), 1)
pv64: pv.c
	$(CCF) $(CDEFS) -o $@ pv.c $(LDLIBS)
	$(LINKER_MAKERULE)
else
pv64:
endif

# -- archives
#

torture_indom: torture_indom.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ torture_indom.c $(LDLIBS)
	$(LINKER_MAKERULE)

units-parse: units-parse.c
	rm -f $@
	$(CCF) $(CDEFS) -o $@ units-parse.c $(LDLIBS)
	$(LINKER_MAKERULE)

# --- need add_ctx_dm()
#
grind_ctx:	grind_ctx.o addctxdm.o
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $^ $(LDLIBS)
	$(LINKER_MAKERULE)

churnctx:	churnctx.o addctxdm.o
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $^ $(LDLIBS)
	$(LINKER_MAKERULE)

torture_pmns: torture_pmns.o addctxdm.o
	rm -f $@
	$(CCF) $(CDEFS) -o $@ $^ $(LDLIBS)
	$(LINKER_MAKERULE)

# --- miscellaneous
#
qa_timezone.$(DSOSUFFIX):	qa_timezone.o
	$(LD) -shared -o $@ -nostdlib $<

qa_shmctl.$(DSOSUFFIX):	 qa_shmctl.c
	$(CCF) $(LDFLAGS) -shared -o $@ qa_shmctl.c
	@rm -f qa_shmctl.o

qa_msgctl_stat.$(DSOSUFFIX):	 qa_msgctl_stat.c
	$(CCF) $(LDFLAGS) -shared -o $@ qa_msgctl_stat.c
	@rm -f qa_msgctl_stat.o

qa_semctl_stat.$(DSOSUFFIX):	 qa_semctl_stat.c
	$(CCF) $(LDFLAGS) -shared -o $@ qa_semctl_stat.c
	@rm -f qa_semctl_stat.o

qa_shmctl_stat.$(DSOSUFFIX):	 qa_shmctl_stat.c
	$(CCF) $(LDFLAGS) -shared -o $@ qa_shmctl_stat.c
	@rm -f qa_shmctl_stat.o

qa_sem_msg_ctl.$(DSOSUFFIX):	 qa_sem_msg_ctl.c
	$(CCF) $(LDFLAGS) -shared -o $@ qa_sem_msg_ctl.c
	@rm -f qa_sem_msg_ctl.o

# --- need cmocka

ifeq "$(HAVE_CMOCKA)" "true"

test_encodings:	test_encodings.c
	rm -f $@
	$(CCF) $(CMOCKACFLAGS) $(CDEFS) -o $@ $^ $(LDLIBS) $(LIB_FOR_CMOCKA) -lpcp_pmda -lpcp_web -lpcp_mmv
	$(LINKER_MAKERULE)

test_hostspec:	test_hostspec.c
	rm -f $@
	$(CCF) $(CMOCKACFLAGS) $(CDEFS) -o $@ $^ $(LDLIBS) $(LIB_FOR_CMOCKA)
	$(LINKER_MAKERULE)
else
test_encodings:
test_hostspec:
endif

# --- need libpcp_archive

# --- need -rdynamic
# need minimal gcc and ld flags to prevent smart-arse optimizations that
# make the callstack go away ... need to make it work both in the build
# and for ~pcpcqa once packages installed
#
dumpstack:	dumpstack.c
	rm -f $@
ifeq "$(TOPDIR)" ""
	$(CC) -I$(PCP_INC_DIR) -I. $(PCFLAGS) -o $@ -rdynamic $^ -lpcp
	$(LINKER_MAKERULE)
else
	$(CC) -I$(TOPDIR)/src/include -I. $(PCFLAGS) -o $@ -rdynamic $^ -L$(TOPDIR)/src/libpcp/$(LIBPCP_ABIDIR) $(LDLIBS) -lpcp
	$(LINKER_MAKERULE)
endif

ifneq ($(NVIDIAQALIB),)
$(NVIDIAQALIB):	nvidia-ml.o
	$(CC) $(LDFLAGS) $(_SHAREDOPTS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)
endif

ifneq ($(IBUMADQALIB),)
$(IBUMADQALIB):	infiniband-umad.o
	$(CC) $(LDFLAGS) $(_SHAREDOPTS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)

$(IBVERBSQALIB):	infiniband-verbs.o
	$(CC) $(LDFLAGS) $(_SHAREDOPTS) -o $@ $< $(LDLIBS)
	$(LINKER_MAKERULE)
endif

arch_maxfd.o:	localconfig.h

779246.o:	libpcp.h
aggrstore.o:	libpcp.h
badmmv.o:	libpcp.h
chkacc1.o:	libpcp.h
chkacc2.o:	libpcp.h
chkacc3.o:	libpcp.h
chkacc4.o:	libpcp.h
chkhelp.o:	libpcp.h
chkctx2.o:	libpcp.h
chk_memleak.o:	libpcp.h
chknumval.o:	libpcp.h
chkoptfetch.o:	libpcp.h
chklogputresult.o:	libpcp.h
churnctx.o:	libpcp.h
clientid.o:	libpcp.h
clienttimeout.o:	libpcp.h
context_test.o:	libpcp.h
crashpmcd.o:	libpcp.h
debug.o:	libpcp.h
defctx.o:	libpcp.h
descreqX2.o:	libpcp.h
disk_test.o:	libpcp.h
dumb_pmda.o:	libpcp.h
endian.o:	libpcp.h
eofarch.o:	libpcp.h
eol.o:	libpcp.h
exectest.o:	libpcp.h
exercise.o:	libpcp.h
exerlock.o:	libpcp.h
fetchpdu.o:	libpcp.h
github-50.o:	libpcp.h
hashwalk.o:	libpcp.h
hex2nbo.o:	libpcp.h
hp-mib.o:	libpcp.h
hrunpack.o:	libpcp.h
interp0.o:	libpcp.h
interp1.o:	libpcp.h
interp2.o:	libpcp.h
interp3.o:	libpcp.h
interp4.o:	libpcp.h
interp_bug2.o:	libpcp.h
interp_bug.o:	libpcp.h
ipc.o:	libpcp.h
logcontrol.o:	libpcp.h
mmv_noinit.o:	libpcp.h
mmv_poke.o:	libpcp.h
multictx.o:	libpcp.h
multithread0.o:	libpcp.h
multithread1.o:	libpcp.h
multithread2.o:	libpcp.h
multithread3.o:	libpcp.h
multithread4.o:	libpcp.h
multithread8.o:	libpcp.h
multithread9.o:	libpcp.h
multithread10.o:	libpcp.h
multithread14.o:	libpcp.h
nameall.o:	libpcp.h
parsehostattrs.o:	libpcp.h
parsehostspec.o:	libpcp.h
pdubufbounds.o:	libpcp.h localconfig.h
pducheck.o:	libpcp.h localconfig.h
pducrash.o:	libpcp.h
pdu-server.o:	libpcp.h localconfig.h
pmcdgone.o:	libpcp.h
pmlcmacro.o:	libpcp.h
pmnsinarchives.o:	libpcp.h
pmnsunload.o:	libpcp.h localconfig.h
proc_test.o:	libpcp.h
qa_libpcp_compat.o:	libpcp.h
qa_timezone.o:	libpcp.h
recon.o:	libpcp.h
rtimetest.o:	libpcp.h
series_time_parse_test.o:	libpcp.h
slow_af.o:	libpcp.h
sortinst.o:	libpcp.h
store.o:	libpcp.h
storepmcd.o:	libpcp.h
stripmark.o:	libpcp.h
throttle.o:	libpcp.h
timeshift.o:	libpcp.h
torture_api.o:	libpcp.h
torture_indom.o:	libpcp.h
torture_logmeta.o:	libpcp.h
torture_pmns.o:	libpcp.h
tztest.o:	libpcp.h
unpack.o:	libpcp.h
unpickargs.o:	libpcp.h
username.o:	localconfig.h
xarch.o:	libpcp.h
xlog.o:	libpcp.h
xmktime.o:	libpcp.h
xxx.o:	libpcp.h
y2038.o:	libpcp.h

check_cloexec.o:	libpcp.h

bozo:
	@echo CFILES_TARGETS=$(CFILES_TARGETS)
	@echo "patsubst ->" $(patsubst %.c,%,$(CFILES_TARGETS))
	@echo "basename ->" $(basename $(patsubst %.c,%,$(CFILES_TARGETS)))
	@echo "subst ->" $(subst broken_pmda,,$(basename $(patsubst %.c,%,$(CFILES_TARGETS))))
	@echo TARGETS=$(TARGETS)
