source insight 導入linux內核源碼時,僅導入編譯鏈接需要的源碼。則需要以文件目錄形式導入,下文腳本即為此應用。
引用原帖:(侵刪)
不要錯過!SourceInsight 快速、精確導入 Linux Kernel 源碼的方法
ps:
原文中的腳本輸出文件無法直接用到si中,需要修改為windows下的絕對路徑,路徑符也要改成windows的'\'。
修改后的腳本如下:
其中ABS_PATH需要改為自己windows下linux內核所在的絕對目錄並且要用linux路徑符'/'。
輸出文件可直接導入source insight4中。
#!/bin/sh
ARCH=arm
MACH=imx
FILE_IN=$1
FILE_OUT=$2
#windows abs path
ABS_PATH="Z:/alpha_board/linux_kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga/"
# .c
SOURCE_LIST=""
# generated file list
FILE_LIST=""
# nest depth for function get_includes()
NEST_DTPTH=0
# recursive function, used to get included files from files.
# result is stored in FILE_LIST
# $1 : file list, e.g. "fs/ext4/file.c fs/ext4/fsync.c"
get_includes()
{
local includes
local file
for file in $1
do
if [ ! -e ${file} ]; then
continue
fi
if echo "${FILE_LIST}" | grep -E ${file} > /dev/null; then
continue
fi
FILE_LIST="${FILE_LIST} ${file}"
NEST_DTPTH=$((NEST_DTPTH+1))
echo "<${NEST_DTPTH} : ${file}"
includes=$( \
grep -E -H '^#include' ${file} | \
sed -r \
-e 's@^.*<(acpi/.*)>@include/\1@' \
-e 's@^.*<(asm-generic/.*)>@include/\1@'\
-e 's@^.*<(config/.*)>@include/\1@' \
-e 's@^.*<(crypto/.*)>@include/\1@' \
-e 's@^.*<(drm/.*)>@include/\1@' \
-e 's@^.*<(generated/.*)>@include/\1@' \
-e 's@^.*<(keys/.*)>@include/\1@' \
-e 's@^.*<(linux/.*)>@include/\1@' \
-e 's@^.*<(math-emu/.*)>@include/\1@' \
-e 's@^.*<(media/.*)>@include/\1@' \
-e 's@^.*<(misc/.*)>@include/\1@' \
-e 's@^.*<(mtd/.*)>@include/\1@' \
-e 's@^.*<(net/.*)>@include/\1@' \
-e 's@^.*<(pcmcia/.*)>@include/\1@' \
-e 's@^.*<(rdma/.*)>@include/\1@' \
-e 's@^.*<(rxrpc/.*)>@include/\1@' \
-e 's@^.*<(scsi/.*)>@include/\1@' \
-e 's@^.*<(sound/.*)>@include/\1@' \
-e 's@^.*<(target/.*)>@include/\1@' \
-e 's@^.*<(trace/.*)>@include/\1@' \
-e 's@^.*<(uapi/.*)>@include/\1@' \
-e 's@^.*<(video/.*)>@include/\1@' \
-e 's@^.*<(xen/.*)>@include/\1@' \
-e "s@^.*<(asm/.*)>@arch/${ARCH}/include/\1 arch/${ARCH}/include/generated/\1@" \
-e "s@^.*<(mach/.*)>@arch/${ARCH}/mach-${MACH}/include/\1@" \
-e 's@(^.*/)[^/]+\.c.*\"(.*)\"@\1\2@' \
-e 's@/\*.*@@' \
-e 's@^.*\#include.*$@@' \
-e 's@^@ @' | \
sort | \
uniq | \
tr -d '\n' | \
tr -d '\r' \
)
if [ -n "${includes}" ]; then
get_includes "${includes}"
fi
echo ">${NEST_DTPTH}) : ${file}"
NEST_DTPTH=$((NEST_DTPTH-1))
done
}
# get *.c from kernel build log
SOURCE_LIST=$( \
grep -E '^\s*CC' ${FILE_IN} | \
sed -r \
-e 's/^\s*CC\s*/ /' \
-e 's/\.o/\.c/' | \
tr -d '\n' | \
tr -d '\r' \
)
echo ${SOURCE_LIST}
get_includes "${SOURCE_LIST}"
FILE_LIST=$(echo "${FILE_LIST}" | sed -r -e 's/\s/\r\n/g' )
echo "${FILE_LIST}" > ${FILE_OUT}
#sed -i 's///\\/g' ${FILE_OUT}
#替換行首為windows路徑
sed -i "s#^#${ABS_PATH}#g" ${FILE_OUT}
#替換linux路徑符'/'為windows路徑符'\'
sed -i "s#/#\\\#g" ${FILE_OUT}
使用方法:
在內核目錄先make clean,重新make並將編譯信息輸出到 build_log.txt 后再執行此腳本。
$ make clean
CLEAN .
CLEAN arch/arm/kernel
CLEAN arch/arm/vdso
CLEAN drivers/tty/vt
CLEAN drivers/video/logo
CLEAN firmware
CLEAN kernel/time
CLEAN lib
CLEAN usr
CLEAN arch/arm/boot/compressed
CLEAN arch/arm/boot/dts
CLEAN arch/arm/boot
CLEAN .tmp_versions
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j8 >build_log.txt
CHK include/config/kernel.release
CHK include/generated/uapi/linux/version.h
CHK include/generated/utsrelease.h
CC scripts/mod/empty.o
HOSTCC scripts/kallsyms
HOSTCC scripts/genksyms/genksyms.o
HOSTCC scripts/dtc/dtc.o
......
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
$ ./sg.sh build_log.txt file_list.txt