위대한 비주얼스튜디오가 없어서 개발하기 빡센 유닉스(터미널)환경에서 살아가기 위한 몸부림.
vim + cscope를 이용한 코드분석방법.
우선 현재 사용하고 있는 vim이 cscope 를 지원하는지 체크해 봐야 합니다.
$ vi –version | grep cscope
를 입력해 보시면 cscope라는 단어 앞에 +, – 가 붙어있을텐데 + 가 붙어있다면 현재 vim을 그대로 사용할수 있는거고 – 가 붙어있다면 다시 컴파일해야 합니다.
Vim을 다시 컴파일 해야 할 경우
http://www.vim.org 에서 최신 vim의 unix 버전 소스를 다운 받습니다. 대략 (vim-7.0.tar.gz) 이런 이름.
이걸 유닉스에서 압축을 풀고 해당 디렉토리안에 들어가면 Makefile, configure 등이 있는데
우선
$ ./configure –enable-cscope –enable-multibyte
를 입력하면 뭔가 체크하면서 make 파일을 생성합니다.
그리고 나서
$make
하시면 컴파일이 됩니다.
Src 폴더 안쪽으로 들어가면 vim 실행파일이 생성되어 있습니다. 정상적으로 실행이 되는지
$./vim
으로 테스트해 봅니다.
Vim 7.0의 경우 vim 환경변수가 필요한데 해당 변수는 vim이 실행시 읽어들이는 syntax 나 플러그인 파일의 기준경로입니다.
기본적으로는 /usr/local/share/vim 으로 되어있습니다. 만약 잘못되어 있다면 수정해 줍니다.
Vim 이 정상적으로 잘 실행이 되면 자신의 local/bin 경로에 넣어두거나 쉘의 alias를 수정하여 새롭게 컴파일한 vim이 기본적으로 실행되도록 해놓습니다.
Cscope 준비
$cscope
를 실행해서 뭔가 파일입력하라고 나온다거나 하면 cscope가 시스템에 있어서 따로 컴파일할 필요가 없습니다.
Cscope 컴파일
만약 정상실행이 안되서 따로 컴파일이 필요하다면 cscope.sourceforge.org 에서 최신버전을 다운받습니다. (cscope-15.6.tar.gz)
이것도 유닉스에다 받아서 압축을 풀고 해당 디렉토리로 들어가서
$./configure
$make
를 입력해서 컴파일 합니다.
Src 디렉토리에 들어가면 cscope 라는 실행파일이 생성되어있습니다.
해당 파일을 자신의 local/bin에 넣습니다.
Cscope 설정
이제 cscope의 사용을 편리하게 하기 위해서 스크립트를 작성합니다.
스크립트명은 대략 mkcscope 라고 하고 코드는
#!/bin/sh
rm -rf cscope.out cscope.files
find . \( -name ‘*.c’ -o -name ‘*.cpp’ -o -name ‘*.cc’ -o -name ‘*.h’ -o -name ‘*.m’ -o -name ‘*.s’ -o -name ‘*.S’ \) -print > cscope.files
cscope -i cscope.files
입니다. 해당 스크립트를 실행한 위치에서 위에 언급한 소스파일에 대한 심볼 데이타 베이스를 만들라는 의미입니다.
위 스크립트 역시 local/bin에 넣어두고 실행권한을 줍니다.
이제 vim에서 cscope를 사용할수 있도록 설정을 해주어야 합니다.
자신의 홈디렉토리의 .vimrc 파일에
” cscope 설정
set csprg=$HOME/local/bin/cscope
set csto=0
set cst
set nocsverb
“ 작업 중인 디렉토리 밑의 내용 추가
if filereadable(“cscope.out”)
cs add cscope.out
” 아니면 환경 변수에 설정된 내용 추가
elseif $CSCOPE_DB != ““
cs add $CSCOPE_DB
endif
set cscopeverbose “ 파일 추가 후에만 자세한 내용 보이게 함
” cscope 단축키
nmap <C-[>s :cs find s <C-R>=expand(“<cword>“)<CR><CR>
nmap <C-[>g :cs find g <C-R>=expand(“<cword>“)<CR><CR>
nmap <C-[>c :cs find c <C-R>=expand(“<cword>“)<CR><CR>
nmap <C-[>t :cs find t <C-R>=expand(“<cword>“)<CR><CR>
nmap <C-[>e :cs find e <C-R>=expand(“<cword>“)<CR><CR>
nmap <C-[>f :cs find f <C-R>=expand(“<cfile>“)<CR><CR>
nmap <C-[>i :cs find i ^<C-R>=expand(“<cfile>“)<CR>$<CR>
nmap <C-[>d :cs find d <C-R>=expand(“<cword>“)<CR><CR>
을 추가합니다.
이제 설정이 종료되었습니다.
사용법
소스가 있는 디렉토리로 이동하여
$mkcscope
를 입력하면 cscope.out 이라는 파일이 생성됩니다. (해당 파일은 심볼의 DB파일로 소스가 변경이 된다면 갱신을 해주는 것이 좋습니다.)
이후 vim 을 이용하여 해당 디렉토리의 소스의 편집을 시작합니다.
Vim 사용중 특정 함수가 어디서 호출되는지 알고 싶다면
:cs find s [함수명, 클래스명]
을 입력합니다. 이후 리스트가 나오고 번호를 입력하여 해당 소스의 위치로 이동이 가능합니다.
소스 코드의 위치 이동후 소스를 다 확인했으면
CTRL+o 로 이전화면으로 이동 가능하며
CTRL+i 로 다시 cscope에 의해 옮겨 졌던 화면이로 이동가능합니다.
만약 함수가 어디서 선언되었는지 알고 싶다면
:cs find g [함수명or 클래스명]
을 입력합니다.
위에서 .vimrc에 입력한 내용에는 단축키도 있는데
특정 단어위에 커서를 두고
“CTRL+[“ + “s”
또는
“CTRL+[“ + “g”
로 위의 cs 명령과 동일한 동작을 수행합니다.
후기.
C분석은 꽤 잘되는 편이고 C++은 문법상 클래스명과 함수명이 같이 나오므로 나름 보기 나쁘지 않을것 같은데 OBJ-C 같은 경우는 문법이 함수명 근처에 클래스명이 존재하지 않아서 보기 좀 빡셈…