113 lines
3.1 KiB
Makefile
113 lines
3.1 KiB
Makefile
# Variables
|
|
BUILD_DIR = build
|
|
CMAKE = cmake
|
|
CMAKE_BUILD = cmake --build
|
|
CMAKE_FLAGS = -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
|
|
CONFIG_FILE = config/default.conf
|
|
|
|
# Environment detection
|
|
ifeq ($(shell whoami),vscode)
|
|
CURRENT_ENV = container
|
|
else ifneq ($(REMOTE_CONTAINERS),)
|
|
CURRENT_ENV = container
|
|
else
|
|
CURRENT_ENV = local
|
|
endif
|
|
|
|
# Check if build directory was created in different environment
|
|
ifneq ($(wildcard $(BUILD_DIR)/.build-env),)
|
|
PREVIOUS_ENV := $(shell cat $(BUILD_DIR)/.build-env 2>/dev/null || echo "unknown")
|
|
ifneq ($(PREVIOUS_ENV),$(CURRENT_ENV))
|
|
$(info Detected environment switch from $(PREVIOUS_ENV) to $(CURRENT_ENV) - cleaning build directory)
|
|
$(shell rm -rf $(BUILD_DIR))
|
|
endif
|
|
endif
|
|
|
|
# Default target
|
|
all: release
|
|
|
|
# Configure CMake if build directory doesn't exist
|
|
$(BUILD_DIR):
|
|
$(CMAKE) -B $(BUILD_DIR) $(CMAKE_FLAGS)
|
|
@echo "$(CURRENT_ENV)" > $(BUILD_DIR)/.build-env
|
|
|
|
# Build targets with specific build types
|
|
release: $(BUILD_DIR)
|
|
$(CMAKE) -B $(BUILD_DIR) $(CMAKE_FLAGS) -DCMAKE_BUILD_TYPE=Release
|
|
$(CMAKE_BUILD) $(BUILD_DIR) --target webserv --parallel
|
|
@echo "$(CURRENT_ENV)" > $(BUILD_DIR)/.build-env
|
|
|
|
debug: $(BUILD_DIR)
|
|
$(CMAKE) -B $(BUILD_DIR) $(CMAKE_FLAGS) -DCMAKE_BUILD_TYPE=Debug
|
|
$(CMAKE_BUILD) $(BUILD_DIR) --target webserv --parallel
|
|
@echo "$(CURRENT_ENV)" > $(BUILD_DIR)/.build-env
|
|
|
|
asan: $(BUILD_DIR)
|
|
$(CMAKE) -B $(BUILD_DIR) $(CMAKE_FLAGS) -DCMAKE_BUILD_TYPE=ASAN
|
|
$(CMAKE_BUILD) $(BUILD_DIR) --target webserv --parallel
|
|
@echo "$(CURRENT_ENV)" > $(BUILD_DIR)/.build-env
|
|
|
|
run: run_release
|
|
|
|
# Run targets
|
|
run_release: release
|
|
./$(BUILD_DIR)/webserv $(CONFIG_FILE)
|
|
|
|
run_debug: debug
|
|
./$(BUILD_DIR)/webserv $(CONFIG_FILE)
|
|
|
|
run_asan: asan
|
|
./$(BUILD_DIR)/webserv $(CONFIG_FILE)
|
|
|
|
# Clean targets
|
|
clean:
|
|
@if [ -d "$(BUILD_DIR)" ]; then \
|
|
$(CMAKE_BUILD) $(BUILD_DIR) --target clean; \
|
|
fi
|
|
|
|
fclean:
|
|
rm -rf $(BUILD_DIR)
|
|
|
|
# Rebuild everything
|
|
re: fclean all
|
|
|
|
# Test targets
|
|
test: release
|
|
@echo "Building and running tests..."
|
|
$(CMAKE_BUILD) $(BUILD_DIR) --target webserv_tests --parallel
|
|
cd $(BUILD_DIR) && ctest --output-on-failure
|
|
|
|
test_verbose: release
|
|
@echo "Building and running tests with verbose output..."
|
|
$(CMAKE_BUILD) $(BUILD_DIR) --target webserv_tests --parallel
|
|
cd $(BUILD_DIR) && ctest --verbose
|
|
|
|
test_build: release
|
|
@echo "Building tests only..."
|
|
$(CMAKE_BUILD) $(BUILD_DIR) --target webserv_tests --parallel
|
|
|
|
# Coverage targets
|
|
coverage:
|
|
@echo "Running coverage analysis..."
|
|
./scripts/coverage.sh
|
|
|
|
coverage_clean:
|
|
@echo "Cleaning coverage data..."
|
|
rm -rf build_coverage
|
|
|
|
# Manual coverage build (advanced users)
|
|
coverage_manual:
|
|
@echo "Building with coverage manually..."
|
|
@mkdir -p build_coverage
|
|
cd build_coverage && $(CMAKE) .. -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTS=ON -DENABLE_COVERAGE=ON $(CMAKE_FLAGS)
|
|
$(CMAKE_BUILD) build_coverage
|
|
cd build_coverage && $(CMAKE_BUILD) . --target coverage
|
|
|
|
# Code formatting target
|
|
format:
|
|
@echo "Running code formatting..."
|
|
./scripts/format.sh
|
|
|
|
# Mark targets as phony
|
|
.PHONY: all release debug asan run run_release run_debug run_asan clean fclean re test test_verbose test_build coverage coverage_clean coverage_manual format
|