본문으로 바로가기

bonkora님이 작성해 주신 강좌입니다.


개발 툴의 Tclkit/Starkit/Starpack 강좌에 Tcl/Tk 소스로 독립된 실행파일을 만드는 내용이 있습니다. 이 글은 제가 새로이 알게 된 것으로 만든 것은 아니고 그 강좌를 바탕으로, 그대로 따라 하기만 하면 되도록 좀 더 쉽게 정리해 본 것입니다. (더 쉽지 않다면 제가 헛고생한 것이 되고 이 글은 무의미한 글이 됩니다만... ^^)

제가 처음 Tcl/Tk로 소스 코드를 작성한 후 든 생각이 이것으로 EXE 파일로 만들 수 있는가 하는 것이었습니다. 가끔 질답 게시판에도 질문이 있는 것을 보면 이런데 관심을 갖은 분이 많은가 봅니다. 여기에 설명되는 방법은 소스 코드랑 이 코드를 실행시킬 수 있는 인터프리터 등등을 하나의 EXE 파일 안에 묶어서 프로그램이 실행되도록 만드는 것입니다. 그러니까 진정한 의미의 컴파일링과는 차이가 있지만 다른 그 어떤 것도 필요 없이 실행파일 하나만 있으면 프로그램이 실행되니까 사용자의 입장에선 큰 차이는 없겠지요.

 

운영체제는 MS윈도 XP이고 ActiveTcl을 사용하는 경우입니다.

기본적인 상황: 확장패키지 사용 없이 작성된, 한글이 포함된 소스코드파일 하나

준비해야 할 것

다음과 같은 파일들을 한 디렉터리에 모아 놓습니다. 이 디렉터리를 작업 디렉터리라고 부르겠습니다.

 

① 소스 코드: "hello.tcl"이라고 가정함
② tclkit.exe: http://www.equi4.com/pub/tk 에서 내려받음
③ tclkit-win32.upx.exe: tclkit.exe와 같은 곳에서 내려받음
④ sdx.kit: http://www.equi4.com/pub/sk 에서 내려받음
⑤ cp949.enc: ActiveTcl 설치 디렉터리 아래 lib/tcl8.x/encoding 디렉터리에서 복사해 옴

EXE 파일 만들기

시작 버튼 -> 모든 프로그램 -> 보조프로그램 -> 명령 프롬프트 이렇게 명령 프롬프트를 실행시킵니다. 그러면 명령 프롬프트 창이 열리고 "C:\...\...>" 이런 프롬프트와 커서가 나타납니다. 작업 디렉터리로 옮겨 갑니다. 디스크를 옮겨갈 땐 그냥 "d:" 이런 식으로 디스크 이름만 입력하면 되고 그 디스크 안에서 디렉터리를 옮겨 갈 땐 "cd \tcl" 이렇게 입력합니다. 작업 디렉터리의 이름이 프롬프트에 보이면 다 된 겁니다. "dir" 명령으로 작업 디렉터리에 있는 파일들을 확인할 수 있습니다. 명령 프롬프트 창에서 차례대로 아래와 같이 명령어들을 입력합니다. 아래의 명령들은 모두 명령 프롬프트 창에서 실행합니다.

 

① 번 과정

tclkit sdx.kit qwrap hello.tcl


물론 hello.tcl 대신 자기가 만든 소스 코드 파일 이름을 써야겠지요. 이후에도 파일이름에 "hello.xxx"가 나오면 자신이 만든 코드 파일의 이름을 넣어야 됩니다. 이렇게 하면 Console 창이 열리고 "5 updates applied" 메시지가 나타난 후 "(xxx) 1 %" 이런 프롬프트와 커서가 보입니다. "exit"라고 명령하면 이 창에서 벗어나고 커서가 다시 명령 프롬프트 창으로 옮겨 옵니다. hello.kit 파일이 만들어져 있습니다.

 

② 번 과정

tclkit sdx.kit unwrap hello.kit


이 명령 후에도 앞에서와 같은 상황이 나타납니다. 만들어진 Console 창을 앞에서와 같이 닫고 명령 프롬프트 창으로 돌아옵니다. hello.vfs 디렉터리가 만들어져 있습니다.

 

③번 과정

md hello.vfs\lib\tcl8.4\encoding
copy cp949.enc hello.vfs\lib\tcl8.4\encoding


엔코딩 파일이 들어갈 디렉터리를 만든 후 파일을 복사해 넣습니다. cp949.enc는 한글을 표현하기 위해 사용하는 파일이라서 한글을 사용하지 않았다면 이 과정이 필요 없습니다. 윈도 탐색기를 사용하여 이 작업을 해도 상관없습니다.

 

④번 과정

tclkit sdx.kit wrap hello.exe -runtime tclkit-win32.upx.exe

 

새로 만들어진 Console 창에서 "exit"을 입력해 넣어서 벗어나옵니다. 드디어 EXE 파일이 만들어졌습니다.

소스 코드가 둘 이상의 파일로 되어있는 경우

소스 코드의 일부 수정

하나의 파일, 예를 들어 "hello.tcl"에서 "source popup.tcl" 이런 식으로 다른 소스를 불러서 실행시킬 경우에는 hello.tcl의 일부를 수정하여 popup.tcl의 위치를 정확히 지적해 주지 않으면 정상적으로 동작하지 않습니다.

만들어진 EXE 파일 안에도 디렉터리와 파일들이 놓여 있으며 hello.exe 파일 자체도 하나의 디렉터리라고 생각하면 이해하기 쉽습니다. 만들어진 EXE 파일 내부에서 사용되는 변수 startkit::todir를 사용하면 위치를 지정해 줄 수 있습니다. hello.exe가 작업 디렉터리에 생성될 예정이고 이것이 d:\tcl이라 가정한다면 $starkit::top은 "d:/tcl/hello.exe"의 값을 가지게 되고 [file join $starkit::topdir lib/app-hello]은 "c:/tcl/hello.exe/lib/app-hello"의 값을 가지게 됩니다. 그래서 "source popup.tcl" 라인을 아래와 같이 수정합니다.

set appdir [file join $starkit::topdir lib/app-hello]
source [file join $appdir popup.tcl]


디렉터리나 파일 이름에 쓰인 글자들의 대소문자를 구별하므로 에러가 발생했을 때는 이 점을 체크해 보시기 바랍니다.

EXE 파일 만들기

앞서 나온 "기본적인 상황"에서의 컴파일 과정을 ①번부터 ③번까지 죽 거친 후 작업 디렉터리 안에서 생성된 hello.vfs 안에 있는 lib/app-hello 안에다가 hello.tcl을 제외한 나머지 소스 코드들을 복사해 넣습니다. hello.tcl은 이미 들어 있어서 복사해 넣지 않습니다. 그 후 나머지 ④번 과정을 거칩니다.

확장 패키지를 사용한 경우

확장 패키지를 사용했을 때엔 EXE 파일을 만드는 과정 중 마지막 ④번 과정 전에 ActiveTcl이 설치되어 있는 디렉터리 아래에 있는 lib 디렉터리 내에서 해당 패키지의 이름이 있는 디렉터리를 hello.vfs\lib에 복사해 넣으면 됩니다.

아이콘 파일을 같이 넣어 EXE 파일 만들기

아이콘 파일 준비하기

아이콘 파일의 내용엔 16x16, 32x32, 48x48 사이즈 각각에 대해 4bit(16색)과 8bit(256색)의 이미지를 준비해야 합니다. 그러니까 3x2 하여 총 6개의 이미지가 필요합니다. 저는 아이콘 파일을 만들 때 Microangelo를 사용하는데 쉽게 아이콘 파일을 만들 수 있어서 별다른 설명이 필요하지는 않을 것 같습니다.

EXE 파일 만들기

소스 코드는 전혀 수정할 필요가 없습니다. 아이콘 파일의 이름만 tclkit.ico으로 바꾸어서 EXE 파일을 만드는 과정 중 마지막 ④번 과정 전에 hello.vfs에 복사해 넣으면 됩니다. 이름은 꼭 tclkit.ico이어야만 합니다.