首页 > 代码库 > Vs2012在Linux开发中的应用(8): 编译Linux内核

Vs2012在Linux开发中的应用(8): 编译Linux内核

快乐虾

http://blog.csdn.net/lights_joy/

欢迎转载,但请保留作者信息


在有了UBOOT的编译基础之后,编译Linux内核就简单多了,所不同的只有两个地方,一个是错误信息的转换,另一个是内核需要进行参数配置。

1.1    错误信息转换

UBOOT的错误信息中,文件名是不带路径的,而内核的错误信息中,文件名是带相对路径的,因此我们对转换脚本略做修改:

 

#user code begin   

classCUBootMake:

   error=False

   defBuild(self,chan):

        self.error=False

        exec_command(chan,

                    "cd/work/projects/hi3516dvs_2v/linux/v1/linux-2.6.35 && "

                    "cplinux.config .config && "

                    "makeARCH=arm CROSS_COMPILE=arm-hisiv100-linux-uclibcgnueabi- uImage &&"

                     "cparch/arm/boot/uImage /var/lib/tftpboot/\n")

        returnnotself.error;

   defRebuild(self,chan):

        self.error=False

        exec_command(chan,

                    "cd/work/projects/hi3516dvs_2v/linux/v1/linux-2.6.35 && "

                    "makeARCH=arm CROSS_COMPILE=arm-hisiv100-linux-uclibcgnueabi- clean &&"

                    "cplinux.config .config && "

                    "makeARCH=arm CROSS_COMPILE=arm-hisiv100-linux-uclibcgnueabi- uImage &&"

                     "cparch/arm/boot/uImage /var/lib/tftpboot/\n")

        returnnotself.error;

   defClean(self,chan):

        self.error=False

        exec_command(chan,

                    "cd/work/projects/hi3516dvs_2v/linux/v1/linux-2.6.35 && "

                    "makeARCH=arm CROSS_COMPILE=arm-hisiv100-linux-uclibcgnueabi- clean &&"

                    "cparch/arm/boot/uImage /var/lib/tftpboot/\n")

        returnnotself.error;

 

   root_path=‘z:\\projects\\hi3516dvs_2v\\linux\\v1\\linux-2.6.35\\‘

   defConvert(self,ln):

        ifre.match(".*:[0-9]+: error:",ln):

            lst=ln.split(‘:‘)

            file=lst[0]

            file=self.root_path+file

            file=file.replace("/","\\")

            ln=file+"("+lst[1]+"): error C2004: "+lst[3]

            self.error=True

        elifre.match(".*:[0-9]+: warning:",ln):

            lst=ln.split(‘:‘)

            file=lst[0]

            file=self.root_path+file

            file=file.replace("/","\\")

            ln=file+"("+lst[1]+"): warning C2005: "+lst[3]

        returnln

 

   defGetHostPattern(self):

        return".*\["+HOST_USER+"@localhost .*\]\$.*"

 

make=CUBootMake()

#user code end

 

欣赏一下VS编译的效果:

轻松搞定。

和UBOOT一样,最好将内核的include目录复制一份到WINDOWS本地目录以加快VS代码分析的速度。

1.2    内核配置

LINUX的内核配置通常会使用make menuconfig来进行配置,实际上当执行这个操作时会执行内核目录下的scripts/kconfig/mconf这个程序,而这个应用程序的代码结构也很简单,scripts/kconfig下的代码完成Kconfig文件的分析,而scripts/kconfig/lxdialog目录下的代码完成菜单的显示,并接受用户的输入。

因此我们原样使用kconfig的分析代码,但用自己的UI做展示并接受用户输入,下面是一个用MFC开发的小应用:

它同样接受空格,’m’,‘Y’,‘N’这几个键,也支持鼠标操作!

让人不爽的是它读取文件的速度比make menuconfig要慢了一点,因为它是通过LINUX的SAMBA文件共享去读取文件的,而内核的配置文件又比较多,不过这点速度的牺牲还是值得的。

此外存在的另一个问题是在windows下无法写入.config文件,因此我们的配置改用linux.config文件,在编译前必须将linux.config文件复制为.config,这也是上一节中Build操作做的第一件事!!!

1.3    在VS工程中调用KernelConfig

为了方便这个程序的调用,我们在VS的右键菜单中插入一个叫EmbedLinux属性的选项:

在执行这个操作的时候,去读取我们之前配置好的内核目录等信息并根据这些参数调用KernelConfig.exe就可以了!

 


Vs2012在Linux开发中的应用(8): 编译Linux内核