# The MIT License (MIT)
#
# Copyright (C) 2026 Scott Duensing
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to
# deal in the Software without restriction, including without limitation the
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
# sell copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.

# basdev suite: the basdev library (compiler.bas / debug.bas entry
# points), the shared debugger, validator and proc scanner, and the run
# host -- from C and from a BASIC program making DECLARE LIBRARY calls for
# real.  The BASIC program is the DOS fixture src/test/dos/fixtures/paride
# (it compiles, debugs and builds the project in its kid folder).
#
#     make -C src/test/basdev          # build + run (SAN=1 default)

.DEFAULT_GOAL := all

include ../dvxtest/dvxtest.mk

DVXBASIC   = $(DVXTEST_BASICDIR)
BINDIR     = $(DVXTEST_BINDIR)/basdev
TARGET     = $(BINDIR)/testBasDev
DEV_SRCS   = basValidate.c basDebug.c basProcs.c basSource.c basHelpMap.c basProject.c basDevBas.c
OBJS       = $(BINDIR)/testBasDev.o $(BINDIR)/basBuild.o $(patsubst %.c,$(BINDIR)/%.o,$(DEV_SRCS))
CFLAGS     = $(DVXTEST_CFLAGS) -I$(DVXBASIC) -I$(DVXTEST_ROOT)/src/libs/kpunch/dvxshell -I$(DVXTEST_ROOT)/src/libs/kpunch/audio -DBDT_FIXTURE_DIR='"$(DVXTEST_ROOT)/src/test/dos/fixtures/paride"' -DBDT_INCLUDE_DIR='"$(DVXTEST_ROOT)/src/include/basic"' -DBDT_BASCOMP='"$(DVXTEST_BASCOMP)"'

.PHONY: all run clean

all: run

$(BINDIR)/%.o: %.c $(DVX_MAKEFILES)
	@mkdir -p $(BINDIR)
	$(HOSTCC) $(CFLAGS) -c -o $@ $<

$(BINDIR)/basBuild.o: $(DVXBASIC)/basBuild.c $(DVX_MAKEFILES)
	@mkdir -p $(BINDIR)
	$(HOSTCC) $(CFLAGS) -c -o $@ $<

$(BINDIR)/%.o: $(DVXBASIC)/basdev/%.c $(DVX_MAKEFILES)
	@mkdir -p $(BINDIR)
	$(HOSTCC) $(CFLAGS) -c -o $@ $<

$(TARGET): $(OBJS) $(DVXTEST_BASRT_A) $(DVXTEST_ARCHIVES) | dvxtest-libs
	$(HOSTCC) -o $@ $(OBJS) $(DVXTEST_BASRT_A) $(DVXTEST_LINK)

-include $(OBJS:.o=.d)

# Runs from its object directory so the files it writes never land in the
# source tree.  bascomp carries the STUB the build case needs.
run: $(TARGET) | dvxtest-bascomp
	cd $(BINDIR) && ASAN_OPTIONS=detect_leaks=1 ./testBasDev

clean:
	rm -rf $(BINDIR)
