Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
145 changes: 100 additions & 45 deletions Makefile
Original file line number Diff line number Diff line change
@@ -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: debug release

# 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
Loading