BUILD_DIR := ./build CC := gcc CFLAGS := -Wall -g -std=c90 LDFLAGS := -lm LIB_DIR := ./lib/nr/ansi LIB_INCLUDE := -I$(LIB_DIR)/other HW_DIR := ./hws ifeq ($(strip $(hw)),) else TARGET_NAME := hw$(hw) SRC_DIR := $(HW_DIR)/hw$(hw) ifeq ($(strip $(hw)),1) LIB_SRCS := $(LIB_DIR)/recipes/machar.c else ifeq ($(strip $(hw)),2) LIB_SRCS := $(LIB_DIR)/other/nrutil.c $(LIB_DIR)/recipes/rtflsp.c $(LIB_DIR)/recipes/rtbis.c $(LIB_DIR)/recipes/rtsec.c $(LIB_DIR)/recipes/rtnewt.c $(LIB_DIR)/recipes/rtsafe.c $(LIB_DIR)/recipes/zbrak.c $(LIB_DIR)/recipes/bessj0.c $(LIB_DIR)/recipes/bessj1.c else LIB_SRCS := "" endif LIB_OBJS := $(patsubst %.c,$(BUILD_DIR)/lib/%.o,$(notdir $(LIB_SRCS))) endif ifeq ($(strip $(TARGET_NAME)),) all: @echo "에러: 'target'을 지정해주세요." else TARGET_EXEC := $(BUILD_DIR)/$(TARGET_NAME).out TARGET_SRCS := $(wildcard $(SRC_DIR)/*.c) TARGET_OBJS := $(patsubst %.c,$(BUILD_DIR)/hw$(hw)/%.o,$(notdir $(TARGET_SRCS))) TARGET_INCLUDE := -I$(SRC_DIR) OBJS := $(TARGET_OBJS) $(LIB_OBJS) SRCS := $(TARGET_SRCS) $(LIB_SRCS) INCLUDE := $(TARGET_INCLUDE) $(LIB_INCLUDE) all: run endif init: @mkdir -p $(BUILD_DIR) @mkdir -p $(BUILD_DIR)/lib @mkdir -p $(BUILD_DIR)/$(TARGET_NAME) clean: @echo "빌드 결과물을 삭제합니다..." @rm -rf $(BUILD_DIR) @rm -rf ./out/** build: init $(TARGET_EXEC) @echo "빌드 완료" $(TARGET_EXEC): $(OBJS) @echo "링킹 중: $@" $(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS) $(OBJS): %.o: @echo "컴파일 중: $@" $(eval TARGET_C_BASENAME := $(patsubst %.o,%.c,$(notdir $@))) $(eval FOUND_SRC := $(foreach src,$(SRCS),$(if $(filter $(TARGET_C_BASENAME),$(notdir $(src))),$(src)))) $(CC) $(CFLAGS) $(INCLUDE) $(LDFLAGS) -c $(FOUND_SRC) -o $@ run: clean build @echo "실행 시작" @echo "============" @$(TARGET_EXEC) dist: clean mkdir -p out (cd $(SRC_DIR) && zip -9 $(TARGET_NAME).zip ./**) mv $(SRC_DIR)/$(TARGET_NAME).zip out