CMake Make 파일의 dependency 를제대로세팅하는것은귀찮은작업임 CMake 는이를자동으로설정해주는도구
CMake Make 파일의 dependency 를제대로세팅하는것은귀찮은작업임 lib.h main.c main.o program bill.c fred.c bill.o fred.o libfoo.a
CMake Make 파일의 dependency 를제대로세팅하는것은귀찮은작업임 main.o : main.c lib.h gcc -c main.c bill.o : bill.c lib.h gcc -c bill.c fred.o : fred.c lib.h gcc -c fred.c libfoo.a : bill.o fred.o... program : main.o libfoo.a...
CMakeLists.txt cmake_minimum_required(version 2.6) project (test) add_executable("test" "main.c" "lib.h" "bill.c" "fred.c" )
CMakeLists.txt (using a static library) cmake_minimum_required(version 2.6) project (test) add_library( foo bill.c fred.c lib.h ) add_executable("test" "main.c" "lib.h" ) target_link_libraries( test foo )
CMakeLists.txt ( 기타자주쓰이는명령들 ) cmake_minimum_required(version 2.6) # to see actual gcc/devenv command lines set (CMAKE_VERBOSE_MAKEFILE ON) project (test) include_directories(./include ) add_executable("test" "main.c" "lib.h" "bill.c" "fred.c" ) if(win32) find_library(tourtre_library tourtre /abspath/libtourtre) target_link_libraries( test ${TOURTRE_LIBRARY}) endif()
Build using CMake ( 방법 1: In-source build) $ cmake. Makefile 이현재폴더에만들어짐 $ make
CMake Make 파일의 dependency 를제대로세팅하는것은귀찮은작업임 CMake 는이를자동으로설정해주는도구 Multi-platform development! - supports windows, cygwin, linux, OS X, and so on - cmake for cygwin is different from cmake for Windows. - the former is for gcc and make tools in cygwin - the latter is for windows visual studio or nmake CMakeLists.txt 를입력으로받아, Makefile 이나 eclipse, visual studio 의프로젝트파일로변환해준다. 리눅스에서 C/C++ 개발을할때 Make+eclipse 조합은가장쉽고직관적인개발환경을제공. 콘솔환경에서는 cmake + vim ( 또는 emacs) + cgdb + etags 조합. 익숙해지면 GUI 기반의개발툴보다편함. 윈도우에서는 cmake + visual studio 조합추천 (cygwin 은수업또는 unix app porting 시에유용.)
Build using CMake ( 방법 1: In-source build) $ cmake. Makefile 이현재폴더에만들어짐 $ make 이방법 (in-source build) 은각종 CMake 관련파일이현재폴더에생겨서소스파일들과섞이는단점이있음. 또한디버그, 릴리즈빌드등여러컴파일옵션을동시에사용할수없는등단점이많아권장되지않는방법. ( 방법 2 로넘어가기전에 cmake 가만든파일들을모두지우세요. 특히 CMakeCache.txt 는반드시지워야함.)
Build using CMake ( 방법 2: out-of-source 빌드 ) $ mkdir build $ cd build $ cmake.. Makefile 이 build 폴 더 아 래 에 만 들 어 짐 $ make 위세줄은처음한번만수행하면됨. 자동생성된 Makefile 을직접수정하지말것 소스파일추가시, CMakeLists.txt 고친후 make 수행해서 Makefile 업데이트
Build using CMake ( 디버그빌드 ) -D CMAKE_BUILD_TYPE=Debug 옵션을추가 $ mkdir build_debug $ cd build_debug $ cmake D CMAKE_BUILD_TYPE=Debug.. $ make VERBOSE=true (VERBOSE 옵션을켜보면, gcc 가사용되는것을볼수있음.) 컴파일시 g 디버그플래그 $ cgdb./test
1. Tree 구 조 Build using eclipse (out-source build 방식. 주의! src 폴더와 build 폴더를같은부모폴더밑에만들것. test_proj/src : source files and CMakeLists.txt test_proj/build : build files (release mode) test_proj/build_debug : build files (debug mode) 2. cmake 시 G Eclipse CDT4 Unix Makefiles 옵션추가 ( G 에서지원되는옵션목록은 cmake 쳐보면나옴. 윈도우에서는 Visual Studio 등지원 )
$ mkdir../build $ cd../build Build using eclipse $ cmake G Eclipse CDT4 Unix Makefiles../src $ eclipse File Import General Existing Projects into workspace Select test_proj/build folder Select a project, then press Ctrl+B (or Project build all). Run Run 이클립스안에서작업
Debug Build $ cd../build_debug $ cmake G Eclipse CDT4 Unix Makefiles D CMAKE_BUILD_TYPE=Debug../src $ eclipse File Import General Existing Projects into workspace Select test_proj/build_debug folder Select a project, then press Ctrl+B (or Project build all). Run Run 같은이클립스워크스페이스에 build_debug 도추가가능
Eclipse 사용법 Perspective ( 윈도우모양설정 ) Menu Window Open perspective Debug Menu Window Open perspective C++ 윈도우이동 ( 드래깅 ) 윈도우확대 / 축소 ( 더블클릭 ) 윈도우종류 Project Explorer ( Outline ( Console ( 함수목록 ) 실행결과 ) Problems ( 컴파일에러등 ) 워크스페이스내프로젝트목록 )
C/C++ Perspective
Debug Perspective
Run, Debugging Click project name in the project explorer Menu Run Run Menu Run Debug (Debug perspective: see callstack(debug), variables, breakpoints) Menu Run Step Into Menu Run Resume Menu Run Toggle breakpoints Eclipse 는 gdb 의주요기능을대부분지원함.
Eclipse + Cmake 또는 Visual Studio + CMake 사용시주의사항 자동생성된프로젝트파일을직접수정하지말것 프로젝트에파일추가시 CMakeLists.txt 칠것. cmake 를다시실행할필요는없음 빌드시자동으로실행됨 를직접고
etags / ctags
Contents What is ctags? Features Variants of ctags Tags file formats Using ctags with vi Practice(ctags) Using etags in emacs Practice(etags) Reference Page 24
What is ctags? 소스파일에있는항목들을쉽고빠르게찾을수있도록 tag(or index) 파 일을생성. Ken Arnold 에의해작성, BSD UNIX 에서처음소개됨. vi 와 emacs 같은텍스트에디터뿐아니라다른 utility 용가능. 들과도연동사 AcroEdit, BBEdit 8+, JED, JOE, Nedit, UltraEdit, etc Page 25
features 다양한프로그래밍언어지원. Assembler, basic, C/C++, C#, Cobol, Lisp, matlab, java, perl, etc. C/C++ 언어에서사용되는모든형식의 tag 생성가능 Class name, macro definitions, function definitions, variables, etc. 전처리기 #if 를사용한조건적구조를포함, 복잡한선택에대한해결 방법으로조건적경로선택알고리즘과 fall-back 알고리즘을사용. 사용자정의언어지원. Page 26
features Emacs 스타일의 tag 파일출력지원. 소스파일에서선택된개체의목록출력가능. 다양한 OS 상에서실행가능. UNIX, MSDOS, Linux, Windows, MacOS, OS/2, QNX, VMS, etc. Page 27
Variants of tags Etags Emacs 와 함 께 제 공 되 는 ctags utility. Vi 스 타 일 로 제 작 된 tag 파 일 과 의 호 환 성 이 떨 어 짐. Exuberant Ctags!!! 초기엔 Vim 과함께배포되었으나, Vim 6 Emacs 에대한호환성지원포함. 40 개이상의프로그래밍언어지원. sudo apt-get install exuberant-ctags 부터별도의프로젝트로분리. Hasktags Haskell 언 어 를 위 한 ctags utility. Emacs etags 지 원. Jsctags JavaScript JavaScript 를위한 ctags utility. 에서는 Exuberant Ctags 보다뛰어난성능을가짐. Page 28
Tags file formats ctags 파일형식 vi 와다양한클론들에서사용, tags 라는파일생성. {tagname}<tab>{tagfile}<tab>{tagaddress} {tagname} : 공백을포함하지않은식별자. <tab> : 구분을위한하나의 tab 문자. {tagfile} : {tagname} 이정의된위치. {tagaddress} : EX 모드에서명령사용시에쓰여질에디터상의 tag 위치. Exuberant ctags Vim 에서사용되는형식, 오리지널 ctags 형식과확장형식모두호환. {tagname}<tab>{tagfile}<tab>{tagaddress}[; <tab>{tagfield} ] Page 29
Tags file formats etags 파일형식 etags 파일은입력소스파일마다하나의섹션으로나눠진 multiple 섹션으 로구성. 각섹션은특별한목적을가진몇개의 non-ascii 문자들과일반적인텍스트 로구성. 섹션은두개의라인헤더로시작된다. <\x0c>{src_file}, {size_of_tag_definition_data_in_bytes} {tag_definition_text}<\x7f>{tagname}<\x01>{linu_number},{byte_offset} Page 30
Using etags in emacs 명령어 M-. ( find-tag ) 정 의 된 tag file 을 이 용 하 여 tag 를 찾 는 다. 프 로 젝 트 내 에 같 은 이 름 으 로 여 러 개 의 태 그 가 있 다 면 C-u M-. 을 이 용 하 여 다 음 tag 로 이 동 한 다. M-* ( pop-tag-mark ) 뒤 로 점 프 M-x tags-search regexp(regular expression) 를 이 용 한 탐 색 (shell 상 에 사 용 되 는 grep 명 령 과 비 슷 ) M-x tags-query-replace 입 력 한 query 를 통 해 검 색 된 tag 를 교 체 M-x tags-apropos 입 력 한 regexp 가 포 함 된 모 든 tag 목 록 출 력 M-x list-tags 소 스 파 일 내 에 정 의 된 모 든 tag 목 록 출 력 Page 31
Practice(etags) etags 를이용한 tag file 생성. 기본값으로 TAGS 라는이름의파일생성. -f <tagfile name> 옵션을이용하여파일이름지정가능. -a : 기존의 tag file 에추가 -V : tagfile 생성과정출력 -R : recurse, 하위폴더를포함하여 tag file 생성. Page 32
Using etags in emacs Emacs 를이용해생성된 tags 내용확인 각 각 파 파일 일 별 별로 로 섹 섹션 션이 이 나 나뉘 뉘어 어 진 진다. 다. Page 33
Using etags in emacs find tags M-. 명령이용, 찾고자하는 tag name 입력 Tag file 지정 ( 기본은 TAGS) Page 34
Using etags in emacs Etag 명령사용시 tab 음. 을이용하면매치되는명령어목록을볼수있 Page 35
Using etags in emacs regexp 를이용한 tag 검색 검색어입력 매칭되는 tag 목록을출력 Page 36
Using etags in emacs Source file 내의 tag 목록출력 Page 37
Using make with vim vim :pwd :!ls :cd src : 은확장명력을입력할때사용. vim 에도 pwd 명령이있음.! 로시작하는명령은 shell 로전달된다. :pwd :make (:!make 와달리, vim 이컴파일결과를받아온다 ) :copen (compile error 목록창열기 ) ctrl-w-s or ctrl-w-v (horizontal split window, vertical split window) ctrl-w-k ( 윗쪽윈도우로이동 ) ctrl-w-j ( 아랫쪽윈도우로이동 ) (h,j,k,l) 방향이동키대신화살표키도사용가능. Ex) ctrl-w- :q ( 현재윈도우닫기 ) Page 38
Using ctags (or etags) with vi 자주사용하는명령어들 명령어설명 :ta [tagname] Tagname 과일치하는위치로이동 Ctrl + ] Ctrl + t 커서가위치하고있는함수나구조체의정의로이동 이전위치로돌아오기 :ts [tagname] Tagname 과일치하는태그목록출력 :tj [tagname] :tn :tp :tags 목 록 이 한 개 인 경 우 이 동, 여 러 개 인 경 우 목 록 출 력 다 음 태 그 로 이 동 이 전 태 그 로 이 동 이 동 한 태 그 히 스 토 리 목 록 출 력 :sts ts 와동일, 선택된 tag 는분할된윈도우에출력 Page 39
Practice(ctags or etags) Tags 생성 etags * : 현재폴더에있는소스에대한 tag 생성 etags R : 하위폴더를포함한모든소스에대한 tag 생성 Exuberant-ctags 의경우 -R 옵션안됨. 그대신아래명령사용 Find. -iname *.cpp -or -iname *.h xargs etags Tags 내용확인 (vi TAGS) Page 40
Practice(ctags) Tag file 선택 :set tags=./tags vim 에서쉬운 tag 사용을도와주는오픈소스프로그램 https://github.com/gmarik/vundle http://valloric.github.io/youcompleteme/ https://github.com/gmarik/vundle/wiki/examples http://code.google.com/p/gitv vi 에서 tags 를이용한함수간의이동 tags stack history 확 인 Page 41
Reference source forge http://ctags.sourceforge.net/ Emacs Tags http://www.emacswiki.org/emacs/emacstags emacs http://www.gnu.org/software/emacs/emacs.html Page 42
Quiz Page 43 Download source codes of any open source program For example, FLTK or Ogre which uses CMake Build Debug-build http://www.fltk.org/software.php?version=1.3.2&file=fltk/1.3.2/fltk-1.3.2-source.tar.gz Trace a test program using cgdb Find a function which is called when a button is clicked using combinations of :vimgrep, :grep and :ts in the vim editor e.g. in the VIM :cd examples :vimgrep main *.cxx :copen :ts MyMenuCallback