很简单的bash脚本,用来在linux上分析源码使用。

如今我在移植内核的tools/perf到android,linux kernel 3.8.0rc才开始正式涉足android移植这个问题,之前都是google公司自己修改后放到external/linux-tools-perf目录下去编译的。根据toos/perf/Documentaion/android.txt的指导去做,结果3.8.0rc的perf都没法编译通过,更不要提我自己去打补丁的3.0.31版本了。3.8.0rc还没正式发布,正在开发中,也能理解。我自己先想办法排除这些编译错误。主要是交叉编译的时候,头文件引用很混乱,比较纠结。刚好借这个机会介绍其中一个小工具searchheader。

  • onsource command :对于本目录树上所有的C/C++/ASM/JAVA源文件,执行命令command。
find . -regex ".*\.c\|.*\.cpp\|.*\.java|.*\.S|.*\.s" -exec $@ \{\} \;

例子:

onsource grep -H -n helloworld
在目录树上所有源文件中寻找helloworld并列出文件名和行号
  • onheader command :对于本目录树上所有头文件,执行命令command
find . -regex ".*\.h" -exec $@ \{\} \;


 

  • searchheader type value : type 目前可以是file和word。
#!/bin/bash
for i in util/include \
                arch/arm/include \
                /home/hzh/linux-kernel/linux/arch/arm/include/uapi \
                /home/hzh/linux-kernel/linux/arch/arm/include \
                /home/hzh/linux-kernel/linux/include/uapi       \
                /home/hzh/linux-kernel/linux/include    \
                /home/hzh/android/ndk/build/platforms/android-3/arch-arm/usr/include    \
                ; do
    case $1 in
        file) [ -a ${i}/$2 ] && echo $2 in $i;;
        word) [ -d $i ] && grep -R -H -n $2 $i;;
    esac
done

用例:
编译perf android版本,第一个出错信息是__kernel_nlink_t未定义

hzh@fangtian:~/linux-kernel/linux/tools/perf$ make ARCH=arm CROSS_COMPILE=${NDK_TOOLCHAIN} CFLAGS="--sysroot=${NDK_SYSROOT}" -d
。。。
CC perf.o
In file included from /home/hzh/android/ndk/build/platforms/android-3/arch-arm/usr/include/unistd.h:33:0,
                 from util/util.h:46,
                 from builtin.h:4,
                 from perf.c:9:
/home/hzh/android/ndk/build/platforms/android-3/arch-arm/usr/include/sys/types.h:65:1: error: unknown type name '__kernel_nlink_t'

先寻找__kernel_nlink_t在INCLUDE_PATH上的什么头文件中出现过

hzh@fangtian:~/linux-kernel/linux/tools/perf$ searchheader word __kernel_nlink_t
/home/hzh/android/ndk/build/platforms/android-3/arch-arm/usr/include/sys/types.h:65:typedef __kernel_nlink_t     nlink_t;
/home/hzh/android/ndk/build/platforms/android-3/arch-arm/usr/include/asm/posix_types.h:24:typedef unsigned short __kernel_nlink_t;

看来它在asm/posix_types.h中定义。
然后寻找asm/posix_types.h有几个同名文件:

hzh@fangtian:~/linux-kernel/linux/tools/perf$ searchheader file asm/posix_types.h
asm/posix_types.h in /home/hzh/linux-kernel/linux/arch/arm/include/uapi
asm/posix_types.h in /home/hzh/android/ndk/build/platforms/android-3/arch-arm/usr/include

/home/hzh/android/ndk/build/platforms/android-3/arch-arm/usr/include/sys/types.h中只引用了linux/posix_types.h,所以出错。
加上#include <asm/posix_types.h>,因为先搜到/home/hzh/linux-kernel/linux/arch/arm/include/uapi/asm/posix_types.h,依旧出错。
解决方法很纠结,一般采取"全路径"或者在用"asm/posix_types.h",然后在CFLAGS中使用-iquote选项规定引号括起的头文件,先去搜索指定目录。这些都只能是临时解决方法。

如果有谁编译过3.8.0rc下的perf android版,能否留言给个指教?