이클립스 CDT 를활용한 C/C++ 개발환경구축 CDT 확장 지난호에서는자바개발도구로많이알려져있으며, 최근활발한공개프로젝트를통해다양한분야에서개발도구나리치클라이언트플랫폼으로도활용되고있는이클립스 (Eclipse, 이하이클립스 ) 와 CDT(C/C++ Development Tooling) 프로젝트를소개했다. 이번호에서는이클립스확장법과 CDT 내용을바탕으로 CDT 의확장점을확장하는플러그인 (Plug-in, 이하플러그인 ) 을개발하는방법에대해서구체적으로알아보고자한다. 이를위해먼저호스트와타깃으로구분된가상의개발환경을구축한후, 이개발환경에서이클립스와 CDT 를사용하여 C/C++ 애플리케이션개발이용이하도록 CDT 를확장한다. 스텝 4 바이스텝 연재순서 1 회 2008 년 6 월 Eclipse 와 CDT 2 회 2008 년 7 월 CDT 확장 연재가이드운영체제 무관개발도구 Eclipse 기초지식 자바, 이클립스응용분야 C/C++ 개발환경개발 주예찬 ycju@bluette.com, 육창근, 이부걸, 박중오 현재 ( 주 ) 블루엣인터내셔널에서일하고있으며, JDT, CDT, EMF, GEF 등에기반한다양한 Eclipse Plug-in 개발경험이있다. 오픈소스기반의프로젝트들을사용하거나이를활용한프로젝트진행에관심이많다. 이번호에서는 < 그림 1> 과같은호스트시스템 ( 이하호스트 ) 과타깃시스템 ( 이하타깃 ) 으로구분된개발환경을구축하고, 이환경에서보다손쉽게 C/C++ 애플리케이션을개발할수있게하는플러그인을개발하는과정을통해서 CDT 확장플러그인개발방법을설명한다. 로스컴파일러타깃환경은타깃보드의부재로환경구축이어려운독자들을감안하여 ARM용 QEMU 에뮬레이터를사용하는것으로가정했다. < 그림 1> 개발환경 Project Edit, Build Cross Compiler Cygwin MS-Windows Run, Debug FTP Binary (Executable) gdbserver 개발환경구축개발이원활히이뤄질수있도록오류없이정상적으로개발환경구축을완료해야한다. 호스트와타깃환경을구축하고크로스컴파일러의구축을완료한후환경구축테스트가정상적으로이뤄질수있도록하는과정이라는점을인지해야한다. 물론 < 그림 1> 의개발환경과동일하게구축하지않더라도호스트와타깃으로구분되어크로스컴파일러를활용하는경우라면충분히본글의내용을응용해서활용할수있을것이다. 다만본글에서는앞서소개된내역을기준으로설명한다. 구축환경에대한상세한내역은다음과같다. - 호스트운영체제 : MS-Windows 호스트환경구축호스트환경에서사용할도구인 Cygwin, 이클립스, CDT를설치하는방법은지난호에서설명한내용과동일하다. - 타깃 : ARM 용 QEMU 0.9.0 - 타깃운영체제 : Debian( 이하데비안 ) 리눅스 - 호스트와타깃과의통신 : TCP/IP(FTP) - 호스트 Cross Compiler( 이하크로스컴파일러 ) : Cygwin용 ARM 크 타깃환경구축 QEMU의 MS-Windows 버전은 http://www.h7.dion.ne.jp/ ~qemu-win/ 에서다운로드받을수있으며, 압축을해제하는 310 m a s o
CDT 확장 것만으로설치가완료된다. QEMU 설치후호스트와타깃간의네트워크연결이가능하도록 QEMU의 OS 에서네트워크를사용하기위한가상네트워크인터페이스를설치해야한다. 이를위해서 OpenVPN(http://openvpn.net/) 을다운로드해서호스트에설치한다. 가상네트워크인터페이스만을설치하면되므로 [TAP-Win32 Virtual Ethernet Adapter] 만을선택해서설치하면된다. 이런절차가완료됐다면, 이후사용의편의를위해장치의이름을 [ 로컬영역연결 2] 에서 qemu-net 으로변경한다. qemu-net이네트워크에서연결이가능하도록하기위해서는연결속성의 TCP/IP 속성을설정한다. 로컬영역연결에서사용하는네트워크주소와충돌을방지하기위해서다른 IP 주소를사용해야한다는점에주의해야한다. 이번연재에서는다음과같이설정했다고가정한다. - IP : 192.168.0.1 - SubnetMask : 255.255.255.0 그리고 [ 제어판 ] 의 [ 네트워크연결 ] 에서시스템이네트워크연결에서사용하는 [ 로컬영역연결 ] 을실행한후 [ 속성 ] -> [ 고급 ] -> [ 인터넷연결공유 ] 설정에서 [ 다른네트워크사용자가이컴퓨터의인터넷연결을통해연결할수있도록허용 ] 을체크한다. 이렇게설정하면 QEMU를실행한후에네트워크를사용할수있게된다. 다음으로 QEMU에운영체제를설치한다. 본연재에서는 QEMU용데비안운영체제이미지파일을다운로드해서사용한다. QEMU용데비안운영체제이미지파일은 http:// people.debian.org/~aurel32/qemu/arm/ 에서다음 3개의파일을다운로드한다. - debian_etch_arm_small.qcow.gz - initrd.img-2.6.18-4-versatile - vmlinuz-2.6.18-4-versatile 이렇게수정한후 qemu-arm.bat를실행하면 QEMU가실행될때다운로드받은데비안운영체제이미지파일을사용하여부팅할수있고네트워크연결또한활성화된다. 그후에는데비안운영체제의설정을위해부팅된시스템에서 root로로그인 ( 암호 : root) 한다. 먼저호스트와타깃시스템간의파일전송을위한 FTP 서버를설치하기위해우선패키지목록을업데이트하고순차적으로 proftp 서버를설치하는명령을수행한다. 그리고향후리모트디버깅에서사용할목적으로 gdbserver를설치한다. # apt-get update # apt-get install proftpd # apt-get install gdb 마지막으로다음과같이 CDT에서애플리케이션개발에사용하기위한별도의계정을생성한다. # adduser bluette 명령어실행후암호를물어보면입력해주고나머지사항에대해서는엔터를입력해서기본값을사용하면된다. 여기서는로그인ID는 bluette, 암호는 maso 를사용하는것으로가정한다. 크로스컴파일러설치본연재에서는 ARM 프로세서를에뮬레이터하는 QEMU를타깃으로사용하므로호스트에서는소스코드컴파일에 Cygwin 에서동작하는 ARM 크로스컴파일러를사용해야한다. 이를위해 FA Linux사의홈페이지 (http://www.falinux.com/ zdownload/toolchain.php) 에서제공하는 [ 시그윈 ARM GCC 3.4.3 - arm-linux-toolchain-cygwin-3.4.3.tar.gz] 을설치해서사용한다. Cygwin Bash Shell을실행한후다음과같이해당파일을다운로드하여압축을해제하면된다. 다운로드받은이미지파일들을 QEMU를설치한폴더에복사하고 debian_etch_arm_small.qcow.gz 파일은압축을해제한다. 그리고같은폴더에있는 qemu-arm.bat 파일의내용중마지막줄부분을다음과같이수정한다. $ cd / $ wget http://www.falinux.com/pds/toolchain/arm-linuxtoolchain-cygwin-3.4.3.tar.gz $ tar xvf arm-linux-toolchain-cygwin-3.4.3.tar.gz qemu-system-arm -M versatilepb -kernel vmlinuz-2.6.18-4- versatile -initrd initrd.img-2.6.18-4-versatile -hda debian_etch_ arm_small.qcow -append root=/dev/sda1 -m 256?net nic -net tap,ifname=qemu-net 환경구축테스트환경구축의마지막과정으로지금까지설치된환경이정상적으로동작하는지테스트해본다. 우선 Cygwin Bash Shell을실행한후간단한 C 프로그램을작성하여, $ arm-linux-gcc -g -o m a s o 311
스텝바이스텝 4 hello hello.c와같이크로스컴파일러를사용하여컴파일하고, 바이너리파일인 hello가생성되는지확인한다. 그리고생성된바이너리파일인 hello을 ftp를사용하여타깃에업로드한다 ( 타깃의 IP 주소는타깃에서 ifconfig 명령을실행해보면알수있다. 본글에서는타깃의 IP 주소가 192.168. 0.116 이라고가정한다 ). 업로드후타깃에서다음과같이바이너리파일을실행모드로변경한후정상적으로실행되는지확인한다. $ chmod +x hello $./hello 마지막으로리모트디버깅이정상적으로수행되는지확인하기위해서타깃에서다음과같이 gdbserver를실행한다. $gdbserver localhost:10000 hello & 그리고호스트에서다음과같이타깃의 gdbserver에연결하는리모트디버깅을구동해본다. $ armv5l-linux-gdb hello (gdb)target remote 192.168.0.116:10000 (gdb)b main CDT 확장플러그인개발앞서설치한개발환경에서 C/C++ 애플리케이션을손쉽게개발할수있도록하는 CDT 확장플러그인을개발한다. 플러그인을개발하는경우명세파일 (MANIFEST.MF, plugin.xml 등 ) 의내용수정이필요하며, 흔히이클립스에내장된 GUI 기반의명세파일편집기를활용하면해결할수있다. 이번연재에서는설명의편의를위해텍스트기반의내용을열거해서보여주는방식을사용한다. 플러그인프로젝트생성이클립스에서플러그인을개발하기위한플러그인프로젝트생성절차는다음과같다. 이클립스의 [File] -> [New] -> [Project] 메뉴를실행한다. [Plug-in Development] 카테고리의 [Plug-in Project] 를선택한다. 프로젝트의이름을 [com.bluette.cdt.masoexamples] 으로입력한다. 마법사의다른설정사항들은기본값을그대로사용하고, 단마법사의 Templates 페이지에서 [Create a plug-in using one of the templates] 체크박스를해제한다. [Finish] 를실행하여프로젝트를생성한다. 프로젝트마법사의카테고리확장 CDT의프로젝트마법사카테고리와구분될수있는새로운프로젝트마법사카테고리를만들고, 그카테고리하부에프로젝트마법사항목을추가한다. 다만새로운카테고리가추가될뿐프로젝트마법사는 CDT의것을그대로사용한다. 프로젝트마법사의확장점은 org.eclipse.ui.newwizards로서 CDT가아닌이클립스가가지고있다. 프로젝트마법사는 CDT 의것을그대로사용할것이기때문에 CDT의프로젝트마법사가정의된 org.eclipse.cdt.ui 플러그인을 MANIFEST.MF 파일의 [Require-Bundle] 항목에등록한다. 프로젝트마법사카테고리확장을위해구현한내용은 < 리스트 1> 과같다. < 리스트 1> 프로젝트마법사카테고리확장을위해 plugin.xml 에추가한내용 002 point="org.eclipse.ui.newwizards"> 003 <category 004 id="com.bluette.cdt.masoexamples.category" 005 name="maso Examples"> 006 </category> 007 <wizard 008 category="com.bluette.cdt.masoexamples. category" 009 class="org.eclipse.cdt.ui.wizards. CCProjectWizard" 010 finalperspective="org.eclipse.cdt.ui. CPerspective" 011 icon="icons/newcc_app.gif" 012 id="com.bluette.cdt.masoexamples.wizard.cc" 013 name="maso C++ Project Wizard" 014 project="true"> 015 </wizard> 016 </extension> < 리스트 1> 의 3~6라인에있는 category 요소는 [MASO Examples] 이라는이름을가진프로젝트마법사카테고리를추가하기위한내용이다. 7~15라인사이에있는 wizard 요소는마법사메인카테고리하부에 [MASO C++ Project Wizard] 프로젝트마법사를추가하기위한내용이다. 앞서정의한카테고리하부에추가하기위해서카테고리속성을 com.bluette.cdt. masoexamples.category 으로정의했다. 9라인의클래스속성은프로젝트마법사의구현클래스로서본글에서는 CDT에서제공하는 C++ 프로젝트마법사를그대로사용하므로해당클래스를그대로정의했다. 10라인의 finalper spective 속성은프로젝트마법사종료후전환될 Perspective를정의하는것으로서 312 m a s o
CDT 확장 org.eclipse.cdt.ui.cperspective (CDT Perspective) 로정의했다. 지금까지의내용을 plugin.xml 파일에추가작성한후 [Launcher] 의 [Eclipse Application] 항목을통해서실행하면마법사카테고리및프로젝트마법사항목이추가되었음을확인할수있다. ID를 com.bluette.cdt.masoexamples.managedbuilder. buildartefacttype.exe 으로정의했다. 5라인의 name 속성에서는프로젝트마법사의 [ 프로젝트타입 ] 항목에표시될이름을 ARM Executable 으로정의했다. builddefinitions을확장하기위해구현한내용은 < 리스트 3> 과같다. 프로젝트타입과툴체인확장프로젝트마법사를사용해서생성된프로젝트에서는기본적으로 Cygwin에포함된호스트컴파일러가아닌 ARM 크로스컴파일러를사용해야한다. 그러므로 ARM 크로스컴파일러를사용하는 [Project Type( 이하프로젝트타입 )] 과 [Tool-Chain( 이하툴체인 )] 을추가해서사용자가프로젝트마법사단계에서선택할수있도록하는확장이필요하다. 여기서는 Managed Make 방식의새로운프로젝트타입을추가하고이를사용하는경우 ARM 크로스컴파일러를툴체인으로사용하도록 CDT를확장한다. 이를위해서는다음 2개의확장점에대한확장이필요하다. - org.eclipse.cdt.managedbuilder.core.buildproperties( 이하 buildproperties) - org.eclipse.cdt.managedbuilder.core.builddefinitions( 이하 builddefinitions) buildproperties는새로운결과물타입에해당하는새로운프로젝트타입을추가하는확장점이고, builddefinitions는프로젝트빌드에서사용할툴체인과 buildproperties에서사용할 confi guration들을정의하는확장점이다. 이두확장점은 org.eclipse. cdt.managedbuilder.core 플러그인에정의되어있으므로이플러그인을 MANIFEST.MF 파일의 [Require-Bundle] 항목에등록한다. buildproperties를확장을위해구현한내용은 < 리스트 2> 와같다. < 리스트 2> buildproperties 확장을위해 plugin.xml 에추가한내용 002 point="org.eclipse.cdt.managedbuilder.core. buildproperties"> 003 <propertyvalue 004 id="com.bluette.cdt.masoexamples.managed builder.buildartefacttype.exe" 005 name="arm Executable" 006 property="org.eclipse.cdt.build.core. buildartefacttype"> 007 </propertyvalue> 008 </extension> < 리스트 2> 의 4 라인의 ID 속성에서새로운프로젝트타입의 < 리스트 3> builddefinitions 확장을위해 plugin.xml 파일에추가한내용 002 point="org.eclipse.cdt.managedbuilder.core. builddefinitions"> 003 <toolchain 004 id="com.bluette.cdt.masoexamples.managed builder.toolchain.base" 005 name="arm Toolchain"> 006 <targetplatform 007 binaryparser="org.eclipse.cdt.core.elf" 008 id="com.bluette.cdt.masoexamples. managedbuilder.targetplatform.base" 009 name="arm Linux Platform"> 010 </targetplatform> 011 <builder 012 id="com.bluette.cdt.masoexamples. managedbuilder.builder.base" 013 superclass="cdt.managedbuild.target. gnu.builder"> 014 </builder> 015 <tool 016 command="arm-linux-g++" 017 id="com.bluette.cdt.masoexamples. managedbuilder.cpp.compiler" 018 name="arm Linux C++ Compiler" 019 superclass="cdt.managedbuild.tool. gnu.cpp.compiler"> 020 </tool> 021 <tool 022 command="arm-linux-g++" 023 id="com.bluette.cdt.masoexamples. managedbuilder.cpp.linker" 024 name="arm Linux C++ Linker" 025 superclass="cdt.managedbuild.tool.gnu. cpp.linker"> 026 </tool> 027 <tool 028 command="arm-linux-as" 029 id="com.bluette.cdt.masoexamples. managedbuilder.assembler" 030 name="arm Linux Assembler" 031 superclass="cdt.managedbuild.tool.gnu. assembler"> 032 </tool> 033 </toolchain> 034 <projecttype 035 buildartefacttype="com.bluette.cdt. masoexamples.managedbuilder.buildartefacttype.exe" 036 id="com.bluette.cdt.masoexamples. managedbuilder.project.exe" m a s o 313
스텝바이스텝 4 037 isabstract="true" 038 name="arm Executable"> 039 <configuration 040 buildproperties="org.eclipse.cdt.build.core. buildtype=org.eclipse.cdt.build.core.buildtype.debug" 041 cleancommand="rm -rf" 042 id="com.bluette.cdt.masoexamples. managedbuilder.config.debug" 043 name="debug" 044 parent="cdt.managedbuild.config.gnu. base"> 045 <toolchain 046 id="com.bluette.toolchain.debug" 047 superclass="com.bluette.cdt. masoexamples.managedbuilder.toolchain.base"> 048 </toolchain> 049 </configuration> 050 <configuration 051 buildproperties="org.eclipse.cdt.build.core. buildtype=org.eclipse.cdt.build.core.buildtype.release" 052 cleancommand="rm -rf" 053 id="com.bluette.cdt.masoexamples. managedbuilder.config.release" 054 name="release" 055 parent="cdt.managedbuild.config.gnu. base"> 056 <toolchain 057 id="com.bluette.toolchain.release" 058 superclass="com.bluette.cdt. masoexamples.managedbuilder.toolchain.base"> 059 </toolchain> 060 </configuration> 061 </projecttype> 062 </extension> < 리스트 3> 에대한설명은다음과같다. 3~33라인사이에있는툴체인요소는툴체인에대한내용을정의한것이다. 툴체인정의에사용된하위요소들로는 targetplatform, builder, tool이있으며이들의속성들은 CDT에서 GNU C/C++ 에대해이미정의해서사용되고있는내용을상속하여사용하고변경이필요한부분만재정의했다. 6라인의 targetplatform 요소에서는 binaryparser를 org.eclipse.cdt.core.elf 로설정하여빌드후생성될바이너리파일을 CDT에서정상적으로인식할수있게했다. 11라인의 builder 요소는 cdt.managedbuild.target. gnu.builder를상속했다. 15~32라인의 tool 요소에서는 ARM 크로스컴파일러에포함된컴파일러, 링커, 어셈블러를정의한다. 이들은각각이미 CDT에정의되어있는사항들 (cdt.manag edbuild.tool.gnu.cpp.compiler, cdt.managedbuild.tool. gnu.cpp.linker, cdt.managedbuild.tool.gnu.assembler) 을상속해서사용하며, 다만 ARM 크로스컴파일러를사용할수있게각각에해당하는실행명령어만을 arm-linux-g++, armlinux-as 으로재정의했다. < 리스트 3> 의 34~61라인사이의 projecttype 요소는프로젝트타입에대해세부적으로정의하는부분이다. 35라인의 buildartefacttype 속성은 buildproperties 확장에서정의한 com.bluette.cross.managedbuilder.buildartefacttype.exe 로정의했다. 39~60라인사이의 configuration 요소는프로젝트타입에서사용할세부설정항목들을정의하는것으로서 Debug 와 Release 두가지를정의했고, 각각에사용하는툴체인요소에대해서는앞서 com.bluette.cross.managedbuilder.tool chain.base 라는 ID로정의한툴체인을사용하도록정의했다. 지금까지의내용을 plugin.xml 파일에추가작성한후 [Launcher] 의 [Eclipse Application] 항목을통해서실행한후 [File] -> [New] -> [Project ] 메뉴를통해프로젝트마법사를실행하면새로운 [ 프로젝트타입 ] 인 ARM Executable 이확장되어있고이항목을선택하면 [ 툴체인 ] 항목으로 ARM ToolChain 이확장되었음을확인할수있다. 또한프로젝트마법사의 [Select Configuration] 페이지의 [Configuration] 항목에 [Debug] 와 [Release] 가추가되어있음을확인할수있고, 프로젝트생성을완료한후 [Project Properties] 의 [C/C++ Build]->[Settings] 페이지의 [Tool settings] 탭을보면 ARM Linux C++ Compiler, ARM Linux C++ Linker, ARM Linux Assembler 가적용되어있고, 각각의 [Command] 가정의한내용에맞게적용되었음을볼수있다. 또한 [Binary parsers] 탭으로이동하면 Elf Parser 가기본으로설정된것을확인할수있다. Discovery Profile 확장앞선과정을통해서생성한프로젝트를살펴보면 ARM 크로스컴파일러를사용하고있음에도불구하고 CDT에서자동으로설정해준 Include 경로가잘못설정되는문제점을발견할수있다. 이문제를해결하기위해 CDT의 Discovery Profile을확장한다. Discovery Profile은컴파일러의기본 Include 경로및 Symbol 정보를수집하는기능을하는것으로서컴파일러를실행한출력결과를분석하여이에관한정보를자동으로수집하는방식으로설정한다. < 화면 4> 와같이 Include 경로가잘못설정된것은정보수집에사용하는컴파일러가 Cygwin의기본컴파일러로설정되어있기때문이므로, 이에대한설정을 ARM 크로스컴파일러로변경하면문제를해결할수있을것이다. 이에관한동작원리는지난호의 Discovery Option에대한내용을참고할수있다. Discovery Profile은 org.eclipse.cdt.make.core. 314 m a s o
CDT 확장 ScannerConfigurationDiscoveryProfile( 이하 Discovery Profile) 확장점을통해서확장할수있다. Discovery Profile 확장을위해 plugin.xml에추가된내용은 < 리스트 4> 와같다. < 리스트 4> Discovery Profile 확장을위해 plugin.xml 에추가한내용 002 id="com.bluette.cdt.masoexamples.armlinux ScannerConfigCPP" 003 name="arm Linux Scanner Config CPP" 004 point="org.eclipse.cdt.make.core.scanner ConfigurationDiscoveryProfile"> 005 <scannerinfocollector 006 class="org.eclipse.cdt.make.internal.core. scannerconfig2.perprojectsicollector " 007 scope="project"> 008 </scannerinfocollector> 009 <scannerinfoprovider 010 providerid="specsfile"> 011 <run 012 arguments="-e -P -v -dd ${plugin_state_location}/specs.cpp" 013 class=" org.eclipse.cdt.make.internal. core.scannerconfig2.gccspecsrunsiprovider " 014 command="arm-linux-g++"> 015 </run> 016 <scannerinfoconsoleparser 017 class="org.eclipse.cdt.make.internal. core.scannerconfig.gnu.gccspecsconsoleparse"> 018 </scannerinfoconsoleparser> 019 </scannerinfoprovider> 020 </extension> < 리스트 4> 의 6, 13, 17 라인에정의된클래스는 CDT에구현되어있는클래스를그대로사용한것이다. 본글에서사용하는 ARM 크로스컴파일러가 GNU C/C++ 의스펙을그대로따르고있기때문에 CDT 내부에구현되어있는관련클래스들을사용해도결과분석에문제가없기때문에추가구현없이클래스를그대로사용한다. 14라인에정의된 command 속성에서정의한 arm-linux-g++ 는분석에사용할실행명령어를정의한것이다. 이렇게확장된내용을새로만든프로젝트타입에적용 < 리스트 5> Discovery Profile 확장을위한 builddefinitions 수정내용 001 <inputtype 002 id="com.bluette.cdt.masoexamples.managed builder.cpp.compiler.input" 003 name="arm Linux C++" 004 scannerconfigdiscoveryprofileid="com. bluette.cdt.masoexamples.armlinuxscannerconfigcpp" 005 superclass="cdt.managedbuild.tool.gnu. cpp.compiler.input"> 006 </inputtype> 하려면다음 < 리스트 5> 의내용을 < 리스트 3> 의 19~20라인사이에추가한다. inputtype 요소는툴에서사용하는 input의유형들을정의하는것으로기본적인것은 CDT에정의된내용을상속해서사용하고변경을하려는 scannerconfigdiscoveryprofileid 속성만을새로만든 Discovery Profile 확장내용으로재정의했다. 지금까지의내용을 plugin.xml 파일에작성한후 [Launcher] 의 [Eclipse Application] 항목을통해서플러그인을실행하면 < 화면 1> 과같이 ARM 크로스컴파일러에서사용하는 include 경로가정상으로설정되어있음을확인할수있다. < 화면 1> NateOnMain.exe 의타입라이브러리 현재설정된 Discovery Profile의내용을확인하려면 [Project Properties] 대화상자의 [C/C++ Build] -> [Discovery options] 페이지에서 [ARM Linux C++] 타입에대한 [Discovery profile] 에 ArmLinuxScannerConfigCPP 가디폴트로설정된것을확인할수있다. 그리고 Discovery Profile 확장을통해수집된 Include 경로와 Symbol 정보는 [Project Properties] 대화상자의 [C/C++ General] -> [Paths and Symbols] 페이지에서 [Includes] 탭과 [Symbols] 탭에서확인가능하다. 템플릿확장이번에는프로젝트생성시원하는골격코드가바로생성되도록하는프로젝트템플릿을추가해본다. 템플릿을확장하려면 org.eclipse.cdt.core.templates( 이하 templates) 확장점을확장 < 리스트 6 > templates 확장을위해 plugin.xml 파일에추가한내용 002 point="org.eclipse.cdt.core.templates"> 003 <template 004 filterpattern=".*" 005 id="com.bluette.cdt.masoexamples. templates.templateproject" 006 iscategory="false" 007 location="templates/projecttemplates/ SingletonProject/template.xml" 008 projecttype="com.bluette.cdt.masoexamples. managedbuilder.buildartefacttype.exe"> 009 </template> 010 </extension> m a s o 315
스텝바이스텝 4 해야한다. 이확장점은 org.eclipse.cdt.core 플러그인에포함되어있으므로먼저해당플러그인을 MANIFEST.MF 파일의 [Require-Bundle] 항목에등록한다. < 리스트 6> 은 templates 확장을위해 plugin.xml 파일에추가된내용이다. < 리스트 6> 에서 7라인은생성될템플릿생성에관한세부내역이정의되어있는 template.xml의경로를지정하는부분이다. 8 라인은 template이사용될프로젝트타입을지정하는부분으로서앞서정의한 builddefinitions에서의프로젝트타입 id를사용해서 ARM Executable 프로젝트타입의하부항목으로템플릿이표시되도록한다. template.xml 파일의내용은 < 리스트 7> 과같다. < 리스트 7 > template.xml 파일 001 <?xml version="1.0" encoding="iso-8859-1"?> 002 <template type="project Template" version="1.0" author="" 003 id="singletonexe" label="singleton C++ Design Pattern EXE Project"> 004 <property-group id="basics" label="basic Settings" description="basic properties of a singleton project" type="pages-only"> 005 <property id="author" 006 label="author" 007 description="name of the author" 008 type="input" 009 pattern=".*" 010 default="" 011 hidden="false" 012 persist="true"/> 013 <property id="copyright" 014 label="copyright notice" 015 description="your copyright notice" 016 type="input" 017 pattern=".*" 018 default="your copyright notice" 019 hidden="false" 020 persist="true"/> 021 <property id="singleton" 022 label="singleton" 023 description="singleton class name to be used in the Singleton design pattern" 024 type="input" 025 default="singleton" 026 pattern="[a-za-z0-9]+" 027 mandatory="true" 028 persist="true"/> 029 </property-group> 030 <process type="org.eclipse.cdt.managedbuilder. core.newmanagedproject"> 031 <simple name="name" value="$(projectname)" /> 032 <simple name="artifactextension" value="" /> 033 <simple name="iscproject" value="false" /> 034 </process> 035 <process type="org.eclipse.cdt.core.createsource Folder"> 036 <simple name="projectname" value= "$(projectname)" /> 037 <simple name="path" value="src" /> 038 </process> 039 <process type="org.eclipse.cdt.managedbuilder.core. CreateIncludeFolder"> 040 <simple name="projectname" value="$(project Name)" /> 041 <simple name="path" value="inc" /> 042 </process> 043 <process type="org.eclipse.cdt.core.addfiles"> 044 <simple name="projectname" value="$(project Name)" /> 045 <complex-array name="files"> 046 <element> 047 <simple name="source" value="inc/ Singleton.h" /> 048 <simple name="target" value="inc/$ (Singleton).h" /> 049 <simple name="replaceable" value="true" /> 050 </element> 051 <element> 052 <simple name="source" value="src/ Singleton.cpp" /> 053 <simple name="target" value="src/$ (Singleton).cpp" /> 054 <simple name="replaceable" value="true" /> 055 </element> 056 <element> 057 <simple name="source" value="src/main. cpp" /> 058 <simple name="target" value="src/main. cpp" /> 059 <simple name="replaceable" value="true" /> 060 </element> 061 </complex-array> 062 </process> 063 </template> < 리스트 7> 5~29라인은사이의 property 요소들은프로젝트마법사에서사용자가입력하게할항목을정의한다. 그리고사용자가마법사페이지에서입력한항목은프로젝트생성시에 template.xml 파일과프로젝트에추가되는소스템플릿내에서 $(property) 형식의내용을대체해서사용된다. 30~62라인사이의 process 요소는템플릿생성시처리할작업을정의한부분으로서 31~35라인은 Managed Make 프로젝트를생성하는부분이며, 34~42라인은생성된프로젝트에 src 디렉토리와 inc 디렉토리를생성하는부분이고, 43~62라인은생성된프로젝트에미리만들어진소스파일을추가하는부분이다. 그리고이렇 316 m a s o
CDT 확장 < 리스트 8> 템플릿소스코드중 main.cpp 파일 001 /* =================================================== 002Name : Main.cpp 003 Author : $(author) 004 Version : 005 Copyright : $(copyright) 006 Description : Main function 007 ====================================================*/ 008 #include <iostream> 009 using namespace std; 010 011 #include "../inc/$(singleton).h" 012 013 int main (int argc, char *argv[]) { 014 // Constructor is protected -- cannot use new 015 $(Singleton)* s1 = $(Singleton)::Instance(); 016 $(Singleton)* s2 = $(Singleton)::Instance(); 017 if (s1!= s2) { 018 cout << "$(Singleton) objects are not the same instance" << endl; 019 } 020 return 0; 021 } 게작성한 template.xml 파일이위치하는경로는 templates 확장에서정의한파일의경로와일치해야한다. 지금까지의내용을작성한후 [Launcher] 의 [Eclipse Application] 항목을통해서실행하면프로젝트마법사의 [ARM Executable] 프로젝트타입하부에새로운프로젝트템플릿인 Singleton C++ Design Pattern EXE Project 이확장되어있다. 그리고 [Next] 버튼을실행하면 Template에서정의한 Property 값을입력받을수있는 UI 가표시된다. 배포및설치개발완료된플러그인을배포하고설치하는방법은일반적인플러그인과도동일하다. 버그 Launcher 대화상자를실행한후 [C/C++ Local Application] 에새로운 Launcher 항목을생성한다. Launcher의 [Debugger] 탭에서 [Debugger] 항목을 gdbserver Debugger 로설정하고, [Debugger options] 의 [Main] 탭에서 [GDB debugger] 를설치한크로스컴파일러에포함된디버거인 armv5l-linux-gdb.exe 를입력한다. 이파일은 Cygwin이설치된폴더하부의 bin 폴더에서찾을수있다. [Debugger option] 에있는 [Connection] 탭에서 [Type] 을 TCP 로변경하고 [Host nameor IP address] 에타깃의 IP 주소를입력하고 [Port Number] 에포트번호 (10000) 를입력한다. [Debug] 를실행한다. 지난호에서잠시언급한것처럼리모트실행과디버깅과정을자동화하기위해 RSE의 RemoteCDT를사용할수있으나, RemoteCDT의경우타깃시스템에 dstore 데몬을설치해야하는데, dstore 데몬의경우 Java로구현되어있어 JRE가정상적으로설치된시스템에서만동작하고사이즈가비교적큰관계로임베디드애플리케이션개발에서활용하는데는문제점이있다. 이를해결하기위해 RSE 3.0에서는 C로구현된 Target Communication Framework가개발될예정이다. 마치며이번호에서는 CDT에서제공하는확장점들중에서도흔히활용되는확장점들을설명했다. 지난호에서소개한 CDT 활용사례들에서도본글에서소개한이상의확장점을사용하는사례는흔치않기때문에대부분의경우본연재에서설명된확장점을사용하는것만으로도충분한기능확장에활용할수있을것이다. 보다더욱다양한 CDT 확장점들에대해서알고싶다면 CDT 도움말의 CDT Plug-in Development Guide 를참고하기바란다. 결과물실행설치가완료된이후에이클립스를다시실행한후새롭게확장한기능을사용해서프로젝트를생성하고빌드한다. 여기에서생성된바이너리파일을 FTP를이용하여타깃에업로드해서정상적으로실행이되는지확인한다. 그리고리모트디버깅을다음과같이수행해본다. 타깃시스템에서다음과같은명령을수행한다. $ gdbserver localhost:10000 [ 바이너리파일명 ] & 호스트시스템의이클립스에서 [Run] -> [Open Debug Dialog] 로디 이달의디스켓 : cdt.zip 참고자료 1.CDT Wiki, http://wiki.eclipse.org/index.php/cdt 2.CDT Plug-in Developer Guide, 이클립스도움말 3.CDT 홈페이지, http://www.eclipse.org/cdt/ 4.QEMU on Windows 홈페이지, http://www.h7.dion.ne.jp/~qemu-win/ 5.FA Linux 홈페이지, http://falinux.com/ 6.OpenVPN 홈페이지, http://openvpn.net/ 7. 김도집, 윈도우에서리눅스환경만들기, http://kelp.or.kr/korweblog/stories.php?story=07/05/11/9412906 m a s o 317