CC      = gcc
CFLAGS  = -Wall -Wextra -std=c11 -O2 -D_GNU_SOURCE
LDFLAGS = -lm
BUILDDIR = build

# Source files
VM_SRCS       = src/vm/vm.c src/vm/vm_main.c src/substrate/substrate_engine.c
AS_SRCS       = src/assembler/assembler.c src/assembler/as_main.c
DISAS_SRCS    = src/disassembler/disas.c
KERNEL_SRCS   = src/kernel/kernel.c src/kernel/kernel_main.c src/hal/hal.c src/hal/hal_cpu.c src/substrate/substrate_engine.c
NODE_SRCS     = src/glyph/node_main.c src/glyph/glyph_defs.c src/glyph/graph.c src/glyph/resonance.c src/glyph/evaluator.c src/glyph/compiler.c
NET_SRCS      = src/glyph/net_main.c src/glyph/network.c src/glyph/glyphbus.c src/glyph/glyph_defs.c src/glyph/graph.c src/glyph/resonance.c src/glyph/evaluator.c src/glyph/compiler.c

# Include paths
INCLUDES = -Isrc/common -Isrc -Isrc/glyph

# Targets
TARGETS = $(BUILDDIR)/glyph-vm $(BUILDDIR)/glyph-as $(BUILDDIR)/glyph-disas $(BUILDDIR)/glyph-kernel $(BUILDDIR)/glyph-node $(BUILDDIR)/glyph-net

.PHONY: all clean test examples

all: $(BUILDDIR) $(TARGETS)
	@echo ""
	@echo "=== GlyphOS Build Complete ==="
	@echo "  $(BUILDDIR)/glyph-vm     - Glyph Virtual Machine (standalone)"
	@echo "  $(BUILDDIR)/glyph-kernel - GlyphOS Kernel (multi-GVM + HAL)"
	@echo "  $(BUILDDIR)/glyph-as     - Glyph Assembler"
	@echo "  $(BUILDDIR)/glyph-disas  - Glyph Disassembler"
	@echo "  $(BUILDDIR)/glyph-node   - Substrate Node (symbolic evaluator)"
	@echo "  $(BUILDDIR)/glyph-net    - Substrate Network (symbolic protocol)"
	@echo ""

$(BUILDDIR):
	mkdir -p $(BUILDDIR)

$(BUILDDIR)/glyph-vm: $(VM_SRCS)
	$(CC) $(CFLAGS) $(INCLUDES) -o $@ $^ $(LDFLAGS)

$(BUILDDIR)/glyph-kernel: $(KERNEL_SRCS)
	$(CC) $(CFLAGS) $(INCLUDES) -o $@ $^ $(LDFLAGS)

$(BUILDDIR)/glyph-as: $(AS_SRCS)
	$(CC) $(CFLAGS) $(INCLUDES) -o $@ $^ $(LDFLAGS)

$(BUILDDIR)/glyph-disas: $(DISAS_SRCS)
	$(CC) $(CFLAGS) $(INCLUDES) -o $@ $^ $(LDFLAGS)

$(BUILDDIR)/glyph-node: $(NODE_SRCS)
	$(CC) $(CFLAGS) $(INCLUDES) -o $@ $^ $(LDFLAGS)

$(BUILDDIR)/glyph-net: $(NET_SRCS)
	$(CC) $(CFLAGS) $(INCLUDES) -o $@ $^ $(LDFLAGS)

$(BUILDDIR)/glyph-bench: src/glyph/benchmark.c src/glyph/glyph_defs.c src/glyph/graph.c src/glyph/resonance.c src/glyph/evaluator.c src/glyph/compiler.c
	$(CC) $(CFLAGS) $(INCLUDES) -o $@ $^ $(LDFLAGS)

# Build and run the hello world example
examples: all
	$(BUILDDIR)/glyph-as examples/hello.gasm -o $(BUILDDIR)/hello.gobj
	$(BUILDDIR)/glyph-disas $(BUILDDIR)/hello.gobj
	@echo ""
	@echo "--- Running hello.gobj (standalone VM) ---"
	$(BUILDDIR)/glyph-vm -t -d $(BUILDDIR)/hello.gobj
	@echo ""
	@echo "--- Running hello.gobj (kernel) ---"
	$(BUILDDIR)/glyph-kernel -t $(BUILDDIR)/hello.gobj

# Build and run the substrate demo
substrate-demo: all
	$(BUILDDIR)/glyph-as examples/substrate_demo.gasm -o $(BUILDDIR)/substrate_demo.gobj
	@echo ""
	@echo "--- Running substrate_demo.gobj (standalone VM) ---"
	$(BUILDDIR)/glyph-vm -t -d $(BUILDDIR)/substrate_demo.gobj
	@echo ""
	@echo "--- Running substrate_demo.gobj (kernel) ---"
	$(BUILDDIR)/glyph-kernel -t $(BUILDDIR)/substrate_demo.gobj

# Run multiple GVMs through the kernel
multi-gvm: all
	$(BUILDDIR)/glyph-as examples/hello.gasm -o $(BUILDDIR)/hello.gobj
	$(BUILDDIR)/glyph-as examples/substrate_demo.gasm -o $(BUILDDIR)/substrate_demo.gobj
	@echo ""
	@echo "--- Running 2 GVMs through kernel (round-robin) ---"
	$(BUILDDIR)/glyph-kernel -t -p 0 $(BUILDDIR)/hello.gobj $(BUILDDIR)/substrate_demo.gobj
	@echo ""
	@echo "--- Running 2 GVMs through kernel (resonance) ---"
	$(BUILDDIR)/glyph-kernel -t -p 2 $(BUILDDIR)/hello.gobj $(BUILDDIR)/substrate_demo.gobj

clean:
	rm -rf $(BUILDDIR)

# Substrate node demos
node-demo: all
	@echo ""
	@echo "--- Substrate Node: Built-in Demo ---"
	$(BUILDDIR)/glyph-node demo --trace
	@echo ""
	@echo "--- Substrate Node: Compile and evaluate add.glyph ---"
	$(BUILDDIR)/glyph-node run examples/add.glyph --trace
	@echo ""
	@echo "--- Substrate Node: Compile and evaluate resonance_demo.glyph ---"
	$(BUILDDIR)/glyph-node run examples/resonance_demo.glyph --trace

# List all 64 symbolic glyph definitions
glyphs: all
	$(BUILDDIR)/glyph-node glyphs

test: examples substrate-demo
	@echo ""
	@echo "=== All tests passed ==="
