TEA (Tcl Extension Architecture)

admin의 아바타

Tcl/Tk는 C언어로 간단하게 확장할수 있기 때문에 전세계적으로 확장 라이브러리가 계속 개발되고, 그 중에서도 많이 사용되는 유용한 것들은 Tcl 커뮤니티를 통하여 전세계 Tcl 개발자들에게 퍼져 왔습니다. 그러나 이것들은 확장 라이브러리 개발자에 의해 설치 순서나 설치 위치가 정해지기 때문에, 여러 확장 라이브러리를 동시에 사용할시에는 사용자와 Tcl 개발자를 혼란시키는 결과를 초래 하였습니다. 그래서 Tcl/Tk의 본거지인 Ajuba Solution사(당시에 Scriptics사의 모태가 된 회사)가 사태 수습에 나섰습니다. 그리고 1999년 여름, Tcl/Tk 8.2 릴리즈시 포함된 TEA(Tcl Extension Architecture)가 탄생했습니다. 이는 Tcl/Tk 확장 라이브러리을 개발/배포시의 통일적인 스타일 가이드가 창안 된 것입니다. 이 스타일에 따르면 UNIX환경에 설치하는 경우는

sh configure; make; make install

의 순서로 확장 라이브러리를 설치 하도록 지시하고 있습니다. TEA의 등장으로 기존에 제작되어 졌던 확장 라이브러리들이 TEA 스타일에 맞게 수정되어 졌습니다.

확장 라이브러리 개발자는 이 TEA의 스타일에 맞추기 위해서 configure 스크립트와 Makefile의 양식(template)를 준비해야 하는데, 이것들을 만들기는 간단하지 않습니다. 예를 들면, cc 컴파일러에 어떤 옵션을 추가하여 컴파일 해야 하는 것인데, UNIX계의 각종 플랫폼(Solaris, HP-UX, IRIX, DEC OSF/1, Linux, FreeBSD ..)은 완전히 다르고, 설치 하고 싶은 사용자가 tclsh나 wish를 어떤 환경에 설치 했는지를 파악하는 처리를 configure에 전부 넣는것은 UNIX에서의 개발에 익숙한 엔지니어라도 어렵습니다. 하지만 우린 그런 스타일 가이드를 지켜야합니다. Ajuba Solutions은 TEA 스타일 가이드 외에도, TEA의 개발의 예제인 sampleextension 을 아카이브로 배포하고 있습니다. 여기에서는 sampleextension과 비슷한 정도로 소개 하고자 합니다.

예제 프로그램

앞서 작성 했었던 max 원시 프로그램입니다. 이번에는 TEA 스타일 가이드를 따라 라이브러리를 빌드해 보도록 하겠습니다.

/* max.c */
#include <stdlib.h>
#include <string.h>
#include "tcl.h"
 
static int
maxHandleProc(ClientData clientData, Tcl_Interp* interp, int argc, char* argv[])
{
    int  i;
    double maxvalue = 0;
    char result[200];
 
    if(argc == 1){
        sprintf(result, "Ootto! too few arguments, usage:%s num num...", argv[0]);
        Tcl_SetResult(interp, result, TCL_VOLATILE);
        return TCL_ERROR;
    }
    for(i=1; i<argc; i++) {
        double v;
        if(sscanf(argv[i], "%lf", & v) == 0){
            sprintf(result, "Ootto! not numeric argument: %-100s", argv[i]);
            Tcl_SetResult(interp, result, TCL_VOLATILE);
            return TCL_ERROR;
        }
        if(i == 1 || v > maxvalue) maxvalue = v;
    }
    sprintf(result, "%g", maxvalue);
    Tcl_SetResult(interp, result, TCL_VOLATILE);
    return TCL_OK;
}
 
DLLEXPORT int Max_Init(Tcl_Interp* interp){
#ifdef USE_TCL_STUBS
    Tcl_InitStubs(interp, "8.1", 0);
#endif
    Tcl_CreateCommand(interp, "max", maxHandleProc, NULL, NULL);
    return Tcl_PkgProvide(interp, "max", "0.10");
}
/* end. */

준비

max 확장 라이브러리 TEA판의 소스 아카이브(첨부파일참조)를 만들어 보았으며, 아래의 리스트에 나와 있는 파일들이 포함되어 있습니다. 이는 max.c 를 제외하면 샘플로 제공되는 sampleextension아카이브와 같습니다.

aclocal.m4 
tcl.m4 
install-sh 
mkinstalldirs 
mkIndex.tcl.in 

위의 파일들은 sampleextension에 들어가 있는 파일을 그대로 사용합니다. 보통 편집할 필요는 없을것입니다.

configure.in 
Makefile.in 

위 두개의 파일이 빌드 작업시 핵심적인 역할을 합니다. 텍스트 에디터로 열어 확장 라이브러리의 이름이나 소스 프로그램의 리스트를 수정합니다.

max.c 

확장 라이브러리의 코드가 기록된 소스코드를 준비합니다.

확장 라이브러리의 아카이브 만들기

확장 라이브러리를 배포할수 있도록 하기 위해서는, configure.in 으로부터 configure 스크립트를 생성할 필요가 있습니다. autoconf는 위의 작업을 수행하는 프로그램으로 공개로 배포되고 있습니다. 보통의 UNIX 에는 설치되어 있지만, 만약 설치되어 있지 않다면 autoconf를 다운로드 받아서 설치해야 할 것 입니다.

% cd 작업디렉토리
% autoconf

정상적으로 configure 스크립트가 생성이 되었다면, 이것을 tar와 gzip을 사용하여 tgz로 압축을 합니다. 이제 배포할수 있는 아카이브가 완성된것 입니다.

설치 해보기

이제 실제로 확장 라이브러리의 사용자로써 설치를 해보겠습니다. root 계정에서 설치할 것을 권장하며, 일반 user 계정에서 설치하는 것은 권장하지 않습니다.

% sh configure
% make
% su root
% make install

sh configure --help 로 보면, 많은 옵션을 지정할수 있도록 설정되어 있고, 필요한 일을 할수 있을것입니다. 이러한 동작은 configure.in과 tcl.m4 두 파일에 쓰여져 있는 처리를 반영한 것 입니다.

그런데, 이 max 확장 라이브러리는 nroff 문서(즉 manpage)를 준비 하고 있지 않기 때문에 마지막 에러로 종료할 것입니다. 문서를 넣고 싶으시면, *.1 이나 *.n 파일을 작업 디렉토리내에 두면 설치가 됩니다.

실제로 설치된 파일은 아래의 두 파일입니다.

/usr/local/lib/libmax-0.2.so 
/usr/local/lib/max/pkgIndex.tcl 

/usr/local의 부분은 환경에 따라 적당히 바꾸시기 바랍니다. 이 설치된 파일의 위치도 TEA 스타일에 포함 되기 때문에, 패스를 수정하지 않는것이 좋다 생각합니다. 또 실행파일이나 헤더 파일등 그 밖의 파일도 Makefile.in 에 적당히 지정하면 설치할수 있다고 생각합니다.

사용해 보기

설치가 되었다면, package require 로 확장 라이브러리를 사용할수 있게 됩니다. 아래는 간단한 예입니다.

package require max
label .laba -text "result=[max 10.1 12.2 13.3 12.1 13.2]"
pack .laba

이상으로 TEA의 스타일 가이드에 따른 배포 준비부터 설치및 설치된 라이브러리의 사용방법에 대해서 알아 보았습니다. 참고로 TEA의 README를 간단히 보시는것도 대단히 유용할 것이라 생각합니다.

첨부 파일파일 크기
max-tea.gz22.43 KB