# Simple Makefile wrapper around CMake BUILD_DIR ?= build CMAKE ?= cmake # Default to a build with extra logging disabled CMAKE_FLAGS ?= -DFUN_DEBUG=OFF # Optional: override default library directory for #include <...> lookups # Usage: make DEFAULT_LIB_DIR=/custom/fun/lib # This injects a compiler define: -DDEFAULT_LIB_DIR="/custom/fun/lib/" ifneq ($(strip $(DEFAULT_LIB_DIR)),) CMAKE_FLAGS += -DCMAKE_C_FLAGS="$(CMAKE_C_FLAGS) -DDEFAULT_LIB_DIR=\\\"$(DEFAULT_LIB_DIR)/\\\"" CMAKE_FLAGS += -DCMAKE_CXX_FLAGS="$(CMAKE_CXX_FLAGS) -DDEFAULT_LIB_DIR=\\\"$(DEFAULT_LIB_DIR)/\\\"" else # Provide OS-specific defaults for Windows, macOS, Linux/Unix ifeq ($(OS),Windows_NT) CMAKE_FLAGS += -DCMAKE_C_FLAGS="$(CMAKE_C_FLAGS) -DDEFAULT_LIB_DIR=\\\"C:/Users/Public/fun/lib/\\\"" CMAKE_FLAGS += -DCMAKE_CXX_FLAGS="$(CMAKE_CXX_FLAGS) -DDEFAULT_LIB_DIR=\\\"C:/Users/Public/fun/lib/\\\"" else UNAME_S := $(shell uname -s) ifeq ($(UNAME_S),Darwin) CMAKE_FLAGS += -DCMAKE_C_FLAGS="$(CMAKE_C_FLAGS) -DDEFAULT_LIB_DIR=\\\"/Library/Application Support/fun/lib/\\\"" CMAKE_FLAGS += -DCMAKE_CXX_FLAGS="$(CMAKE_CXX_FLAGS) -DDEFAULT_LIB_DIR=\\\"/Library/Application Support/fun/lib/\\\"" else CMAKE_FLAGS += -DCMAKE_C_FLAGS="$(CMAKE_C_FLAGS) -DDEFAULT_LIB_DIR=\\\"/usr/share/fun/lib/\\\"" CMAKE_FLAGS += -DCMAKE_CXX_FLAGS="$(CMAKE_CXX_FLAGS) -DDEFAULT_LIB_DIR=\\\"/usr/share/fun/lib/\\\"" endif endif endif .PHONY: all configure build fun fun_test test_opcodes clean distclean install repl run all: clean fun fun_test test_opcodes # One-time configure (re-runs harmlessly) configure: $(CMAKE) -S . -B $(BUILD_DIR) $(CMAKE_FLAGS) # Build aggregate build: configure $(CMAKE) --build $(BUILD_DIR) fun: configure $(CMAKE) --build $(BUILD_DIR) --target fun fun_test: configure $(CMAKE) --build $(BUILD_DIR) --target fun_test test_opcodes: configure $(CMAKE) --build $(BUILD_DIR) --target test_opcodes # Clean via CMake (if configured) clean: $(CMAKE) --build $(BUILD_DIR) --target clean || true # Full clean: remove the build directory entirely distclean: $(CMAKE) --build $(BUILD_DIR) --target distclean || true # Install to fixed paths defined in CMake (may require sudo): # - Binary : /usr/bin/fun # - Examples : /usr/share/fun/examples/*.fun # - Docs : /usr/share/doc/fun/README.md, LICENSE install: $(CMAKE) --install $(BUILD_DIR) # Convenience: run REPL repl: fun ./$(BUILD_DIR)/fun # Convenience: run a script (usage: make run SCRIPT=examples/strings_test.fun) run: fun ./$(BUILD_DIR)/fun $(SCRIPT) # Additional convenience targets .PHONY: verify-ops examples run-examples # Verify that each OP_* in bytecode.h has a corresponding vm_case_*.inc include in vm.c verify-ops: @./scripts/check_op_includes.py --verbose # Build and run all examples (searches for the fun binary automatically) examples run-examples: fun @./scripts/run_examples.sh