# ==========================================================================
# acquire-core / TxCore  Makefile
#
#   .pgc  --ecpg-->  .c  --gcc-->  .o  --ld-->  실행파일
#
# 산출물:
#   build/libtxcore.a          TxCore 공통 프레임워크 정적 라이브러리
#   bin/acquire-core-server    온라인 서비스 등록 데모 (링크 검증)
#   bin/rc_match_batch         승인-매입 대사 배치
# ==========================================================================

CC        := gcc
ECPG      := ecpg
AR        := ar
PG_INCDIR := $(shell pg_config --includedir 2>/dev/null)

# 헤더 검색 경로 (프레임워크 + 업무 + PostgreSQL/ecpglib/sqlca)
INCLUDES  := -Iframework/txcore/include \
             -Iframework/txcore/dbio \
             -Iapp/include \
             -I$(PG_INCDIR)

# 고정길이 필드 strncpy/snprintf 는 의도된 관용구이므로 해당 경고만 억제
CFLAGS    := -g -O2 -Wall -Wextra -Wno-unused-parameter \
             -Wno-stringop-truncation -Wno-format-truncation $(INCLUDES)
# ecpg 는 자체 전처리기이므로 -I 로 EXEC SQL INCLUDE 및 헤더 경로를 제공
ECPGFLAGS := -Iframework/txcore/include -Iframework/txcore/dbio -Iapp/include
LDLIBS    := -lecpg -lpq

BUILD := build
BIN   := bin

# ---- 소스 목록 ------------------------------------------------------------
TXCORE_SRC := framework/txcore/src/txcore.c
COMMON_SRC := app/common/util_date.c \
              app/common/util_amount.c \
              app/common/util_msg.c

# ECPG 전처리 대상
DBIO_PGC   := app/dbio/purchase_dbio.pgc
SVC_PGC    := app/online/mg_recv_svc.pgc \
              app/online/ac_intake_svc.pgc
BATCH_PGC  := app/batch/rc_match_batch.pgc

# .pgc -> 생성 .c
DBIO_GEN   := $(DBIO_PGC:.pgc=.c)
SVC_GEN    := $(SVC_PGC:.pgc=.c)
BATCH_GEN  := $(BATCH_PGC:.pgc=.c)

# ---- 오브젝트 -------------------------------------------------------------
TXCORE_OBJ := $(BUILD)/txcore.o
COMMON_OBJ := $(patsubst app/common/%.c,$(BUILD)/%.o,$(COMMON_SRC))
DBIO_OBJ   := $(BUILD)/purchase_dbio.o
SVC_OBJ    := $(BUILD)/mg_recv_svc.o $(BUILD)/ac_intake_svc.o
SERVER_OBJ := $(BUILD)/server_main.o
BATCH_OBJ  := $(BUILD)/rc_match_batch.o

LIBTXCORE  := $(BUILD)/libtxcore.a

SERVER_BIN := $(BIN)/acquire-core-server
BATCH_BIN  := $(BIN)/rc_match_batch

# ==========================================================================
.PHONY: all clean dirs gen
all: dirs $(LIBTXCORE) $(SERVER_BIN) $(BATCH_BIN)
	@echo "==> 빌드 완료"
	@ls -la $(LIBTXCORE) $(SERVER_BIN) $(BATCH_BIN)

dirs:
	@mkdir -p $(BUILD) $(BIN)

# ---- ecpg: .pgc -> .c -----------------------------------------------------
%.c: %.pgc
	$(ECPG) $(ECPGFLAGS) -o $@ $<

gen: $(DBIO_GEN) $(SVC_GEN) $(BATCH_GEN)

# ---- TxCore 정적 라이브러리 ----------------------------------------------
$(TXCORE_OBJ): $(TXCORE_SRC)
	$(CC) $(CFLAGS) -c $< -o $@

$(LIBTXCORE): $(TXCORE_OBJ)
	$(AR) rcs $@ $^

# ---- 공통 유틸 오브젝트 ---------------------------------------------------
$(BUILD)/%.o: app/common/%.c
	$(CC) $(CFLAGS) -c $< -o $@

# ---- ECPG 생성 .c 컴파일 --------------------------------------------------
$(DBIO_OBJ): $(DBIO_GEN)
	$(CC) $(CFLAGS) -c $< -o $@

$(BUILD)/mg_recv_svc.o: app/online/mg_recv_svc.c
	$(CC) $(CFLAGS) -c $< -o $@

$(BUILD)/ac_intake_svc.o: app/online/ac_intake_svc.c
	$(CC) $(CFLAGS) -c $< -o $@

$(BATCH_OBJ): $(BATCH_GEN)
	$(CC) $(CFLAGS) -c $< -o $@

# ---- server_main (plain C) ------------------------------------------------
$(SERVER_OBJ): app/online/server_main.c
	$(CC) $(CFLAGS) -c $< -o $@

# ---- 링크 -----------------------------------------------------------------
# 온라인 서버: 서비스들 + 공통 + DBIO + TxCore
$(SERVER_BIN): $(SERVER_OBJ) $(SVC_OBJ) $(DBIO_OBJ) $(COMMON_OBJ) $(LIBTXCORE)
	$(CC) $(CFLAGS) -o $@ $(SERVER_OBJ) $(SVC_OBJ) $(DBIO_OBJ) $(COMMON_OBJ) \
		-L$(BUILD) -ltxcore $(LDLIBS)

# 배치: 배치 + DBIO + 공통 + TxCore
$(BATCH_BIN): $(BATCH_OBJ) $(DBIO_OBJ) $(COMMON_OBJ) $(LIBTXCORE)
	$(CC) $(CFLAGS) -o $@ $(BATCH_OBJ) $(DBIO_OBJ) $(COMMON_OBJ) \
		-L$(BUILD) -ltxcore $(LDLIBS)

# ==========================================================================
clean:
	rm -rf $(BUILD) $(BIN)
	rm -f $(DBIO_GEN) $(SVC_GEN) $(BATCH_GEN)
