Created
February 8, 2025 01:04
-
-
Save 7etsuo/254ca2f5fb1d2ef09c30283f3fb34216 to your computer and use it in GitHub Desktop.
Makefile
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
CC := gcc | |
AR := ar | |
CFLAGS_COMMON := -I./include -Wall -Wextra -Wpedantic -std=c11 -pthread \ | |
-D_GNU_SOURCE -fPIC -fstack-protector-strong \ | |
-fvisibility=hidden -pipe -Wunreachable-code \ | |
-Wno-unused-parameter | |
SECURITY_FLAGS := -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security \ | |
-Werror=format-security -fstack-clash-protection \ | |
-fcf-protection=full -Wconversion -Wshadow | |
BUILD_TYPE ?= release | |
ifeq ($(BUILD_TYPE),debug) | |
CFLAGS := $(CFLAGS_COMMON) $(SECURITY_FLAGS) -g -O1 -DDEBUG \ | |
-fsanitize=address -fsanitize=undefined | |
LDFLAGS := -pthread -fsanitize=address -fsanitize=undefined | |
BUILD_DIR := build/debug | |
else | |
CFLAGS := $(CFLAGS_COMMON) $(SECURITY_FLAGS) -O2 -DNDEBUG \ | |
-fdata-sections -ffunction-sections | |
LDFLAGS := -pthread -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now \ | |
-Wl,--gc-sections | |
BUILD_DIR := build/release | |
endif | |
SRC_DIR := src | |
TEST_DIR := test | |
OBJ_DIR := $(BUILD_DIR)/obj | |
BIN_DIR := $(BUILD_DIR)/bin | |
LIB_DIR := $(BUILD_DIR)/lib | |
SRC_FILES := $(filter-out $(SRC_DIR)/main.c, $(wildcard $(SRC_DIR)/*.c)) | |
OBJ_FILES := $(SRC_FILES:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o) | |
MAIN_OBJ := $(OBJ_DIR)/main.o | |
TEST_SRC := $(wildcard $(TEST_DIR)/*.c) | |
TEST_BINS := $(TEST_SRC:$(TEST_DIR)/%.c=$(BIN_DIR)/%) | |
LIB_NAME := libmemstrategy.a | |
STATIC_LIB := $(LIB_DIR)/$(LIB_NAME) | |
MAIN_BIN := $(BIN_DIR)/memory_strategy | |
MAIN_SRCS := src/main.c \ | |
src/default_strategy.c \ | |
src/memory_stats.c \ | |
src/memory_fragmentation.c \ | |
src/memory_sanitization.c \ | |
src/strategy_status.c \ | |
src/memory_pool_strategy.c \ | |
src/memory_defrag.c \ | |
src/memory_pattern_analyzer.c \ | |
src/strategy_validator.c | |
MAIN_OBJS := $(MAIN_SRCS:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o) | |
.PHONY: all clean test debug release build_tests docs | |
all: $(MAIN_BIN) $(STATIC_LIB) | |
debug: | |
$(MAKE) BUILD_TYPE=debug | |
release: | |
$(MAKE) BUILD_TYPE=release | |
$(BUILD_DIR) $(OBJ_DIR) $(BIN_DIR) $(LIB_DIR): | |
mkdir -p $@ | |
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR) | |
$(CC) $(CFLAGS) -c $< -o $@ | |
$(MAIN_BIN): $(MAIN_OBJS) | $(BIN_DIR) | |
$(CC) $(MAIN_OBJS) -o $@ $(LDFLAGS) | |
$(STATIC_LIB): $(OBJ_FILES) | $(LIB_DIR) | |
$(AR) rcs $@ $^ | |
build_tests: $(TEST_BINS) | |
$(BIN_DIR)/%: $(TEST_DIR)/%.c $(STATIC_LIB) | $(BIN_DIR) | |
$(CC) $(CFLAGS) $< $(STATIC_LIB) -o $@ $(LDFLAGS) | |
test: build_tests | |
@for test in $(TEST_BINS); do \ | |
echo "Running $$test..."; \ | |
$$test || exit 1; \ | |
done | |
docs: | $(BUILD_DIR) | |
doxygen Doxyfile | |
@echo "Documentation generated in docs/ directory" | |
clean: | |
rm -rf build docs | |
find . -name "*.o" -type f -delete | |
find . -name "*.d" -type f -delete | |
find . -type f -name "test_*" ! -path "*/test/*" -delete |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment