Phase 2c-1: ac 모듈 per-service 분해 (1서비스=1파일+카피북) + build.sh 이중스타일

- app/src/ac/svc/: 30 서비스 .pgc + 31 카피북 .h (각 typedef struct + prototype)
- ac_svr.pgc = 얇은 디스패처(advertise 테이블만)
- build.sh: src/<mod>/svc/*.pgc → lib<mod>svc.a 링크, inline/split 자동판별
- ac dbio 25 + batch 17 + run 17 스크립트
- 고유도: svc 30/30, dbio 25/25 (정규화 md5, 클론 0)
- 검증: 12서버 runok, 333 서비스, 매입체인 XA 커밋, prepared_xacts=0

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
forge-bot 2026-07-19 11:30:03 +00:00
parent bec83c721e
commit c3b99a8b75
139 changed files with 3363 additions and 653 deletions

View file

@ -29,12 +29,20 @@ PGLIB="$(pg_config --libdir)"
mkdir -p "$BIN" "$LIB" "$OBJ"
# Includes for every compile (CFLAGS is honored by buildserver/buildclient and
# by our direct gcc calls). Add every module's dbio dir so headers resolve.
# by our direct gcc calls). Add every module's dbio AND svc dir so headers resolve
# (svc/*.pgc copybooks include the module's dbio + common headers).
CFLAGS="-I$UBF -I$EXINC -I$PGINC -I$SRC/common"
for d in "$SRC"/*/dbio; do [ -d "$d" ] && CFLAGS="$CFLAGS -I$d"; done
for d in "$SRC"/*/svc; do [ -d "$d" ] && CFLAGS="$CFLAGS -I$d"; done
export CFLAGS
PGLINK="-L$PGLIB -lecpg -lpq"
# ecpg needs the same header search path as gcc (its preprocessor opens the
# #include'd copybooks to find EXEC SQL host-var decls). Mirror CFLAGS' -I set.
ECPG_INC="-I$UBF -I$SRC/common"
for d in "$SRC"/*/dbio; do [ -d "$d" ] && ECPG_INC="$ECPG_INC -I$d"; done
for d in "$SRC"/*/svc; do [ -d "$d" ] && ECPG_INC="$ECPG_INC -I$d"; done
log() { echo "[build] $*"; }
# ---------------------------------------------------------------------------
@ -59,7 +67,7 @@ ecpg_gen() {
local pgc="$1" base out
base="$(basename "${pgc%.pgc}")"
out="$OBJ/${base}.c"
ecpg -I"$UBF" -I"$(dirname "$pgc")" -o "$out" "$pgc"
ecpg $ECPG_INC -I"$(dirname "$pgc")" -o "$out" "$pgc"
echo "$out"
}
@ -79,9 +87,11 @@ NSVR=0; NDBIO=0; NBATCH=0
# ---------------------------------------------------------------------------
# 2..4 per module: dbio lib, server, batches
# ---------------------------------------------------------------------------
NSVC=0
for m in "${MODS[@]}"; do
MDIR="$SRC/$m"
DBIO_LIB=""
SVC_LIB=""
# -- dbio static lib (optional) --
if compgen -G "$MDIR/dbio/*.pgc" >/dev/null; then
@ -98,11 +108,29 @@ for m in "${MODS[@]}"; do
NDBIO=$((NDBIO+1))
fi
# -- module server <mod>_svr --
# -- per-service static lib (NEW legacy layout, optional) --
# A module may keep its services INLINE in <mod>_svr.pgc (old style) OR split
# them into svc/*.pgc, one service per file (new style). Both are supported;
# when svc/*.pgc exist they are archived into lib<mod>svc.a and linked in.
if compgen -G "$MDIR/svc/*.pgc" >/dev/null; then
log "lib${m}svc.a"
SVC_OBJS=()
for pgc in "$MDIR"/svc/*.pgc; do
c="$(ecpg_gen "$pgc")"
o="${c%.c}.o"
gcc -c $CFLAGS "$c" -o "$o"
SVC_OBJS+=("$o")
done
ar rcs "$LIB/lib${m}svc.a" "${SVC_OBJS[@]}"
SVC_LIB="$LIB/lib${m}svc.a"
NSVC=$((NSVC+1))
fi
# -- module server <mod>_svr (links svc lib + dbio lib + common) --
log "${m}_svr"
SVR_C="$(ecpg_gen "$MDIR/${m}_svr.pgc")"
buildserver -o "$BIN/${m}_svr" -f "$SVR_C" \
-a "$DBIO_LIB $LIB/libacqcommon.a $PGLINK"
-a "$SVC_LIB $DBIO_LIB $LIB/libacqcommon.a $PGLINK"
NSVR=$((NSVR+1))
# -- batches (optional): each *.pgc -> its own client executable --
@ -184,5 +212,5 @@ $(gen_servers)
</endurox>
EOF
log "DONE: modules=${#MODS[@]} servers=$NSVR dbio_libs=$NDBIO batches=$NBATCH clients=$NCLI"
log "DONE: modules=${#MODS[@]} servers=$NSVR svc_libs=$NSVC dbio_libs=$NDBIO batches=$NBATCH clients=$NCLI"
echo "[build] server binaries: ${MODS[*]/%/_svr}"