157 lines
5.5 KiB
Markdown
157 lines
5.5 KiB
Markdown
# FHS CentOS 6 빌드
|
|
|
|
이 문서는 CentOS 6 컨테이너에서 FHS 소스를 빌드하는 절차만 다룬다.
|
|
Apache 설정, PostgreSQL 데이터 준비, 모듈 배포와 DAV 요청 검증은
|
|
[`deploy.6.md`](deploy.6.md)에 있다.
|
|
|
|
## 1. CentOS 6 빌드 컨테이너
|
|
|
|
저장소 루트에서 소스를 컨테이너에 복사하지 않고 `PWD`를 `/workspace`로
|
|
마운트한다. `podman exec -w`로 각 빌드 디렉터리를 지정한다.
|
|
|
|
```bash
|
|
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 저장소로 바꾼다.
|
|
|
|
```bash
|
|
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.cpp`가 `boost/algorithm/string.hpp`를 include한다.
|
|
- `cls/src/*.h`가 `sqlite3.h`를 include하고 `-lsqlite3`로 링크한다.
|
|
- `cls`와 `fimngd`가 `libpq-fe.h`와 libpq를 사용한다.
|
|
- `fimngd`와 `sh-opendav`가 Apache/APR 헤더와 라이브러리를 사용한다.
|
|
- `sh-opendav` Makefile이 libtool, `-lmcrypt`, `bc`를 직접 사용한다.
|
|
|
|
```bash
|
|
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`로 확인할 때만 필요하다.
|
|
|
|
```bash
|
|
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 설치 경로에 연결한다.
|
|
|
|
```bash
|
|
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. 컴포넌트별 빌드
|
|
|
|
각 컴포넌트를 따로 빌드해서 어느 의존성 또는 기존 소스 문제가 빌드를
|
|
막는지 확인한다.
|
|
|
|
```bash
|
|
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`를 명령행에서
|
|
지정한다.
|
|
|
|
```bash
|
|
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-opendav`는 `all` target이 아니라 `apache-mod-dav-dbms` target을 사용하고,
|
|
CentOS 6 저장소에 없는 `-liconv`는 `LIBS=-lmcrypt`로 대체한다.
|
|
|
|
```bash
|
|
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.h`의 `uint64_t` 선언 누락 및 연쇄 오류 |
|
|
| `fimngd` | 성공 | `src/fimngd` 생성; 동적 `libpq` 링크 명령 사용 |
|
|
| `ftsd` | 성공 | `src/ftsd`, `interface/sample/ftsd_test` 생성 |
|
|
| `sh-opendav` | 성공 | `.libs/libmod_dav_repos.so` 생성 |
|
|
|
|
확인:
|
|
|
|
```bash
|
|
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
|
|
```
|