CC = gcc CFLAGS = -Wall -Wextra -O2 -Isrc LDFLAGS = -lm SRC_DIR = src TEST_DIR = tests EXAMPLE_DIR = examples BUILD_DIR = build BIN_DIR = bin TARGET = $(BIN_DIR)/rc SOURCES = $(SRC_DIR)/main.c \ $(SRC_DIR)/globals.c \ $(SRC_DIR)/tokenizer.c \ $(SRC_DIR)/parser.c \ $(SRC_DIR)/interpreter.c \ $(SRC_DIR)/native_functions.c \ $(SRC_DIR)/string_utils.c OBJECTS = $(SOURCES:$(SRC_DIR)/%.c=$(BUILD_DIR)/%.o) TESTS = $(TEST_DIR)/feature_test.rc \ $(TEST_DIR)/endless_loop_test.rc \ $(TEST_DIR)/math_test.rc \ $(TEST_DIR)/string_test.rc \ $(TEST_DIR)/string_manip_test.rc EXAMPLES = $(EXAMPLE_DIR)/test.rc \ $(EXAMPLE_DIR)/demo.rc \ $(EXAMPLE_DIR)/a.rc .PHONY: all clean test run-tests run-examples help dirs all: dirs $(TARGET) dirs: @mkdir -p $(BUILD_DIR) $(BIN_DIR) $(BUILD_DIR)/%.o: $(SRC_DIR)/%.c $(CC) $(CFLAGS) -c $< -o $@ $(TARGET): $(OBJECTS) $(CC) $(OBJECTS) -o $(TARGET) $(LDFLAGS) clean: rm -rf $(BUILD_DIR) $(BIN_DIR) test: $(TARGET) @echo "=== Running All Tests ===" @echo "" @echo "Running feature tests..." @$(TARGET) $(TEST_DIR)/feature_test.rc 2>&1 | grep -v "Error at token" || true @echo "" @echo "Running endless loop test..." @$(TARGET) $(TEST_DIR)/endless_loop_test.rc 2>&1 | grep -v "Error at token" || true @echo "" @echo "Running math tests..." @$(TARGET) $(TEST_DIR)/math_test.rc 2>&1 | grep -v "Error at token" || true @echo "" @echo "Running string concatenation tests..." @$(TARGET) $(TEST_DIR)/string_test.rc 2>&1 | grep -v "Error at token" || true @echo "" @echo "Running string manipulation tests..." @$(TARGET) $(TEST_DIR)/string_manip_test.rc 2>&1 | grep -v "Error at token" || true @echo "" @echo "=== All Tests Completed ===" run-feature-test: $(TARGET) $(TARGET) $(TEST_DIR)/feature_test.rc run-endless-loop: $(TARGET) $(TARGET) $(TEST_DIR)/endless_loop_test.rc run-math-test: $(TARGET) $(TARGET) $(TEST_DIR)/math_test.rc run-string-test: $(TARGET) $(TARGET) $(TEST_DIR)/string_test.rc run-string-manip: $(TARGET) $(TARGET) $(TEST_DIR)/string_manip_test.rc run-example-test: $(TARGET) $(TARGET) $(EXAMPLE_DIR)/test.rc run-example-demo: $(TARGET) $(TARGET) $(EXAMPLE_DIR)/demo.rc run-example-a: $(TARGET) $(TARGET) $(EXAMPLE_DIR)/a.rc help: @echo "RC - Retoor's C Interpreter" @echo "" @echo "Usage:" @echo " make - Build the interpreter" @echo " make test - Run all feature tests" @echo " make clean - Remove all build artifacts" @echo "" @echo "Individual Tests:" @echo " make run-feature-test - Run feature_test.rc (negative numbers, ==, !=)" @echo " make run-endless-loop - Run endless_loop_test.rc (while(1) test)" @echo " make run-math-test - Run math_test.rc (math functions)" @echo " make run-string-test - Run string_test.rc (string concatenation)" @echo " make run-string-manip - Run string_manip_test.rc (string manipulation & slicing)" @echo "" @echo "Examples:" @echo " make run-example-test - Run test.rc (HTTP server)" @echo " make run-example-demo - Run demo.rc (HTTP server with counter)" @echo " make run-example-a - Run a.rc (HTTP server, 100 connections)" @echo "" @echo "Directory Structure:" @echo " src/ - Source code files" @echo " tests/ - Test programs (.rc files)" @echo " examples/ - Example programs (.rc files)" @echo " build/ - Compiled object files" @echo " bin/ - Final executable (rc)"