You are here

소스 코드로 실행파일(EXE 파일) 만들기

bonkora의 아바타

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

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

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

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

1. 준비해야 할 것

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

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

2. 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 파일이 만들어 졌습니다.

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

1. 소스 코드의 일부 수정

하나의 파일, 예를 들어 "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]

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

2. EXE 파일 만들기

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

III. 확장 패키지를 사용한 경우

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

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

1. 아이콘 파일 준비하기

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

2. EXE 파일 만들기

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

포럼: