Skip to content

Instantly share code, notes, and snippets.

@7etsuo
Created February 8, 2025 01:04
Show Gist options
  • Save 7etsuo/254ca2f5fb1d2ef09c30283f3fb34216 to your computer and use it in GitHub Desktop.
Save 7etsuo/254ca2f5fb1d2ef09c30283f3fb34216 to your computer and use it in GitHub Desktop.
Makefile
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