Files
interactive/fhs/build.6.md
T

5.5 KiB

FHS CentOS 6 빌드

이 문서는 CentOS 6 컨테이너에서 FHS 소스를 빌드하는 절차만 다룬다. Apache 설정, PostgreSQL 데이터 준비, 모듈 배포와 DAV 요청 검증은 deploy.6.md에 있다.

1. CentOS 6 빌드 컨테이너

저장소 루트에서 소스를 컨테이너에 복사하지 않고 PWD/workspace로 마운트한다. podman exec -w로 각 빌드 디렉터리를 지정한다.

cd "$(git rev-parse --show-toplevel)"

RUN_ID="$(date +%Y%m%d%H%M%S)-$$"
FHS_CONTAINER="interactive-fhs-centos6-${RUN_ID}"

podman pull docker.io/library/centos:centos6
podman run -d \
  --name "$FHS_CONTAINER" \
  --volume "$PWD:/workspace:Z" \
  --workdir /workspace/fhs \
  docker.io/library/centos:centos6 \
  sleep infinity

CentOS 6 기본 저장소는 종료되었으므로 vault 저장소로 바꾼다.

podman exec "$FHS_CONTAINER" cp -p \
  /etc/yum.repos.d/CentOS-Base.repo \
  /etc/yum.repos.d/CentOS-Base.repo.before-vault

podman exec "$FHS_CONTAINER" sed -i \
  -e 's|^mirrorlist=|#mirrorlist=|' \
  -e 's|^#baseurl=.*\$releasever|baseurl=http://vault.centos.org/6.10|' \
  /etc/yum.repos.d/CentOS-Base.repo

2. 빌드 의존성

패키지는 소스와 Makefile에서 실제로 사용하는 컴파일러, 헤더, 라이브러리만 설치한다.

패키지 필요한 빌드
gcc, gcc-c++, make 모든 컴포넌트
boost-devel arcmond2, cls, csagentd, fimngd, ftsd
sqlite-devel cls
postgresql93-libs, postgresql93-devel cls, fimngd
httpd-devel fimngd, sh-opendav
libtool sh-opendav
libmcrypt-devel sh-opendav
bc sh-opendav

근거는 다음과 같다.

  • 모든 Makefile이 C/C++ 컴파일과 재귀 make를 사용한다.
  • 각 대상의 lib/Config.cppboost/algorithm/string.hpp를 include한다.
  • cls/src/*.hsqlite3.h를 include하고 -lsqlite3로 링크한다.
  • clsfimngdlibpq-fe.h와 libpq를 사용한다.
  • fimngdsh-opendav가 Apache/APR 헤더와 라이브러리를 사용한다.
  • sh-opendav Makefile이 libtool, -lmcrypt, bc를 직접 사용한다.
podman exec "$FHS_CONTAINER" yum install -y \
  gcc gcc-c++ make boost-devel sqlite-devel bc libmcrypt-devel \
  httpd-devel libtool

PostgreSQL 9.3의 헤더와 라이브러리를 설치한다. postgresql93 본체는 빌드에 필요하지 않고, DB를 배포하고 psql로 확인할 때만 필요하다.

PG93_BASE=http://download.postgresql.org/pub/repos/yum/9.3/redhat/rhel-6-x86_64

podman exec "$FHS_CONTAINER" yum install -y \
  "${PG93_BASE}/postgresql93-libs-9.3.25-1PGDG.rhel6.x86_64.rpm" \
  "${PG93_BASE}/postgresql93-devel-9.3.25-1PGDG.rhel6.x86_64.rpm"

podman exec "$FHS_CONTAINER" mkdir -p /user/db
podman exec "$FHS_CONTAINER" ln -sfn /usr/pgsql-9.3 /user/db/pgsql

sh-opendav Makefile가 기대하는 Apache 경로를 yum 설치 경로에 연결한다.

podman exec "$FHS_CONTAINER" bash -lc '
  mkdir -p /user/service/httpd/build /user/service/httpd/include
  ln -sfn /usr/bin/libtool /user/service/httpd/build/libtool
  mkdir -p /user/service/httpd/lib
  ln -sfn /usr/lib64/libapr-1.so /user/service/httpd/lib/libapr-1.a
  for header in /usr/include/httpd/*.h /usr/include/apr-1/*.h; do
    ln -sfn "$header" "/user/service/httpd/include/$(basename "$header")"
  done
'

검증상 openssl-devel, openldap-devel, libxml++-devel, pkgconfig는 현재 빌드 대상의 소스 또는 Makefile에서 사용하지 않았다. 따라서 이 빌드 절차에는 넣지 않는다.

3. 컴포넌트별 빌드

각 컴포넌트를 따로 빌드해서 어느 의존성 또는 기존 소스 문제가 빌드를 막는지 확인한다.

for component in arcmond2 cls csagentd ftsd; do
  podman exec -w "/workspace/fhs/${component}" "$FHS_CONTAINER" make clean all
done

fimngd는 Makefile이 정적 /user/db/pgsql/lib/libpq.a를 직접 링크한다. CentOS 6용 PostgreSQL 정적 archive에는 OpenSSL/Kerberos 등의 전이 라이브러리 심볼이 남으므로, 소스나 Makefile를 바꾸지 않고 동적 libpq를 명령행에서 지정한다.

podman exec -w /workspace/fhs/fimngd "$FHS_CONTAINER" make clean
podman exec -w /workspace/fhs/fimngd "$FHS_CONTAINER" \
  make LIBS='-lpthread -L/user/db/pgsql/lib -lpq \
    ../lib/libInterCommon.a /user/service/httpd/lib/libapr-1.a' all

sh-opendavall target이 아니라 apache-mod-dav-dbms target을 사용하고, CentOS 6 저장소에 없는 -liconvLIBS=-lmcrypt로 대체한다.

podman exec -w /workspace/fhs/sh-opendav "$FHS_CONTAINER" make clean
podman exec -w /workspace/fhs/sh-opendav "$FHS_CONTAINER" \
  make LIBS=-lmcrypt apache-mod-dav-dbms

4. 실제 빌드 결과

CentOS 6 컨테이너에서 위 명령을 실행한 결과다.

대상 결과 실패 또는 산출물
arcmond2 실패 제공된 정적 라이브러리의 Linux 링크 오류
cls 실패 CentOS 6에서 setproctitle 선언이 없음
csagentd 실패 ShmDefine.huint64_t 선언 누락 및 연쇄 오류
fimngd 성공 src/fimngd 생성; 동적 libpq 링크 명령 사용
ftsd 성공 src/ftsd, interface/sample/ftsd_test 생성
sh-opendav 성공 .libs/libmod_dav_repos.so 생성

확인:

podman exec -w /workspace/fhs "$FHS_CONTAINER" file \
  fimngd/src/fimngd \
  ftsd/src/ftsd \
  ftsd/interface/sample/ftsd_test \
  sh-opendav/.libs/libmod_dav_repos.so