代码: 全选
#!/bin/bash -e
# 预处理后再 ctags
# Written by AutumnCat. 19 Oct, 2008.
help(){
cat <<END
Usage: cpp-tags.sh [c|cpp|cxx|c++] <filelist >tags
END
}
export LANG=C # 消除 locale 的影响
# select language
case "$1" in
"c++"|"cxx"|"cpp")
LANG_KIND='c++'
;;
"c"|"")
LANG_KIND='c'
;;
"-?"|"-h")
help
exit 0
;;
*)
echo Unknown language: "$1" >&2
help >&2
exit 2
;;
esac
#TAGS_FILENAME=${TAGS_FILENAME:-'-'}
SORT_CMD=${SORT_CMD:-'sort'}
SORT_OPT=${SORT_OPT:-'-u'}
CPP_CMD=${CPP_CMD:-'cpp'}
CPP_OPT=${CPP_OPT:-"-x $LANG_KIND"}
CTAGS_CMD=${CTAGS_CMD:-'ctags'}
CTAGS_OPT=${CTAGS_OPT:-"-f - --language-force=$LANG_KIND --$LANG_KIND-kinds=+px --fields=+iaS --extra=+q --line-directives=yes -n -u"}
TMP_FILE_NAME=`tempfile -pcpp-tags`
TMP_FILE_DIR=`dirname "$TMP_FILE_NAME"`
TMP_FILE_BASENAME=`basename "$TMP_FILE_NAME"`
make_tag_1(){
while read i
do
"$CPP_CMD" $CPP_OPT "$i" > "$TMP_FILE_NAME" &
"$CTAGS_CMD" $CTAGS_OPT "$i"
wait
pushd "$TMP_FILE_DIR" >/dev/null
"$CTAGS_CMD" $CTAGS_OPT "$TMP_FILE_BASENAME"
popd >/dev/null
done | sort -u
}
gen_pped_code(){
rm -f "$TMP_FILE_NAME"
while read i
do
"$CPP_CMD" $CPP_OPT "$i" >> "$TMP_FILE_NAME"
done
}
make_tag_2(){
(
tee >(gen_pped_code) | "$CTAGS_CMD" -L - $CTAGS_OPT
pushd "$TMP_FILE_DIR" >/dev/null
"$CTAGS_CMD" $CTAGS_OPT "$TMP_FILE_BASENAME"
popd >/dev/null
) | sort -u
}
make_tag_2 # FIXME 不知道为什么 make_tag_1 与 make_tag_2 有时输出不同结果, make_tag_2 貌似好些
rm "$TMP_FILE_NAME"