# 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.

# T6 -- DVX BASIC IDE under the dvxtest harness.
#
# Builds the IDE sources (ideMain.c is #included by testIde.c so the
# tests can inspect the IDE's file-scope state), the BASIC compiler,
# runtime, form runtime and basBuild natively, links them with the host
# libdvx and the dvxtest runner, and drives ideMain's appMain through
# menu commands, queued input and scripted dialogs.  Shell functions the
# IDE calls directly are supplied by ideStubs.c.  bin/host/bascomp is
# built too: it provides the STUB resource for Make Executable and the
# reference output the test byte-compares against.

include ../dvxtest/dvxtest.mk

.DEFAULT_GOAL := all

BASIC      := $(DVXTEST_BASICDIR)
SHELL_DIR  := $(DVXTEST_ROOT)/src/libs/kpunch/dvxshell
BINDIR     := $(DVXTEST_BINDIR)/ide
# COV builds use the instrumented compiler/runner so their executions
# count toward stub/ coverage.
# BASCOMPREL/BASRUNREL are the literal (relative) target names the
# dvxbasic Makefile declares its rules with; absolute paths only make
# when the binaries already exist.
ifeq ($(COV),1)
BASCOMP    := $(DVXTEST_ROOT)/obj/hostcov/basic/bascomp
BASRUN     := $(DVXTEST_ROOT)/obj/hostcov/basic/basrun
BASCOMPREL := ../../../../obj/hostcov/basic/bascomp
BASRUNREL  := ../../../../obj/hostcov/basic/basrun
else
BASCOMP    := $(DVXTEST_ROOT)/bin/host/bascomp
BASRUN     := $(DVXTEST_ROOT)/bin/host/basrun
BASCOMPREL := ../../../../bin/host/bascomp
BASRUNREL  := ../../../../bin/host/basrun
endif
FIXTURES   := $(abspath fixtures)
TARGET     := $(BINDIR)/testIde
STUBTARGET := $(BINDIR)/testStub

IDE_SRCS   := ideDesigner.c ideProperties.c ideProject.c ideMenuEditor.c ideToolbox.c
COMP_SRCS  := lexer.c ast.c scope.c parse.c parseExpr.c parseStmt.c parseDecl.c resolve.c resolveExpr.c typecheck.c fold.c gen.c genExpr.c genStmt.c compiler.c codegen.c strip.c obfuscate.c compact.c
RT_SRCS    := vm.c values.c dates.c serialize.c gfx.c screen.c
FRM_SRCS   := formrt.c formGfx.c formDesign.c formCtl.c frmParser.c frmModel.c frmModelBas.c basNativeHost.c basRunHost.c
DEV_SRCS   := basValidate.c basDebug.c basProcs.c basSource.c basHelpMap.c basProject.c

OBJS       := $(BINDIR)/testIde.o $(BINDIR)/ideStubs.o
OBJS       += $(patsubst %.c,$(BINDIR)/ide/%.o,$(IDE_SRCS))
OBJS       += $(patsubst %.c,$(BINDIR)/compiler/%.o,$(COMP_SRCS))
OBJS       += $(patsubst %.c,$(BINDIR)/runtime/%.o,$(RT_SRCS))
OBJS       += $(patsubst %.c,$(BINDIR)/formrt/%.o,$(FRM_SRCS))
OBJS       += $(patsubst %.c,$(BINDIR)/basdev/%.o,$(DEV_SRCS))
OBJS       += $(BINDIR)/basBuild.o

STUBOBJS   := $(BINDIR)/testStub.o $(BINDIR)/stub/basModuleRes.o
STUBOBJS   += $(patsubst %.c,$(BINDIR)/runtime/%.o,$(RT_SRCS))
STUBOBJS   += $(patsubst %.c,$(BINDIR)/formrt/%.o,$(FRM_SRCS))

CFLAGS     := $(DVXTEST_CFLAGS) -Wno-stringop-truncation -I$(BASIC) -I$(BASIC)/ide -I$(SHELL_DIR) -DIDETEST_FIXTURE_DIR='"$(FIXTURES)"' -DIDETEST_BASCOMP='"$(BASCOMP)"'

.PHONY: all run cli bascomp clean

all: run

bascomp:
	$(MAKE) -C $(BASIC) $(BASCOMPREL) $(BASRUNREL)

cli: bascomp
	BASCOMP=$(BASCOMP) BASRUN=$(BASRUN) ./runCli.sh

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

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

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

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

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

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

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

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

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

$(STUBTARGET): $(STUBOBJS) $(DVXTEST_ARCHIVES) | dvxtest-libs
	$(HOSTCC) -o $@ $(STUBOBJS) $(DVXTEST_LINK)

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

# The fonts are linked into the working folder (the designer's Font row
# cases draw with them).
run: $(TARGET) $(STUBTARGET) bascomp dvxtest-fonts
	ln -sfn $(DVXTEST_FONTS) $(BINDIR)/$(DVXTEST_FONTS_DIR)
	cd $(BINDIR) && ASAN_OPTIONS=detect_leaks=1 ./testIde
	cd $(BINDIR) && ASAN_OPTIONS=detect_leaks=1 ./testStub
	$(MAKE) cli

clean:
	rm -rf $(BINDIR)
