본문으로 바로가기

FreeWrap

category 카테고리 없음 2024. 6. 26. 15:05

http://freewrap.sourceforge.net

FreeWrap은 tclkit과 같은 Tcl/Tk의 인터프리터를 내장한 실행 가능한 형식의 단일파일로 만드는 툴로서 아주 유명합니다. 현재 최신버전은 6.4이며, Tcl/Tk 8.5.0을 기본으로 하고 있습니다. (FreeWrap은 예전 Tcl/Tk8.4를 기본으로 하고 있을 당시 BLT를 지원하였으나, 현재 8.5.0을 기본으로 하면서 BLT가 Tcl/Tk8.5를 지원하지 않는 관계로 지원하고 있지 않습니다. 첨부파일의 freewrap_demo.zip은 한글패치가된 예전 버전인 FreeWrap 5.5가 포함되어 있습니다.) FreeWrap의 특징에 대해서 간단히 알아봅니다.

특징

  • 쉽습니다. 단순한 조작으로 패키징이 가능합니다.
  • Tk를 사용하지 않는다면, 단지 freewrapTCLSH로 패키징하여, 실행파일의 크기를 줄일 수 있습니다.
  • FreeWrap은 소스코드를 암호화하여 압축하는 방식인 zvfs(Zip Virtual File System)를 사용하고 있으므로, 소스코드가 공개되는 위험이 상당히 적어집니다.
  • 동적라이브러리(dll, so)도 패키징시에 단일의 실행파일에 내장할수 있습니다. (확장패키지와 원하는 이미지 등의 파일을 적재할 수 있습니다.)
  • 생성한 단일의 실행파일에 아이콘(윈도우즈의 아이콘 형식)을 적용할 수 있습니다.
  • 국제화에 대응하고 있습니다.
  • 이 프로그램은 라이센스가 없는 공개입니다.
  • 멀티플랫폼에 대응합니다. (Unix/Linux/Windows)

사용방법

아래의 코드는 anigif 패키지를 사용한 Animation GIF 포맷의 파일을 보여주는 간단한 예제입니다. 단일 실행파일로 묶을 시에 확장패키지인 anigif와 gif파일도 같이 패키징 하는 예를 보여줄 것입니다.

lappend auto_path /temp/anigif
 
package require anigif
 
set anilabel [label .anilabel]
::anigif::anigif /temp/anim152.gif $anilabel
set stopbutton [button .stopbutton -text "정지" -command { exit } ]
set korlabel [label .korlabel -text "어때요? 한글이 잘 보이나요?"]
 
pack $anilabel $stopbutton $korlabel -pady 5 -side top

아래의 이미지는 wish로 실행한 결과입니다.

 

 FreeWrap의 기본 사용법은 아래와 같습니다.

freewrap main.tcl -f "list of file"

main.tcl은 패키징 하고자 하는 어플리케이션의 메인 스크립트를 적어줍니다. -f 옵션의 파일은 패키징 하고자 하는 파일의 리스트를 나열한 파일이며, 절대 패스로 기록해 줍니다. 또한 위의 메인 스크립트 (위에서는 main.tcl)을 제외한 확장패키지와 기타 스크립트 목록을 적어줍니다. 이 예제에서는 아래와 같이 작성했습니다.

file.lst

/temp/anigif/anigif.tcl 
/temp/anigif/pkgIndex.tcl 
/temp/anim152.gif 

주의점은 반드시 패키징 하고자 하는 파일들이 같은 패스상에 존재해야 한다는 점입니다. 이유는 demo.tcl의 소스를 보면 알듯이, 확장패키지 패스를 지정해 줄 시에 문제가 될 수 있으며, FreeWrap이 생성한 단독 실행파일을 실행할 때, 규칙적인 디렉토리가 아니라면 실행 시에 문제의 소지가 될 수 있기 때문입니다. 또한 확장패키지를 사용했다면, auto_path에 반드시 추가해주어야 합니다. 아래와 같은 패스는 안됩니다.

lappend auto_path .

아래와 같은 배치파일을 만들어 두면 손쉽게 실행파일을 만들수 있기 때문에 만들어 두는 것이 좋을 것입니다.

make.bat

freewrap\freewrap demo.tcl -f file.lst

make.bat를 실행하면 demo.exe파일이 생성됩니다.

다국어

위의 이미지를 보면, wish로 실행 시 잘 나오던 한글이 깨져 나옵니다. tclkit으로 패키징 했을 때와 마찬가지입니다. FreeWrap은 다국어를 지원한다고 앞서 얘기했지만, 이상하게도 아래 나와있는 문서대로 했지만 되질 않습니다. 어느 일본 제작자는 이런 문제를 해결코자 FreeWrap의 코드를 수정하였습니다. (http://reddog.s35.xrea.com/archives/cat_freewrap_jp.html) 제작자에게 메일을 보내어 소스코드를 받아 새로 빌드하니 한글이 깨지지 않고 잘 나오는 것을 확인할 수 있었습니다. 한글패치된 FreeWrap을 첨부로 올립니다.

아이콘

생성된 실행파일의 아이콘은 기본 Tcl/Tk로고가 들어가게 됩니다. 이 아이콘만 보면 사용자는 Tcl/Tk로 만든 프로그램인지 쉽게 알 수 있습니다. :) 아이콘을 변경하는 방법은

wm iconbitmap . /temp/tray1.ico

과 같은 방법으로 변경할 수 있습니다. 주의할 점은 패키징 할 파일의 리스트에도 아이콘의 풀패스를 적어줘야 합니다.

lappend auto_path /temp/anigif
lappend auto_path /temp
 
package require anigif
 
wm iconbitmap . /temp/tray1.ico
 
set anilabel [label .anilabel]
::anigif::anigif /temp/anim152.gif $anilabel
set stopbutton [button .stopbutton -text "정지" -command { exit } -font {굴림체 9}]
set korlabel [label .korlabel -text "어때요? 한글이 잘 보이나요?" -font {굴림체 9}]
 
pack $anilabel $stopbutton $korlabel -pady 5 -side top

마치며

간단히 FreeWrap의 사용법에 대해서 알아보았습니다. FreeWrap은 tclkit과 마찬가지로 단일 실행파일로 패키징 하는 툴이지만, tclkit에 비하면 간단한 사용법과 암호화하여 패키징 한다는 점에 사용자를 충분히 끌어들일만한 툴인 것은 확실합니다. 더 자세한 사용법은 아래의 링크를 참조하시기 바랍니다.

 

http://freewrap.sourceforge.net/freewrap_howto.html

참고/중요 사항

FreeWrap으로 pack 한 공유파일(so, DLL)들은 load 커맨드 대신 다음의 함수로 반드시 불러와야만 합니다.

proc freewrap_load {libfile args} {
    global env
    set rtnval {}
    set fpath [::freewrap::unpack $libfile]
 
    if {[string length $fpath] == 0} {
        set rtnval "Load Error: Copying of shared library $libfile failed."
    } {
        if {[file mtime $libfile] > [file mtime $fpath]} {
            if {[catch {file delete -force $fpath}]} {
                set fpath {}
                set rtnval {Load Error: Unable to delete older copy of shared library.}
            } {
                set fpath [::freewrap::unpack $libfile]
                if {[string length $fpath] == 0} {
                     set rtnval {Load Error: Unable to replace older copy of shared library.}
                }
            }
        }
    }
 
    if {[string length $rtnval] == 0} {
        if {[catch "load \{$fpath\} $args" result]} {
            set rtnval "Load Error: $result"
        } {
            set rtnval $fpath
        }
    }
 
    return $rtnval
}

FreeWrap의 구조상 패키징 한 공유 파일들은 실행 시에 /usr/tmp에 푼 후 실제 load를 하게 되는데, Unix계열의 운영체제에서 간혹 공유파일이 제대로 load가 되지 않는다면 /usr/tmp 디렉토리의 삭제권한이 있는지 검사해야 합니다. 그리고 패키징이 제대로 되지 않는다면 Unix계열의 경우 /usr/tmp/zip 파일을 삭제하고 다시 시도하면 됩니다. Windows의 경우 환경변수 TEMP에 기록된 위치(C:\Documents and Settings\Administrator\Local Settings\Temp)의 zip.exe 파일을 삭제해 주시면 됩니다.

freewrap_demo.zip
2.81MB
freewrap561src_jp.patch.zip
0.00MB