make menuconfig 中选定项 (CONFIG_XXX) 的作用

       在上次开发 drvier 的时候,我参考了一个 kernel 中原有的类似 drvier code, 把 driver 目录下的整个这个目录(暂时取名叫AAA) cp 为 xxx_AAA (前面是公司名称,公司规定的). 然后, 对 xxx_AAA 里面的 Kconfig 和 Makefile 只是简单的修改了一下,集中精力开发和调试我自己新增和修改的 .h .c 文件.

       今天,闲来没事,就开始整理我的这个 driver, 然后顺便把 xxx_AAA 里面的用来生成 linux-2.6.28 根目录下的 .config 中的 类似 CONFIG_BBB_CCC 的 名称也修改了一下,然后重新编译 .ko, 结果在测试的过程中,发现跟以前的测试情况不一样,为什么呢?我可是没有修改过 .h .c code哦.

       然后,我就开始找原因,首先我先看导致执行不一样的 .h .c code, 虽然我没改动这些, 但是, 程序执行起来也只是执行的 .h .c 文件, 所以先找这个是个入口点. 我发现有一个 .c 文件中可能导致这个问题的一个地方使用了 #ifdef CONFIG_DDD   #endif. 然后,我就开始看linux-2.6.28/ 下 .config 文件, 看到以前 AAA 目录下的 Kconfig 生成的 CONFIG_DDD, 而我修了我 xxx_AAA 目录下 里面的用来生成 linux-2.6.28 根目录下的 .config 中的 类似 CONFIG_BBB_CCC 的 名称, 生成了 CONFIG_XXX_DDD,哈哈,貌似原因找到了,同样选定 make menuconfig 中的选项,对应的不通的 Kconfig , 自然就生成了不同的 CONFIG_DDD / CONFIG_XXX_DDD, 而我的 .h .c 文件中没有修改, 还是以前的 #ifdef CONFIG_DDD   #endif. 这样自然后就不会把 条件编译内的 code 编译进 .ko, 所以执行的结果会不一样了.找到问题了产生的原因了,自然很容易解决,像这种问题,只需要简单地将 .h .c 文件中 #ifdef CONFIG_DDD 改为 #ifdef CONFIG_XXX_DDD 就 OK 了.

       总结一下, kernel 中 make menconfig 中选定的用来生成 .config 中的 CONFIG_XXXX_XXXX 项,主要有以下3个作用:

 <1>对它的父目录中的 Makefile 有作用, 使能把新增的目录中的code编译进内核.

       如:上例中的对 linux-2.6.28/drivers/Makefile

            obj-$(CONFIG_xxx_AAA)          += xxx_AAA/

<2>对自己本目录下的 .h .c 文件有作用,确定哪些 .h .c 文件会编译进内核.

<3>对自己本目录下的确定要编译进内核的文件中的部分内容也有作用, 可以有选择的把这些文件中的部分内容编译进内核.

       如: 本例.

 

 

你可能感兴趣的:(测试,makefile)