apxs - APache eXtenSion 도구
이 문서는 최신판 번역이 아닙니다. 최근에 변경된 내용은 영어 문서를 참고하세요.
apxs는 아파치 하이퍼텍스트 전송 프로토콜 (HTTP) 서버의 확장모듈을 컴파일하고 설치하는 도구이다. 이 도구는 여러 소스와 오브젝트파일을 가지고, mod_so 의 LoadModule 지시어로 실행중에 아파치 서버로 읽어들일 수 있는 동적공유객체(DSO)를 만든다.
그래서 이런 확장방식을 사용하려면 플래폼이 DSO 기능을 지원하고 아파치 httpd 실행파일을 mod_so 모듈과 같이 컴파일해야 한다. apxs 도구는 이 조건이 만족하지않으면 실행하지 않는다. 직접 명령어를 실행하여 조건이 만족하는지 알아볼 수 있다
$ httpd -l
목록에 mod_so 모듈이 나와야 한다. 조건을 만족하면 apxs 도구로 DSO 모듈을 설치하여 아파치서버의 기능을 쉽게 확장할 수 있다:
$ apxs -i -a -c mod_foo.c
gcc -fpic -DSHARED_MODULE -I/path/to/apache/include -c mod_foo.c
ld -Bshareable -o mod_foo.so mod_foo.o
cp mod_foo.so /path/to/apache/modules/mod_foo.so
chmod 755 /path/to/apache/modules/mod_foo.so
[activating module `foo' in /path/to/apache/etc/httpd.conf]
$ apachectl restart
/path/to/apache/sbin/apachectl restart: httpd not running, trying to start
[Tue Mar 31 11:27:55 1998] [debug] mod_so.c(303): loaded module foo_module
/path/to/apache/sbin/apachectl restart: httpd started
$ _
아규먼트 files에는 C 소스파일 (.c) 이나 오브젝트파일 (.o), 라이브러리모음 (.a)을 사용할 수 있다. apxs 도구는 확장자를 보고 자동으로 C 소스파일은 컴파일하고, 오브젝트와 모음파일은 링크에만 사용한다. 그러나 컴파일한 오브젝트를 사용하려면 동적으로 읽어들일 수 있는 공유객체로 사용하기위해 반드시 오브젝트를 위치독립코드(PIC, position independent code)로 컴파일해야 한다. GCC의 경우 -fpic을 사용하면 된다. 다른 C 컴파일러는 설명서를 참고하거나 apxs가 오브젝트파일을 컴파일할때 사용하는 옵션을 참고하라.
아파치의 DSO 지원에 대한 더 자세한 내용은 mod_so 문서를 참고하거나 src/modules/standard/mod_so.c 소스파일을 읽어봐라.
개요
apxs -g [ -S name=value ] -n modname
apxs -q [ -S name=value ] query ...
apxs -c [ -S name=value ] [ -o dsofile ] [ -I incdir ] [ -D name=value ] [ -L libdir ] [ -l libname ] [ -Wc,compiler-flags ] [ -Wl,linker-flags ] files ...
apxs -i [ -S name=value ] [ -n modname ] [ -a ] [ -A ] dso-file ...
apxs -e [ -S name=value ] [ -n modname ] [ -a ] [ -A ] dso-file ...
옵션
공통 옵션
-n modname-i(install)과-g(template generation) 옵션을 사용할때 직접 모듈명을 지정한다. 이 옵션을 사용하여 모듈명을 직접 지정한다.-g옵션을 사용한다면 이 옵션을 반드시 사용해야하고,-i옵션을 사용한다면apxs도구는 소스나 (마지막 시도로) 파일명을 가지고 이름을 추측한다.
질의 옵션
-qapxs의 설정값을 알아낸다. query에는 다음을 사용할 수 있다:CC,CFLAGS,CFLAGS_SHLIB,INCLUDEDIR,LD_SHLIB,LDFLAGS_SHLIB,LIBEXECDIR,LIBS_SHLIB,SBINDIR,SYSCONFDIR,TARGET.설정을 직접 알아낼때 사용한다.
INC=-I`apxs -q INCLUDEDIR`예를 들어, 아파치 C 헤더파일을 직접 접근한다면 Makefile에서 위와 같이 사용한다.
설정 옵션
-S name=value- 이 옵션은 위에서 설명한 apxs 설정을 변경한다.
견본(template) 생성 옵션
-g- 하위디렉토리 name을 만들고 (
-n옵션 참고) 그곳에 파일 두개를 만든다: 한 파일은mod_name.c라는 견본 모듈소스파일로, 자신의 모듈을 만들때 견본으로 사용하거나 apxs 기능을 시험해볼때 사용한다. 다른 파일은 이 모듈을 쉽게 컴파일하고 설치하기위한Makefile이다.
DSO 컴파일 옵션
-c- 컴파일을 지시한다. 먼저 files에서 C 소스파일들(.c)을 오브젝트파일(.o)로 컴파일하고, files의 나머지 오브젝트파일들(.o과 .a)과 링크하여 동적공유객체 dsofile을 만든다.
-o옵션을 사용하지않으면 files의 첫번째 파일명에서 이름을 추측하여 보통mod_name.so를 사용한다. -o dsofile- 생성할 동적공유객체 파일명을 직접 지정한다. 이름을 지정하지않고 files 목록에서 이름을 추측하지 못하면 마지막으로
mod_unknown.so를 이름으로 사용한다. -D name=value- 이 옵션을 컴파일 명령어로 직접 전달한다. 컴파일때 자신의 define을 추가한다.
-I incdir- 이 옵션을 컴파일 명령어로 직접 전달한다. 컴파일때 include를 찾을 디렉토리를 추가한다.
-L libdir- 이 옵션을 링커 명령어로 직접 전달한다. 컴파일때 라이브러리를 찾을 디렉토리를 추가한다.
-l libname- 이 옵션을 링커 명령어로 직접 전달한다. 컴파일때 사용할 라이브러리를 추가한다.
-Wc,compiler-flags- 이 옵션은 추가 옵션 compiler-flags를 컴파일 명령어로 전달한다. 컴파일러 특유의 옵션을 추가할때 사용한다.
-Wl,linker-flags- 이 옵션은 추가 옵션 linker-flags를 링커 명령어로 전달한다. 링커 특유의 옵션을 추가할때 사용한다.
DSO 설치과 설정 옵션
-i- 설치를 지시한다. 여러 동적공유객체를 서버의 modules 디렉토리에 설치한다.
-a- 아파치
httpd.conf설정파일에 적절한LoadModule줄을 추가하거나 이미 있다면 활성화하여 모듈을 사용하도록 만든다. -A-a와 비슷하지만,LoadModule지시어 앞에 우물정자(#)를 붙인다. 즉, 현재는 사용하지않지만 나중에 사용할 수 있도록 모듈을 준비한다.-e- 편집을 지시한다.
-a혹은-A옵션과 같이 사용할 수 있으며,-i명령과 비슷하지만 모듈을 설치하지않고 아파치httpd.conf설정파일만 편집한다.
예제
아파치서버의 기능을 확장하는 mod_foo.c라는 아파치 모듈이 있다고 가정하자. 먼저 다음 명령어를 사용하여 C 소스를 아파치 서버가 읽어들일 공유객체로 컴파일한다:
$ apxs -c mod_foo.c
gcc -fpic -DSHARED_MODULE -I/path/to/apache/include -c mod_foo.c
ld -Bshareable -o mod_foo.so mod_foo.o
$ _
그리고 이 공유객체를 읽어들이는 LoadModule 지시어를 아파치 설정에 추가한다. apxs는 자동으로 공유객체를 "modules" 디렉토리에 설치하고 httpd.conf 파일을 알맞게 수정하여 간단히 작업을 마친다. 다음 같이 실행한다:
$ apxs -i -a mod_foo.c
cp mod_foo.so /path/to/apache/modules/mod_foo.so
chmod 755 /path/to/apache/modules/mod_foo.so
[activating module `foo' in /path/to/apache/etc/httpd.conf]
$ _
그러면 다음과 같은 줄을
LoadModule foo_module modules/mod_foo.so
설정파일에 없다면 추가한다. 이 설정을 기본적으로 사용하지 않는다면 -A 옵션을 사용한다. 즉
$ apxs -i -A mod_foo.c
apxs를 쉽게 사용하려고 다음과 같이 아파치 모듈 견본과 Makefile을 만들 수 있다:
$ apxs -g -n foo
Creating [DIR] foo
Creating [FILE] foo/Makefile
Creating [FILE] foo/mod_foo.c
$ _
그런후 바로 견본 모듈을 공유객체로 컴파일하여 아파치 서버가 읽도록한다:
$ cd foo
$ make all reload
apxs -c mod_foo.c
gcc -fpic -DSHARED_MODULE -I/path/to/apache/include -c mod_foo.c
ld -Bshareable -o mod_foo.so mod_foo.o
apxs -i -a -n "foo" mod_foo.so
cp mod_foo.so /path/to/apache/modules/mod_foo.so
chmod 755 /path/to/apache/modules/mod_foo.so
[activating module `foo' in /path/to/apache/etc/httpd.conf]
apachectl restart
/path/to/apache/sbin/apachectl restart: httpd not running, trying to start
[Tue Mar 31 11:27:55 1998] [debug] mod_so.c(303): loaded module foo_module
/path/to/apache/sbin/apachectl restart: httpd started
$ _
심지어 아파치 소스 밖에서 apxs를 사용하여 PHP3와 같이 복잡한 모듈을 컴파일할 수 있다:
$ cd php3
$ ./configure --with-shared-apache=../apache-1.3
$ apxs -c -o libphp3.so mod_php3.c libmodphp3-so.a
gcc -fpic -DSHARED_MODULE -I/tmp/apache/include -c mod_php3.c
ld -Bshareable -o libphp3.so mod_php3.o libmodphp3-so.a
$ _
apxs는 자동으로 C 소스파일과 오브젝트파일을 구별한다. C 소스파일만 컴파일하고 나머지 오브젝트파일은 링크할때 사용한다.
Trackback Address :: http://jjangu.pe.kr/blog/trackback/575




