전에도 위키등에 몇번 적었는데 이번에 새로 세팅을 하게되서 최소한의 절차만 적어둔다.
후에 내가 읽어보는게 목적.
- cscope 다운로드
http://code.google.com/p/cscope-win32/
이번에 다시 뒤져보니 win32 port 가 다시 진행되는듯? 이전엔 16.0 이던가 하는 이상한 버전으로 오랫동안 멈춰있어서 쓰기가 좀 거북했었는데.. 우왕굿.
- xcscope.el 세팅
나야 emacs 설정들을 mercurial 로 관리하고 있고 리파지토리를 dropbox 로 들고있으니 새로 받을 일은 없지만 적어둔다.
[code]
(require 'xcscope)[/code] - cscope-indexer 설치
나는 주로 c:/bin 또는 c:/opt/bin 에 넣어둔다. 이쪽 툴들도 dropbox 에 짱박아야 겠군...
펼쳐두기..
[code]
#! /bin/sh
###############################################################################
#
# File: cscope-indexer
# RCS: $Header: /cvs/root/cscope/cscope/contrib/xcscope/cscope-indexer,v 1.1.1.1 2002/01/09 18:50:30 umeshv Exp $
# Description: Script to index files for cscope
#
# This script generates a list of files to index
# (cscope.out), which is then (optionally) used to
# generate a cscope database. You can use this script
# to just build a list of files, or it can be used to
# build a list and database. This script is not used to
# just build a database (skipping the list of files
# step), as this can be simply done by just calling
# "cscope -b".
#
# Normally, cscope will do its own indexing, but this
# script can be used to force indexing. This is useful
# if you need to recurse into subdirectories, or have
# many files to index (you can run this script from a
# cron job, during the night). It is especially useful
# for large projects, which can contstantly have source
# files added and deleted; by using this script, the
# changing sources files are automatically handled.
#
# Currently, any paths containing "/CVS/" or "/RCS/" are
# stripped out (ignored).
#
# This script is written to use only basic shell features, as
# not all shells have advanced features.
#
# Author: Darryl Okahata
# Created: Thu Apr 27 17:12:14 2000
# Modified: Tue Jun 19 09:47:45 2001 (Darryl Okahata) darrylo@soco.agilent.com
# Language: Shell-script
# Package: N/A
# Status: Experimental
#
# (C) Copyright 2000, Darryl Okahata, all rights reserved.
#
###############################################################################
#
# Usage:
#
# cscope-indexer [ -v ] [-f database_file ] [-i list_file ] [ -l ] [ -r ]
#
# where:
#
# -f database_file
# Specifies the cscope database file (default: cscope.out).
#
# -i list_file
# Specifies the name of the file into which the list of files
# to index is placed (default: cscope.files).
#
# -l
# Suppress the generation/updating of the cscope database
# file. Only a list of files is generated.
#
# -r
# Recurse into subdirectories to locate files to index.
# Without this option, only the current directory is
# searched.
#
# -v
# Be verbose. Output simple progress messages.
#
#
###############################################################################
set -e
# May have to edit this:
PATH="/usr/local/bin:/sbin:/usr/sbin:/bin:/usr/bin:$PATH"
export PATH
LIST_ONLY=
DIR='.'
LIST_FILE='cscope.files'
DATABASE_FILE='cscope.out'
RECURSE=
VERBOSE=
export DIR RECURSE # Need to pass these to subprocesses
while [ -n "$1" ]
do
case "$1" in
-f)
if [ "X$2" = "X" ]
then
echo "$0: No database file specified" >&2
exit 1
fi
DATABASE_FILE="$2"
shift
;;
-i)
if [ "X$2" = "X" ]
then
echo "$0: No list file specified" >&2
exit 1
fi
LIST_FILE="$2"
shift
;;
-l)
LIST_ONLY=1
;;
-r)
RECURSE=1
;;
-v)
VERBOSE=1
;;
*)
DIR="$1"
;;
esac
shift
done
cd $DIR
if [ "X$VERBOSE" != "X" ]
then
echo "Creating list of files to index ..."
fi
(
if [ "X$RECURSE" = "X" ]
then
# Ugly, inefficient, but it works.
for f in *
do
echo "$DIR/$f"
done
else
find $DIR \( -type f -o -type l \)
fi
) | \
egrep -i '\.([chly](xx|pp)*|cc|hh)$' | \
sed -e '/\/CVS\//d' -e '/\/RCS\//d' -e 's/^\.\///' | \
sort > $LIST_FILE
if [ "X$VERBOSE" != "X" ]
then
echo "Creating list of files to index ... done"
fi
if [ "X$LIST_ONLY" != "X" ]
then
exit 0
fi
if [ "X$VERBOSE" != "X" ]
then
echo "Indexing files ..."
fi
cscope -b -i $LIST_FILE -f $DATABASE_FILE
if [ "X$VERBOSE" != "X" ]
then
echo "Indexing files ... done"
fi
exit 0
[/code]
- cscope-indexer 가 쉘스크립트이므로 msys shell 을 깔아준다.
나야 어차피 mingw 를 자주 쓰니 문제 없지만 혹시나 cscope 때문에 쉘까지 까는게 싫다면 다른 방식으로 스크립트를 만들면 해결될듯. 목록만들고 cscope -b 돌리는게 전부다.
- emacs 가 cscope-indexer 를 실행할수 있도록 cscope-indexer.bat 파일을 만든다. 역시 c:/bin 또는 c:/opt/bin 을 애용중
[code]
C:\msys\1.0\bin\sh cscope-indexer %1 %2 %3 %4 %5 %6 %7 %8 %9[/code] - 시스템헤더랄까? 윈도쪽에선 뭐라고 해야 하나 어쨌건 프로젝트마다 공통적으로 쓰는 헤더들을 찾도록 cscope-database-regexps 를 지정해준다. 아래는 간단한 예제
[code]
(setq cscope-database-regexps
'(
;; 이런식으로 추가해 나가자. 상세한것은 C-h v cscope-database-regexps
("C:/HOME/src/foo/src"
(t)
("C:/HOME/src/foo/extlibs"))
;; more
;; default
("."
(t)
("C:/Boost/include/boost-1_42/boost")
("C:/Program Files/Microsoft SDKs/Windows/v6.0A/Include")
("C:/Program Files/Microsoft Visual Studio 9.0/VC/include")
t)))[/code] - 위에서 지정한 세개의 기본검색 경로에 각각 cscope.out 을 만들어준다. 간단히 emacs 에서 C-c s I 로 지정해줘도 되지만 C++ 표준헤더의 경우 확장자가 없어서 이방법으로는 누락이 되니 직접 cscope.files 를 만들고 이를 통해 cscope.out 을 뽑는 수고를 해야 한다. gnu find 등을 쓰면 간단.
우왕ㅋ굳ㅋ
현재 나는 gnu global 이 주력 태깅툴이고 cscope 는 cscope-database-regexps 때문에 프로젝트 외부 코드를 따라갈때 쓴다. 즉 어떤 프로젝트 루트가 foo 일때 foo 이하는 빌드시 gtags 를 매번 돌려서 태깅을 해두고 코딩시 내가 찾으려는 심볼이 프로젝트 내부의 것인지 외부것인지 정도는 머리속에 들어있으니 상황따라 global, cscope 를 구분해서 쓰는 편.
댓글 없음:
댓글 쓰기