From 3c17f5d73a3bc51385ba0601e4086d7c3b73efd6 Mon Sep 17 00:00:00 2001 From: Anton Sidorov Date: Sat, 29 Mar 2025 02:08:13 +0000 Subject: [PATCH 1/2] debug_release: --- Makefile | 145 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 100 insertions(+), 45 deletions(-) diff --git a/Makefile b/Makefile index 5af9ca6..bab6743 100644 --- a/Makefile +++ b/Makefile @@ -1,85 +1,140 @@ CC = clang -CFLAGS = -Wall -Werror -Wextra -Wpedantic -fPIC -CFLAGS_RELEASE = -O2 -ffunction-sections -flto -CFLAGS_DEBUG = -g -LDFLAGS += -Wl,--gc-sections -flto -s +CFLAGS = -Wall -Wextra -Wpedantic -fPIC +CFLAGS_RELEASE = -O2 -ffunction-sections -flto -DNDEBUG +CFLAGS_DEBUG = -g -O0 -DDEBUG -Werror -fsanitize=address,undefined -fno-omit-frame-pointer +LDFLAGS_RELEASE = -Wl,--gc-sections -flto -s +LDFLAGS_DEBUG = -fsanitize=address,undefined BIN_DIR = bin -MAIN_STATIC_BIN = $(BIN_DIR)/csky_static -MAIN_SHARED_BIN = $(BIN_DIR)/csky_shared +DEBUG_BIN_DIR = $(BIN_DIR)/debug +RELEASE_BIN_DIR = $(BIN_DIR)/release +MAIN_STATIC_BIN_RELEASE = $(RELEASE_BIN_DIR)/csky_static +MAIN_SHARED_BIN_RELEASE = $(RELEASE_BIN_DIR)/csky_shared +MAIN_STATIC_BIN_DEBUG = $(DEBUG_BIN_DIR)/csky_static +MAIN_SHARED_BIN_DEBUG = $(DEBUG_BIN_DIR)/csky_shared MAIN_SRC = $(wildcard main/*.c) TEST_BIN_DIR = test/bin +TEST_DEBUG_BIN_DIR = $(TEST_BIN_DIR)/debug +TEST_RELEASE_BIN_DIR = $(TEST_BIN_DIR)/release LIB_DIR = lib +DEBUG_LIB_DIR = $(LIB_DIR)/debug +RELEASE_LIB_DIR = $(LIB_DIR)/release INCLUDE_DIR = include +CRUX_INCLUDE_DIR = ../crux/include LIB_NAME = csky -STATIC_LIB = $(LIB_DIR)/lib$(LIB_NAME).a -SHARED_LIB = $(LIB_DIR)/lib$(LIB_NAME).so +STATIC_LIB_RELEASE = $(RELEASE_LIB_DIR)/lib$(LIB_NAME).a +SHARED_LIB_RELEASE = $(RELEASE_LIB_DIR)/lib$(LIB_NAME).so +STATIC_LIB_DEBUG = $(DEBUG_LIB_DIR)/lib$(LIB_NAME).a +SHARED_LIB_DEBUG = $(DEBUG_LIB_DIR)/lib$(LIB_NAME).so CRUX_BASE_DIR = ../crux CRUX_LIB_NAME = crux CRUX_LIB_DIR = $(CRUX_BASE_DIR)/lib +CRUX_DEBUG_LIB_DIR = $(CRUX_LIB_DIR)/debug +CRUX_RELEASE_LIB_DIR = $(CRUX_LIB_DIR)/release CRUX_INCLUDE_DIR = $(CRUX_BASE_DIR)/include -CRUX_STATIC_LIB = $(CRUX_LIB_DIR)/lib$(CRUX_LIB_NAME).a -CRUX_SHARED_LIB = $(CRUX_LIB_DIR)/lib$(CRUX_LIB_NAME).so +CRUX_STATIC_LIB_RELEASE = $(CRUX_RELEASE_LIB_DIR)/lib$(CRUX_LIB_NAME).a +CRUX_SHARED_LIB_RELEASE = $(CRUX_RELEASE_LIB_DIR)/lib$(CRUX_LIB_NAME).so +CRUX_STATIC_LIB_DEBUG = $(CRUX_DEBUG_LIB_DIR)/lib$(CRUX_LIB_NAME).a +CRUX_SHARED_LIB_DEBUG = $(CRUX_DEBUG_LIB_DIR)/lib$(CRUX_LIB_NAME).so +TEST_SRC = $(wildcard test/src/*.c) TEST_MAIN = $(wildcard test/*.c) -TEST_STATIC_BIN = $(TEST_BIN_DIR)/test_csky_static -TEST_SHARED_BIN = $(TEST_BIN_DIR)/test_csky_shared +TEST_STATIC_BIN_RELEASE = $(TEST_RELEASE_BIN_DIR)/test_csky_static +TEST_SHARED_BIN_RELEASE = $(TEST_RELEASE_BIN_DIR)/test_csky_shared +TEST_STATIC_BIN_DEBUG = $(TEST_DEBUG_BIN_DIR)/test_csky_static +TEST_SHARED_BIN_DEBUG = $(TEST_DEBUG_BIN_DIR)/test_csky_shared # Gather all source files automatically SRC_FILES := $(wildcard src/*.c) -OBJ_FILES := $(patsubst src/%.c, $(LIB_DIR)/%.o, $(SRC_FILES)) +RELEASE_OBJ_FILES := $(patsubst src/%.c, $(RELEASE_LIB_DIR)/%.o, $(SRC_FILES)) +DEBUG_OBJ_FILES := $(patsubst src/%.c, $(DEBUG_LIB_DIR)/%.o, $(SRC_FILES)) # Targets -all: $(STATIC_LIB) $(SHARED_LIB) test_static test_shared main_static main_shared +all: release debug -# Build static library -$(STATIC_LIB): $(OBJ_FILES) - ar rcs $(STATIC_LIB) $(OBJ_FILES) +release: $(STATIC_LIB_RELEASE) $(SHARED_LIB_RELEASE) test_release main_release -# Compile each .c file into .o inside the lib directory -$(LIB_DIR)/%.o: src/%.c - mkdir -p $(LIB_DIR) $(TEST_BIN_DIR) $(BIN_DIR) +debug: $(STATIC_LIB_DEBUG) $(SHARED_LIB_DEBUG) test_debug main_debug + +# Build release static library +$(STATIC_LIB_RELEASE): $(RELEASE_OBJ_FILES) + ar rcs $@ $^ + +# Build debug static library +$(STATIC_LIB_DEBUG): $(DEBUG_OBJ_FILES) + ar rcs $@ $^ + +# Compile each .c file into .o for release +$(RELEASE_LIB_DIR)/%.o: src/%.c + mkdir -p $(@D) $(TEST_RELEASE_BIN_DIR) $(RELEASE_BIN_DIR) $(CC) $(CFLAGS) $(CFLAGS_RELEASE) -I$(INCLUDE_DIR) -I$(CRUX_INCLUDE_DIR) -c $< -o $@ -# Build shared library -$(SHARED_LIB): $(OBJ_FILES) - $(CC) $(CFLAGS) $(CFLAGS_RELEASE) -shared -o $(SHARED_LIB) $^ +# Compile each .c file into .o for debug +$(DEBUG_LIB_DIR)/%.o: src/%.c + mkdir -p $(@D) $(TEST_DEBUG_BIN_DIR) $(DEBUG_BIN_DIR) + $(CC) $(CFLAGS) $(CFLAGS_DEBUG) -I$(INCLUDE_DIR) -I$(CRUX_INCLUDE_DIR) -c $< -o $@ -# Test with static library -test_static: $(STATIC_LIB) - $(CC) $(CFLAGS) $(CFLAGS_RELEASE) -I$(INCLUDE_DIR) -I$(CRUX_INCLUDE_DIR) $(TEST_MAIN) $(STATIC_LIB) $(CRUX_STATIC_LIB) -o $(TEST_STATIC_BIN) +# Build release shared library +$(SHARED_LIB_RELEASE): $(RELEASE_OBJ_FILES) + $(CC) $(CFLAGS) $(CFLAGS_RELEASE) $(LDFLAGS_RELEASE) -I$(INCLUDE_DIR) -shared -o $@ $^ -# Test with shared library -test_shared: $(SHARED_LIB) - $(CC) $(CFLAGS) $(CFLAGS_RELEASE) -I$(INCLUDE_DIR) -I$(CRUX_INCLUDE_DIR) $(TEST_MAIN) -L$(LIB_DIR) -l$(LIB_NAME) -L$(CRUX_LIB_DIR) -l$(CRUX_LIB_NAME) -o $(TEST_SHARED_BIN) +# Build debug shared library +$(SHARED_LIB_DEBUG): $(DEBUG_OBJ_FILES) + $(CC) $(CFLAGS) $(CFLAGS_DEBUG) $(LDFLAGS_DEBUG) -I$(INCLUDE_DIR) -shared -o $@ $^ -# Run tests -run_test_static: test_static - $(TEST_STATIC_BIN) +# Test with release configuration +test_release: $(STATIC_LIB_RELEASE) $(SHARED_LIB_RELEASE) + $(CC) $(CFLAGS) $(CFLAGS_RELEASE) -I$(INCLUDE_DIR) -I$(CRUX_INCLUDE_DIR) $(TEST_MAIN) $(STATIC_LIB_RELEASE) $(CRUX_STATIC_LIB_RELEASE) -o $(TEST_STATIC_BIN_RELEASE) + $(CC) $(CFLAGS) $(CFLAGS_RELEASE) -I$(INCLUDE_DIR) -I$(CRUX_INCLUDE_DIR) $(TEST_MAIN) -L$(RELEASE_LIB_DIR) -l$(LIB_NAME) -L$(CRUX_RELEASE_LIB_DIR) -l$(CRUX_LIB_NAME) -o $(TEST_SHARED_BIN_RELEASE) + +# Test with debug configuration +test_debug: $(STATIC_LIB_DEBUG) $(SHARED_LIB_DEBUG) + $(CC) $(CFLAGS) $(CFLAGS_DEBUG) -I$(INCLUDE_DIR) -I$(CRUX_INCLUDE_DIR) $(TEST_MAIN) $(STATIC_LIB_DEBUG) $(CRUX_STATIC_LIB_DEBUG) -o $(TEST_STATIC_BIN_DEBUG) + $(CC) $(CFLAGS) $(CFLAGS_DEBUG) -I$(INCLUDE_DIR) -I$(CRUX_INCLUDE_DIR) $(TEST_MAIN) -L$(DEBUG_LIB_DIR) -l$(LIB_NAME) -L$(CRUX_DEBUG_LIB_DIR) -l$(CRUX_LIB_NAME) -o $(TEST_SHARED_BIN_DEBUG) + +# Main with release configuration +main_release: $(STATIC_LIB_RELEASE) $(SHARED_LIB_RELEASE) $(MAIN_SRC) + $(CC) $(CFLAGS) $(CFLAGS_RELEASE) -I$(INCLUDE_DIR) -I$(CRUX_INCLUDE_DIR) $(MAIN_SRC) $(STATIC_LIB_RELEASE) $(CRUX_STATIC_LIB_RELEASE) -o $(MAIN_STATIC_BIN_RELEASE) + $(CC) $(CFLAGS) $(CFLAGS_RELEASE) -I$(INCLUDE_DIR) -I$(CRUX_INCLUDE_DIR) $(MAIN_SRC) -L$(RELEASE_LIB_DIR) -l$(LIB_NAME) -L$(CRUX_RELEASE_LIB_DIR) -l$(CRUX_LIB_NAME) -o $(MAIN_SHARED_BIN_RELEASE) + +# Main with debug configuration +main_debug: $(STATIC_LIB_DEBUG) $(SHARED_LIB_DEBUG) $(MAIN_SRC) + $(CC) $(CFLAGS) $(CFLAGS_DEBUG) -I$(INCLUDE_DIR) -I$(CRUX_INCLUDE_DIR) $(MAIN_SRC) $(STATIC_LIB_DEBUG) $(CRUX_STATIC_LIB_DEBUG) -o $(MAIN_STATIC_BIN_DEBUG) + $(CC) $(CFLAGS) $(CFLAGS_DEBUG) -I$(INCLUDE_DIR) -I$(CRUX_INCLUDE_DIR) $(MAIN_SRC) -L$(DEBUG_LIB_DIR) -l$(LIB_NAME) -L$(CRUX_DEBUG_LIB_DIR) -l$(CRUX_LIB_NAME) -o $(MAIN_SHARED_BIN_DEBUG) # Run tests -run_test_shared: test_shared - LD_LIBRARY_PATH=$(LIB_DIR):$(CRUX_LIB_DIR) ./$(TEST_SHARED_BIN) +run_test_release_static: test_release + $(TEST_STATIC_BIN_RELEASE) + +run_test_release_shared: test_release + LD_LIBRARY_PATH=$(RELEASE_LIB_DIR):$(CRUX_RELEASE_LIB_DIR) ./$(TEST_SHARED_BIN_RELEASE) + +run_test_debug_static: test_debug + $(TEST_STATIC_BIN_DEBUG) + +run_test_debug_shared: test_debug + LD_LIBRARY_PATH=$(DEBUG_LIB_DIR):$(CRUX_DEBUG_LIB_DIR) ./$(TEST_SHARED_BIN_DEBUG) -# Main with static library -main_static: $(STATIC_LIB) $(MAIN_SRC) - $(CC) $(CFLAGS) $(CFLAGS_RELEASE) -I$(INCLUDE_DIR) -I$(CRUX_INCLUDE_DIR) $(MAIN_SRC) $(STATIC_LIB) $(CRUX_STATIC_LIB) -o $(MAIN_STATIC_BIN) +# Run main programs +run_main_release_static: main_release + $(MAIN_STATIC_BIN_RELEASE) -# Main with shared library -main_shared: $(SHARED_LIB) $(MAIN_SRC) - $(CC) $(CFLAGS) $(CFLAGS_RELEASE) -I$(INCLUDE_DIR) -I$(CRUX_INCLUDE_DIR) $(MAIN_SRC) -L$(LIB_DIR) -l$(LIB_NAME) -L$(CRUX_LIB_DIR) -l$(CRUX_LIB_NAME) -o $(MAIN_SHARED_BIN) +run_main_release_shared: main_release + LD_LIBRARY_PATH=$(RELEASE_LIB_DIR):$(CRUX_RELEASE_LIB_DIR) ./$(MAIN_SHARED_BIN_RELEASE) -run_main_shared: main_shared - LD_LIBRARY_PATH=$(LIB_DIR) ./$(MAIN_SHARED_BIN) +run_main_debug_static: main_debug + $(MAIN_STATIC_BIN_DEBUG) -run_main_static: main_static - $(MAIN_STATIC_BIN) $(LOG_LEVEL) +run_main_debug_shared: main_debug + LD_LIBRARY_PATH=$(DEBUG_LIB_DIR):$(CRUX_DEBUG_LIB_DIR) ./$(MAIN_SHARED_BIN_DEBUG) # Clean build artifacts clean: rm -rf $(LIB_DIR) $(TEST_BIN_DIR) $(BIN_DIR) -.PHONY: all test_shared test_static test clean run_shared run_static main_shared main_static +.PHONY: all release debug test_release test_debug main_release main_debug clean \ + run_test_release_static run_test_release_shared run_test_debug_static run_test_debug_shared \ + run_main_release_static run_main_release_shared run_main_debug_static run_main_debug_shared From 397282200cb6480de64dda8373809564b5e5c3f3 Mon Sep 17 00:00:00 2001 From: Anton Sidorov Date: Sat, 29 Mar 2025 02:12:12 +0000 Subject: [PATCH 2/2] debug_release: --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index bab6743..6894a4e 100644 --- a/Makefile +++ b/Makefile @@ -53,7 +53,7 @@ RELEASE_OBJ_FILES := $(patsubst src/%.c, $(RELEASE_LIB_DIR)/%.o, $(SRC_FILES)) DEBUG_OBJ_FILES := $(patsubst src/%.c, $(DEBUG_LIB_DIR)/%.o, $(SRC_FILES)) # Targets -all: release debug +all: debug release release: $(STATIC_LIB_RELEASE) $(SHARED_LIB_RELEASE) test_release main_release