안녕하세요 드디어 두번째 튜토리얼을.. ^^;
저는 맥 사용자입니다. 여기 맥 사용자가 또 계실지 모르지만.. 유닉스 기반인 맥OS X(10) 사용자도 좀 늘어나지 않을까 해서 맥X에서의 pgsql 컴파일기(?)를 올립니다.
일단 맥OS X은 FreeBSD 시스템에 Mach 마이크로커널을 쓴 Darwin 이라는 유닉스를 베이스로 하고 있습니다. 많은 GNU프로그램들이 다윈으로 포팅되고 있고 실제 서버시장에서도 조금씩 점유율을 높여가고 있습니다. (애플의 서버제품군인 Xserve가 비교적 싼편이라 -_-;;;)
여튼 pgsql의 컴파일이 리눅스처럼 단순하게 끝나지 않아 막히는 분이 계실까봐 글을 올립니다 -.-
일단 준비물입니다. 맥OS X.2 이상, Dev Tools, PostgreSQL 7.2.3 소스, Fink(10.2이상용) 입니다.
맥OS X.2 이상에 Dev Tools를 설치하면 GCC와 개발이나 컴파일에 필요한 대부분의 요소가 설치됩니다.
그리고 사용자와 root의 기본쉘을 배쉬로 바꿉니다. 배쉬의 환경파일들(/etc/bashrc, ~/.bashrc, ~/.bash_profile 등) 을 리눅스의 것을 가져다 덮어씌우고 설정해줍니다.
사용자의 기본쉘은 NetInfo 매니저 에서 하실수 있습니다. (어플리케이션/유틸리티/ 안에 있습니다. 그리고 NetInfo 매니저에서 root의 패스워드를 설정해서 root 권한을 터미널에서 사용할수 있게 합니다)
그리고 Fink 프로젝트의 홈페이지에서 Fink를 받아서 설치합니다.
http://fink.sourceforge.net/ 자신의 운영체제에 맞는눔으로 설치하세요 Fink의 설치문서를 꼭 보고 따라하세요.
그리고 source /sw/bin/init.csh 를 시작환경에 등록하라는데 배쉬를 쓰니까 init.csh가 아니라 init.sh를 등록하셔야 합니다. ~/.bashrc 의 맨 아래에 source /sw/bin/init.sh 라고 해주시면 됩니다.
그리고 fink 로 libtool을 새로 깔아주세요.
# fink install libtool
그리고 readline 도 fink로 설치해주세요
# fink install readline (아마 의존성때문에 readline-shlibs 도 깔겁니다)
이렇게 링크를 걸어줘야 하더군요.
# ln -s /sw/include/readline /usr/include/
# ln -s /sw/lib/libreadline* /usr/lib/
으로 링크를 걸어줍니다.
위의 준비 과정이 끝났으면 본격적을 pgsql 삽질에 들어가겠습니다 -.-;;
/sw/src 에 pgsql 7.2.3 소스의 압축을 풉니다.
(확장완성형 한글을 쓸수 있게 wchar.c 를 수정하는것은 이곳을 찾아보시면 있습니다. 이것은 자유입니다 ^^;)
그냥 컴파일 한번 해보시면 한참 진행되다가 오류를 내며 멈춰버립니다. (왠만하면 아래를 다 하신후에 하시는게 좋을듯 싶습니다 ^^;;;)
pgsql 의 버그인지 맥OS X의 버그인지는 모르지만 공유메모리 관련해서 멈춰버립니다. 오류인 즉슨 semun 이라는 유니온이 정의되지 않았다는 겁니다. 소스를 찾아보면 아래의 파일에서 기본 헤더파일인 sem.h 를 인클루드 해주지 않았습니다.
/sw/src/postgresql-7.2.3/src/include/port/darwin/sem.h 파일을 엽니다
# include <sys/ipc.h> 를 찾아 그 아래에
# include <sys/sem.h> 를 적어줍니다.
! 하지만.. 이렇게 하면 다른 에러가 납니다. 바로 sem과 sembuf 라는 스트럭트가 두번 정의 되는 문제가 생깁니다. 시스템의 기본 헤더인 sem.h 에 정의되어 있는 두 스트럭트가 pgsql의 소스에서 다시 정의되는 바람에 에러가 납니다.
다시 같은 파일을 열어서
struct sem
.....
.....
struct sembuf
.....
.....
};
여기까지 지워줍니다.
/usr/include/sys/sem.h 에 똑같은 내용이 있으므로 안심하셔도 됩니다 -.-;;
여기까지 하면 문제의 오류는 딱 한가지 뿐입니다.
semop 라는 함수가 두번 정의됐다는 에러입니다.
찾아보면 /usr/include/sys/sem.h 에서 정의된 semop 라는 함수와 pgsql이 정의하는 semop의 내용이 다른걸 알수 있습니다.
/usr/include/sys/sem.h 에서
int semop __P((int, struct sembuf *,unsigned));
라는 줄을 찾아서 지웁니다. (복사해뒀다가 pgsql 컴파일이 끝나면 다시 붙여넣으세요 ^^;; 혹시 모르니)
여기까지 하시면..
깨끗하게 컴파일이 됩니다.
# export LC_ALL="EUC_KR" <- 이거 왠만하면 해주세요 -.-;;
# ./configure --prefix=/sw --enable-multibyte --enable-locale
# make
실행파일들을 path가 걸린곳으로 링크를 겁니다
# ln -s /sw/pgsql/bin/* /sw/bin/
하시고 시스템 환경설정에서 postgres 라는 사용자를 추가합니다.
# chown -R postgres /sw/pgsql
# su postgres
# export LC_ALL="EUC_KR"
# export PGDATA="/sw/pgsql/data" <- 전 이부분을 bashrc 에 $PGDATA="/sw/pgsql/data" 이렇게 기본으로 등록해버렸습니다 ^^;
# initdb -E EUC_KR
# pg_ctl start
# psql template1
헥헥.. 짜잔~ -_-;;
물론 터미널에서 psql로 한글을 입출력 할수는 없습니다 ^^;
터미널이 유니코드를 쓰니 당연히 안될수 밖에요 -.-;;
MacSQL같은 클라이언트 툴을 쓰시면 확인같은거 하실수 있습니다. 한글 정렬도 잘 됩니다 흠하하~
미리 컴파일 해보고 된다면 이렇게 안해도 되지만 안된다면 이 방법을 써보세요. 몇분에게나 도움이 될지 -_-;;;;;
그럼~
|