# Makefile for TSDSUTIL

CC       = gcc

.DEFAULT_GOAL := all

#
# TSC library installation.
#
# An explicitly supplied TSC_PATH always wins.  Otherwise search the most
# useful source-tree/user/install locations in order.
#
# Header files:
#     $(TSC_PATH)/include
#
# Library files:
#     $(TSC_PATH)/lib
#
TSC_SEARCH_PATHS := ../tsclib $(HOME)/tsclib /usr/local /usr
ifeq ($(origin TSC_PATH), undefined)
TSC_PATH := $(firstword $(foreach p,$(TSC_SEARCH_PATHS),$(if $(wildcard $(p)/include/vtape.h),$(p))))
endif

CPPFLAGS = -I. -I$(TSC_PATH)/include
CFLAGS   = -Wall -Wextra -pedantic -DTSDS_LINUX
LDFLAGS  = -L$(TSC_PATH)/lib
LDLIBS   = -ltsc_tree -lvtape -laws_tape -lebcdic_utils -lmvs_datetime -lmvs_utils -lmvs_types

TARGET   = tsdsutil

# Installation locations.  DESTDIR supports staged/package installs.
PREFIX      ?= /usr
BINDIR      ?= $(PREFIX)/bin
SYSCONFDIR  ?= /etc
DESTDIR     ?=
INSTALL     ?= install
CONFIG_SRC   = etc/tsdsutil.conf
CONFIG_DST   = $(DESTDIR)$(SYSCONFDIR)/tsdsutil.conf

SOURCES  = $(wildcard *.c)
OBJECTS  = $(SOURCES:.c=.o)

.PHONY: check-tsc static-source-test build-portability-test all install uninstall purge install-test test docs-test docs-html release-test current-services-test docs-v1.0.1-test v1.0.1-focused-test v1.0.1-test current-docs-test current-focused-test current-test phase1-test phase2-test phase3-test phase4-test phase5-test dfmt-test config-test xref-test getmain-debug-test assert-test conditional-test conddef-test trace-format-test trace-audit-test trace-detail-test trace-basic-test trace-macro-test trace-state-test trace-infra-test self-branch-test execution-limit-test statistics-test r0-audit-test listing-width-test final-link-test tu-boundary-test include-neg-test include-test copy-test entry-vcon-neg-test entry-vcon-test namespace-test tu-state-test source-identity-test execution-test exmod-test rr-run-test macro-test symbol-test storage-test expr-test equorg-test ds-test ds-bad-test dc-test dc-bad-test literal-test dcb-test dcb-bad-test report-test code-test optable-test rr-test rr-bad-test address-test address-bad-test rx-test rx-bad-test rs-test rs-bad-test si-test si-bad-test char-expr-test ss1-test ss1-bad-test ss2-test ss2-bad-test literal-address-test pragma-test instruction-regression instruction-complete-regression regression full-regression-test distclean clean branch-ext-test wto-run-test


define CHECK_TSC
	@if [ -z "$(strip $(TSC_PATH))" ]; then \
		echo "ERROR: TSC library not found." >&2; \
		echo "Set TSC_PATH=/path/to/tsclib and rerun make." >&2; \
		echo "Searched: $(TSC_SEARCH_PATHS)" >&2; \
		exit 2; \
	fi; \
	if [ ! -f "$(TSC_PATH)/include/vtape.h" ] || [ ! -f "$(TSC_PATH)/include/tsc_tree.h" ] || [ ! -d "$(TSC_PATH)/lib" ]; then \
		echo "ERROR: TSC_PATH='$(TSC_PATH)' is not a usable TSC library tree." >&2; \
		echo "Expected include/vtape.h, include/tsc_tree.h, and lib/." >&2; \
		echo "Set TSC_PATH=/path/to/tsclib and rerun make." >&2; \
		exit 2; \
	fi
endef

check-tsc:
	$(CHECK_TSC)

%.o: %.c
	$(CHECK_TSC)
	$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<

all: $(TARGET)

$(TARGET): $(OBJECTS)
	$(CHECK_TSC)
	$(CC) $(LDFLAGS) -o $@ $(OBJECTS) $(LDLIBS)

install: $(TARGET) $(CONFIG_SRC)
	$(INSTALL) -d "$(DESTDIR)$(BINDIR)"
	$(INSTALL) -m 0755 "$(TARGET)" "$(DESTDIR)$(BINDIR)/$(TARGET)"
	$(INSTALL) -d "$(DESTDIR)$(SYSCONFDIR)"
	@if [ ! -e "$(CONFIG_DST)" ]; then \
		$(INSTALL) -m 0644 "$(CONFIG_SRC)" "$(CONFIG_DST)"; \
		echo "Installed new $(SYSCONFDIR)/tsdsutil.conf"; \
	else \
		echo "Preserving existing $(SYSCONFDIR)/tsdsutil.conf"; \
	fi

uninstall:
	rm -f "$(DESTDIR)$(BINDIR)/$(TARGET)"
	@echo "Preserving $(SYSCONFDIR)/tsdsutil.conf; use 'make purge' to remove it."

purge: uninstall
	rm -f "$(CONFIG_DST)"

install-test: $(TARGET)
	python3 tests/run_install.py

build-portability-test: $(TARGET)
	python3 tests/run_build_portability.py "$(TSC_PATH)"

test: current-test

docs-test: current-docs-test

docs-html:
	python3 doc/build_html.py

release-test: current-test

static-source-test: check-tsc
	$(CC) $(CFLAGS) $(CPPFLAGS) -fsyntax-only $(SOURCES)
	python3 tests/run_static_source_audit.py

current-services-test: $(TARGET)
	python3 tests/advanced/current_services/run_current_services.py --exe ./$(TARGET) --label current

docs-v1.0.1-test:
	python3 tests/run_release.py
	python3 tests/run_doc_sync_audit.py

current-docs-test:
	python3 tests/run_release.py
	python3 tests/run_doc_sync_audit.py
	python3 tests/run_current_qa_audit.py
	python3 tests/run_advanced_replay_audit.py
	python3 tests/run_final_release_audit.py

current-focused-test: $(TARGET) current-services-test static-source-test
	python3 tests/run_current_qa.py ./$(TARGET)

current-test: current-docs-test current-focused-test install-test build-portability-test
	@echo "TSDSUTIL Version 1.0.1 release qualification passed"


v1.0.1-focused-test: $(TARGET) current-services-test
	python3 tests/regression/run_regression.py --exe ../../$(TARGET)
	cd tests/execution && python3 run_execution.py

v1.0.1-test: docs-v1.0.1-test v1.0.1-focused-test install-test build-portability-test
	@echo "TSDSUTIL Version 1.0.1 release qualification passed"


# Frozen advanced qualification suites remain directly runnable.
phase1-test: $(TARGET)
	python3 tests/advanced/phase1/run_phase1.py --exe ./$(TARGET)

phase2-test: $(TARGET)
	python3 tests/advanced/phase2/run_phase2.py --exe ./$(TARGET)

phase3-test: $(TARGET)
	python3 tests/advanced/phase3/run_phase3.py --exe ./$(TARGET)

phase4-test: $(TARGET)
	python3 tests/advanced/phase4/run_phase4.py --exe ./$(TARGET)

phase5-test: $(TARGET)
	python3 tests/advanced/phase5/run_phase5.py --exe ./$(TARGET)

dfmt-test: $(TARGET)
	python3 tests/execution/run_dfmt_v56.py ./$(TARGET)


config-test: $(TARGET)
	python3 tests/run_config_v55.py ./$(TARGET)


xref-test: $(TARGET)
	python3 tests/run_xref_v54.py ./$(TARGET)


getmain-debug-test: $(TARGET)
	python3 tests/execution/run_getmain_debug_v53.py ./$(TARGET)


assert-test: $(TARGET)
	python3 tests/execution/run_assert_v52.py ./$(TARGET)


# Source global/local line identity infrastructure verification.
conditional-test: $(TARGET)
	python3 tests/conditional/run_conditional_v41.py ./$(TARGET)

conddef-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_CONDDEF_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDTCDEF.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdscdef
	./tsdscdef
	rm -f tsdscdef

trace-format-test: $(TARGET)
	python3 tests/execution/run_trace_format_v50.py ./$(TARGET)

trace-audit-test: $(TARGET)
	python3 tests/execution/run_trace_audit_v49.py ./$(TARGET)

trace-detail-test: $(TARGET)
	python3 tests/execution/run_trace_detail_v48.py ./$(TARGET)

trace-basic-test: $(TARGET)
	python3 tests/execution/run_trace_basic_v47.py ./$(TARGET)

trace-macro-test: $(TARGET)
	python3 tests/execution/run_trace_macro_v46.py ./$(TARGET)

trace-state-test:
	$(CC) $(CPPFLAGS) -I. $(CFLAGS) -DTSDS_LINUX \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSLINX.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c \
	    TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c TSDSDDEF.c TSDSLITR.c TSDSDCB.c \
	    TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSEXSS.c TSDSADDR.c TSDMACP.c TSDSSTMT.c TSDSSTAT.c \
	    TSDSPARS.c TSDSDATE.c TSDSRUN.c TSDSTAPE.c tests/drivers/TSDTTRC.c $(LDFLAGS) $(LDLIBS) -o tsdstrace
	./tsdstrace
	rm -f tsdstrace

trace-infra-test: $(TARGET)
	python3 tests/execution/run_trace_infra_v45.py ./$(TARGET)

self-branch-test: $(TARGET)
	python3 tests/execution/run_self_branch_v44.py ./$(TARGET)

execution-limit-test: $(TARGET)
	python3 tests/execution/run_exec_limit_v42.py ./$(TARGET)

statistics-test: $(TARGET)
	python3 tests/execution/run_statistics_v39.py ./$(TARGET)

r0-audit-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_R0_AUDIT_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDTR0AU.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsr0au
	./tsdsr0au
	rm -f tsdsr0au

listing-width-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_LISTING_WIDTH_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDTLWID.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdslwid
	./tsdslwid
	rm -f tsdslwid

final-link-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_FINAL_LINK_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDTLINK.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdslink
	./tsdslink
	rm -f tsdslink

tu-boundary-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_TU_BOUNDARY_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDTTUBD.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdstubd
	./tsdstubd
	rm -f tsdstubd

include-neg-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_INCLUDE_NEG_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDTINCN.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsincn
	./tsdsincn
	rm -f tsdsincn

include-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_INCLUDE_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDTINCL.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsincl
	./tsdsincl
	rm -f tsdsincl

copy-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_COPY_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDTCOPY.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdscopy
	./tsdscopy
	rm -f tsdscopy

entry-vcon-neg-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_ENTRY_VCON_NEG_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDTENVN.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsenvn
	./tsdsenvn
	rm -f tsdsenvn

entry-vcon-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_ENTRY_VCON_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDTENTV.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsentv
	./tsdsentv
	rm -f tsdsentv

namespace-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_NAMESPACE_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDTNSPC.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsnspc
	./tsdsnspc
	rm -f tsdsnspc

tu-state-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_TU_STATE_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDTTUST.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdstust
	./tsdstust
	rm -f tsdstust

source-identity-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_SOURCE_ID_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDTSRCI.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdssrci
	./tsdssrci
	rm -f tsdssrci

# First execution-engine regression: $PRINT, $DUMP, $LINENO, $EOJ.
execution-test: $(TARGET)
	python3 tests/execution/run_execution.py


# EX modification of SS length fields (architectural length-1 encoding).
exmod-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_EXMOD_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c TSDSDATE.c TSDSRUN.c TSDSTAPE.c TSDSEXSS.c TSDSLINX.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDTEXMD.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsexmd
	./tsdsexmd
	rm -f tsdsexmd

# RR execution semantics verification.
rr-run-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_RR_RUN_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c TSDSDATE.c TSDSRUN.c TSDSTAPE.c TSDSEXSS.c tests/drivers/TSDTRRUN.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsrrun
	./tsdsrrun
	rm -f tsdsrrun

#
# Generic built-in macro invocation parameter parser verification.
#
macro-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_MACRO_PARSE_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c tests/drivers/TSDTMACP.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsmacp
	./tsdsmacp
	rm -f tsdsmacp

#
# Standalone internal symbol-table verification.
#
symbol-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_SYMBOL_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c tests/drivers/TSDSTSYM.c TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdssymt
	./tsdssymt
	rm -f tsdssymt tsdsrrpt tsdsrrbt tsdsaddt tsdsadbt tsdsrxpt tsdsrxbt tsdsrspt tsdsrsbt tsdssipt tsdssibt tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt


#
# Standalone internal virtual-storage verification.
#
storage-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_STORAGE_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c tests/drivers/TSDSTSTR.c TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsstt
	./tsdsstt
	rm -f tsdsstt tsdsaddt tsdsadbt tsdsrxpt tsdsrxbt tsdsrspt tsdsrsbt tsdssipt tsdssibt tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt


#
# Standalone internal expression verification.
#
expr-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_EXPR_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c tests/drivers/TSDSTEXP.c TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsexpt
	./tsdsexpt
	rm -f tsdsexpt tsdsaddt tsdsadbt tsdsrxpt tsdsrxbt tsdsrspt tsdsrsbt tsdssipt tsdssibt tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt


#
# Standalone EQU/ORG/DSECT integration verification.
#
equorg-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_EQUORG_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDSTEQO.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdseqot
	./tsdseqot
	rm -f tsdseqot tsdsaddt tsdsadbt tsdsrxpt tsdsrxbt tsdsrspt tsdsrsbt tsdssipt tsdssibt tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt


#
# Standalone DS allocation/grammar verification.
#
ds-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_DS_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDSTDS.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsdst
	./tsdsdst
	rm -f tsdsdst tsdsaddt tsdsadbt tsdsrxpt tsdsrxbt tsdsrspt tsdsrsbt tsdssipt tsdssibt tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt

#
# Standalone negative DS verification.
#
ds-bad-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_DS_BAD_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDSTDSB.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsdsbt
	./tsdsdsbt
	rm -f tsdsdsbt tsdsaddt tsdsadbt tsdsrxpt tsdsrxbt tsdsrspt tsdsrsbt tsdssipt tsdssibt tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt


#
# Standalone DC verification.
#
dc-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_DC_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDSTDC.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsdct
	./tsdsdct
	rm -f tsdsdct tsdsaddt tsdsadbt tsdsrxpt tsdsrxbt tsdsrspt tsdsrsbt tsdssipt tsdssibt tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt

#
# Standalone negative DC verification.
#
dc-bad-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_DC_BAD_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDSTDCB.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsdcbt
	./tsdsdcbt
	rm -f tsdsdcbt tsdsaddt tsdsadbt tsdsrxpt tsdsrxbt tsdsrspt tsdsrsbt tsdssipt tsdssibt tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt


#
# Standalone literal-pool verification.
#
literal-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_LITERAL_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    tests/drivers/TSDSTLIT.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdslitt
	./tsdslitt
	rm -f tsdslitt tsdsaddt tsdsadbt tsdsrxpt tsdsrxbt tsdsrspt tsdsrsbt tsdssipt tsdssibt tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt


#
# Standalone DCB verification.
#
dcb-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_DCB_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c TSDSCODE.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSSTMT.c TSDSSTAT.c TSDSENTR.c TSDSPARS.c tests/drivers/TSDSTDC2.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsdcbt2
	./tsdsdcbt2
	rm -f tsdsdcbt2 tsdsaddt tsdsadbt tsdsrxpt tsdsrxbt tsdsrspt tsdsrsbt tsdssipt tsdssibt tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt

#
# Standalone negative DCB verification.
#
dcb-bad-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_DCB_BAD_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c TSDSCODE.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSSTMT.c TSDSSTAT.c TSDSENTR.c TSDSPARS.c tests/drivers/TSDSTDC3.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsdcbt3
	./tsdsdcbt3
	rm -f tsdsdcbt3 tsdsaddt tsdsadbt tsdsrxpt tsdsrxbt tsdsrspt tsdsrsbt tsdssipt tsdssibt tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt


#
# Standalone listing/report verification.
#
report-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_REPORT_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c TSDSCODE.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSSTMT.c TSDSSTAT.c TSDSENTR.c TSDSPARS.c tests/drivers/TSDSTRPT.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsrptt
	./tsdsrptt
	rm -f tsdsrptt tsdsaddt tsdsadbt tsdsrxpt tsdsrxbt tsdsrspt tsdsrsbt tsdssipt tsdssibt tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt



#
# Standalone CODE storage/USING infrastructure verification.
#
code-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_CODE_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c TSDSOPTB.c TSDSADDR.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c tests/drivers/TSDSTCOD.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdscodt
	./tsdscodt tsdsoptt
	rm -f tsdscodt tsdsoptt tsdsaddt tsdsadbt tsdsrxpt tsdsrxbt tsdsrspt tsdsrsbt tsdssipt tsdssibt tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt


#
# Static instruction-definition table verification.
#
optable-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_OPTABLE_TEST \
	    TSDSOPTB.c tests/drivers/TSDSTOPT.c \
	    -o tsdsoptt
	./tsdsoptt
	rm -f tsdsoptt tsdsaddt tsdsadbt tsdsrxpt tsdsrxbt tsdsrspt tsdsrsbt tsdssipt tsdssibt tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt


#
# RR CODE parser verification.
#
rr-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_RR_PARSE_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c TSDSADDR.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDSTRRP.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsrrpt
	./tsdsrrpt
	rm -f tsdsrrpt tsdsaddt tsdsadbt tsdsrxpt tsdsrxbt tsdsrspt tsdsrsbt tsdssipt tsdssibt tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt

#
# Negative RR CODE parser verification.
#
rr-bad-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_RR_BAD_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c TSDSADDR.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDSTRRB.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsrrbt
	./tsdsrrbt
	rm -f tsdsrrbt tsdsaddt tsdsadbt tsdsrxpt tsdsrxbt tsdsrspt tsdsrsbt tsdssipt tsdssibt tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt


#
# Generic BD/XBD address parser verification.
#
address-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_ADDRESS_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    tests/drivers/TSDSTADD.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsaddt
	./tsdsaddt
	rm -f tsdsaddt tsdsrxpt tsdsrxbt tsdsrspt tsdsrsbt tsdssipt tsdssibt tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt

#
# Negative generic address parser verification.
#
address-bad-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_ADDRESS_BAD_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    tests/drivers/TSDSTADB.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsadbt
	./tsdsadbt
	rm -f tsdsadbt tsdsaddt tsdsadbt tsdsrxpt tsdsrxbt tsdsrspt tsdsrsbt tsdssipt tsdssibt tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt


#
# RX CODE parser verification.
#
rx-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_RX_PARSE_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDSTRXP.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsrxpt
	./tsdsrxpt
	rm -f tsdsrxpt tsdsrspt tsdsrsbt tsdssipt tsdssibt tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt

#
# Negative RX CODE parser verification.
#
rx-bad-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_RX_BAD_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDSTRXB.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsrxbt
	./tsdsrxbt
	rm -f tsdsrxbt tsdsrxpt tsdsrxbt tsdsrspt tsdsrsbt tsdssipt tsdssibt tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt


#
# RS CODE parser verification.
#
rs-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_RS_PARSE_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDSTRSP.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsrspt
	./tsdsrspt
	rm -f tsdsrspt tsdssipt tsdssibt tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt

#
# Negative RS CODE parser verification.
#
rs-bad-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_RS_BAD_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDSTRSB.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsrsbt
	./tsdsrsbt
	rm -f tsdsrsbt tsdsrspt tsdsrsbt tsdssipt tsdssibt tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt


#
# SI CODE parser verification.
#
si-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_SI_PARSE_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDSTSIP.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdssipt
	./tsdssipt
	rm -f tsdssipt tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt

#
# Negative SI CODE parser verification.
#
si-bad-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_SI_BAD_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDSTSIB.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdssibt
	./tsdssibt
	rm -f tsdssibt tsdssipt tsdssibt tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt


#
# Character self-defining-term expression verification.
#
char-expr-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_CHAR_EXPR_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    tests/drivers/TSDSTCHR.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdschrt
	./tsdschrt
	rm -f tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt


#
# SS1 CODE parser verification.
#
ss1-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_SS1_PARSE_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDTSS1P.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsss1t
	./tsdsss1t
	rm -f tsdsss1t tsdsss2t tsdsss2b tsdsladr tsdsprgt

#
# Negative SS1 CODE parser verification.
#
ss1-bad-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_SS1_BAD_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDTSS1B.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsss1b
	./tsdsss1b
	rm -f tsdsss1b tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt


#
# SS2 CODE parser verification.
#
ss2-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_SS2_PARSE_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDTSS2P.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsss2t
	./tsdsss2t
	rm -f tsdsss2t tsdsladr tsdsprgt

#
# Negative SS2 CODE parser verification.
#
ss2-bad-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_SS2_BAD_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDTSS2B.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsss2b
	./tsdsss2b
	rm -f tsdsss2b tsdsss2t tsdsss2b tsdsladr tsdsprgt


#
# Machine-address literal verification.
#
literal-address-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_LITERAL_ADDRESS_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDTLADR.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsladr
	./tsdsladr
	rm -f tsdsladr tsdsprgt


#
# #PRAGMA framework and assembled CODE listing verification.
#
pragma-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_PRAGMA_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c \
	    TSDSEXPR.c TSDSFIXU.c TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c \
	    TSDSOPTB.c TSDSADDR.c TSDMACP.c TSDSSTMT.c TSDSSTAT.c TSDSENTR.c TSDSPARS.c tests/drivers/TSDTPRAG.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsprgt
	./tsdsprgt
	rm -f tsdsprgt


#
# Permanent instruction-parsing regression subset.
#
instruction-regression: $(TARGET)
	python3 tests/regression/run_regression.py \
	    instr_rr_full01 \
	    instr_rx_full01 \
	    instr_rs_full01 \
	    instr_si_full01 \
	    instr_ss1_full01 \
	    instr_ss2_full01 \
	    instr_using_drop01 \
	    instr_bad_ranges01 \
	    instr_bad_using01 \
	    instr_forward_fixup01


#
# Every mnemonic in the initial instruction table, at least once.
#
instruction-complete-regression: $(TARGET)
	python3 tests/regression/run_regression.py \
	    instr_all_rr01 \
	    instr_all_rx01 \
	    instr_all_rs01 \
	    instr_all_si01 \
	    instr_all_ss1_01 \
	    instr_all_ss2_01

#
# Permanent script-level regression suite.
#
regression: $(TARGET)
	python3 tests/regression/run_regression.py


#
# Full integrated regression and audit suite.
# This target intentionally runs the current supported suite surface together.
#
full-regression-test: all \
	conddef-test conditional-test \
	source-identity-test tu-state-test namespace-test \
	entry-vcon-test entry-vcon-neg-test copy-test include-test include-neg-test \
	tu-boundary-test final-link-test \
	dcb-test dcb-bad-test wto-run-test \
	execution-test exmod-test rr-run-test branch-ext-test \
	r0-audit-test listing-width-test statistics-test \
	instruction-regression instruction-complete-regression \
	execution-limit-test self-branch-test \
	trace-infra-test trace-state-test trace-macro-test trace-basic-test \
	trace-detail-test trace-audit-test trace-format-test \
	regression
	@echo "Full integrated regression audit passed"

distclean: clean
	find . -type d -name __pycache__ -prune -exec rm -rf {} +
	rm -rf list trace

clean:
	rm -f $(OBJECTS) $(TARGET) tsdsmacp tsdssymt tsdsstt tsdsexpt tsdseqot tsdsdst tsdsdsbt tsdsdct tsdsdcbt tsdslitt tsdsdcbt2 tsdsdcbt3 tsdsrptt tsdscodt tsdsoptt tsdsaddt tsdsadbt tsdsrxpt tsdsrxbt tsdsrspt tsdsrsbt tsdssipt tsdssibt tsdschrt tsdsss1t tsdsss1b tsdsss2t tsdsss2b tsdsladr tsdsprgt tsdssrci


branch-ext-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_BRANCH_EXT_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDTBREX.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdsbext
	./tsdsbext
	rm -f tsdsbext


wto-run-test:
	$(CC) $(CPPFLAGS) -Wall -Wextra -pedantic -DTSDS_LINUX \
	    -DTSDS_WTO_RUN_TEST \
	    TSDSLINK.c TSDSCOND.c TSDSMAIN.c TSDSSRC.c TSDSTU.c TSDSPRAG.c TSDSCLST.c TSDSDIAG.c TSDSSYMB.c TSDSSTOR.c TSDSEXPR.c TSDSFIXU.c \
	    TSDSDDEF.c TSDSLITR.c TSDSDCB.c TSDSCODE.c TSDSENTR.c TSDSOPTB.c TSDSADDR.c TSDMACP.c TSDSDATE.c TSDSRUN.c TSDSTAPE.c TSDSEXSS.c \
	    TSDSSTMT.c TSDSSTAT.c TSDSPARS.c tests/drivers/TSDTWTOR.c \
	    $(LDFLAGS) $(LDLIBS) -o tsdswtor
	./tsdswtor
	rm -f tsdswtor
