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