# Root Makefile for uTun - Out-of-tree build wrapper # This Makefile provides convenient targets for building in a separate directory # while keeping binaries in the project root. # Build directory BUILD_DIR = build # Detect source directory (where this Makefile is located) SRC_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST)))) # Check if build directory is configured BUILD_CONFIGURED := $(shell test -f $(BUILD_DIR)/Makefile && echo yes || echo no) # Default target: build everything .PHONY: all all: ifeq ($(BUILD_CONFIGURED),yes) @$(MAKE) -C $(BUILD_DIR) all else @echo "Build directory not configured. Run 'make setup' first." @exit 1 endif # Setup target: create build directory and configure .PHONY: setup setup: @echo "Setting up build in $(BUILD_DIR)/..." @mkdir -p $(BUILD_DIR) @if test ! -f $(BUILD_DIR)/Makefile; then \ echo "Running configure..."; \ cd $(BUILD_DIR) && $(SRC_DIR)/configure; \ else \ echo "Build already configured."; \ fi @echo "Setup complete. Run 'make' to build." # Reconfigure target .PHONY: reconfigure reconfigure: @rm -rf $(BUILD_DIR) @$(MAKE) setup # Build just the main binary (skip tests) .PHONY: utun utun: ifeq ($(BUILD_CONFIGURED),yes) @$(MAKE) -C $(BUILD_DIR)/lib @$(MAKE) -C $(BUILD_DIR)/src @echo "utun binary built successfully." else @echo "Build directory not configured. Run 'make setup' first." @exit 1 endif # Run tests (make all builds everything including tests) .PHONY: check test check: all ifeq ($(BUILD_CONFIGURED),yes) @$(MAKE) -C $(BUILD_DIR) check else @echo "Build directory not configured. Run 'make setup' first." @exit 1 endif test: check # Clean build directory .PHONY: clean clean: ifeq ($(BUILD_CONFIGURED),yes) @$(MAKE) -C $(BUILD_DIR) clean else @echo "Build directory not configured." endif # Full clean - remove build directory and generated files .PHONY: distclean distclean: @rm -rf $(BUILD_DIR) @echo "Build directory removed." # Install from build directory .PHONY: install install: all @$(MAKE) -C $(BUILD_DIR) install # Debug build setup .PHONY: setup-debug setup-debug: @echo "Setting up debug build in $(BUILD_DIR)/..." @mkdir -p $(BUILD_DIR) cd $(BUILD_DIR) && $(SRC_DIR)/configure --enable-debug # Release build setup .PHONY: setup-release setup-release: @echo "Setting up release build in $(BUILD_DIR)/..." @mkdir -p $(BUILD_DIR) cd $(BUILD_DIR) && $(SRC_DIR)/configure --disable-debug # Print help .PHONY: help help: @echo "uTun Build System (Out-of-tree build)" @echo "======================================" @echo "" @echo "Setup targets:" @echo " setup - Configure the build directory" @echo " setup-debug - Configure for debug build" @echo " setup-release - Configure for release build" @echo " reconfigure - Clean and reconfigure build" @echo "" @echo "Build targets:" @echo " all - Build everything: lib, src, tests" @echo " utun - Build only main utun binary (faster)" @echo " check - Run all tests (builds if needed)" @echo " test - Alias for check" @echo " install - Install binaries" @echo "" @echo "Maintenance:" @echo " clean - Clean build artifacts" @echo " distclean - Remove build directory completely" @echo " help - Show this help" @echo "" @echo "Build directory: $(BUILD_DIR)/" @echo "Source directory: $(SRC_DIR)/" @echo "" @echo "Usage: make setup && make" # Pass through any unknown targets to the build directory if configured .PHONY: % %: ifeq ($(BUILD_CONFIGURED),yes) @$(MAKE) -C $(BUILD_DIR) $@ else @echo "Build directory not configured. Run 'make setup' first." @exit 1 endif