现在的位置: 首页 > 综合 > 正文

ReactOS 分析二

2013年01月20日 ⁄ 综合 ⁄ 共 6794字 ⁄ 字号 评论关闭

Makefile中的-include XXX表示如果XXXX文件不存在,不会报错。
Makefile会间接包含\tools\rbuild\rbuild.mak。
这里简单分析工具rbuild
在reactos的根目中,执行
make rbuild_clean
make rbuild

rbuild会根据ReactOS-i386.rbuild生成makefile.auto文件,然后makefile.auto会被Makefile包含
每个目录都有.build文件,每个.rbuild文件都会递归包含其他.rbuild文件,directory包含directory或者module,最后一层是module,它代表makefile.auto中要生成的项目。
    <directory name="adns">
        <xi:include href="adns/adns.rbuild" />
    </directory>
<module name="zlib" type="staticlibrary"> //makefile.auto中必然会有zlib
 <xi:include href="zlib_common.rbuild" />
</module>

 

其中tools\rbuild\backend\mingw\rules.mak,定义了几个函数

#(module, source, dependencies, cflags, output)
RBUILD_GCC
RBUILD_GPP
RBUILD_GAS

#(module, source, dependencies, cflags)
RBUILD_GCC_RULE
RBUILD_GPP_RULE
RBUILD_GAS_RULE

makefile.auto在生成时,会利用RBUILD_GCC_RULE等函数定义makfile规则
例如在makefile.auto里会有
$(eval $(call RBUILD_GCC_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\archmach.c, boot\freeldr\freeldr\freeldr_arch.rbuild,))
这句话会创建makefile规则,freeldr_arch依赖于archmach.c,并按照freeldr_arch.rbuild指定,生成output文件

又例如,

C:\react_os>make freeldr_arch
[CC]       boot\freeldr\freeldr\arch\i386\archmach.c
[CC]       boot\freeldr\freeldr\arch\i386\hardware.c
[CC]       boot\freeldr\freeldr\arch\i386\hwacpi.c
[CC]       boot\freeldr\freeldr\arch\i386\hwapm.c
[CC]       boot\freeldr\freeldr\arch\i386\hwpci.c
[CC]       boot\freeldr\freeldr\arch\i386\i386disk.c
[CC]       boot\freeldr\freeldr\arch\i386\i386rtl.c
[CC]       boot\freeldr\freeldr\arch\i386\i386vid.c
[CC]       boot\freeldr\freeldr\arch\i386\loader.c
[CC]       boot\freeldr\freeldr\arch\i386\machpc.c
[CC]       boot\freeldr\freeldr\arch\i386\pccons.c
[CC]       boot\freeldr\freeldr\arch\i386\pcdisk.c
[CC]       boot\freeldr\freeldr\arch\i386\pcmem.c
[CC]       boot\freeldr\freeldr\arch\i386\pcrtc.c
[CC]       boot\freeldr\freeldr\arch\i386\pcvideo.c
[CC]       boot\freeldr\freeldr\arch\i386\machxbox.c
[CC]       boot\freeldr\freeldr\arch\i386\xboxcons.c
[CC]       boot\freeldr\freeldr\arch\i386\xboxdisk.c
[CC]       boot\freeldr\freeldr\arch\i386\xboxfont.c
[CC]       boot\freeldr\freeldr\arch\i386\xboxhw.c
[CC]       boot\freeldr\freeldr\arch\i386\xboxi2c.c
[CC]       boot\freeldr\freeldr\arch\i386\xboxmem.c
[CC]       boot\freeldr\freeldr\arch\i386\xboxrtc.c
[CC]       boot\freeldr\freeldr\arch\i386\xboxvideo.c
[AS]       boot\freeldr\freeldr\arch\i386\_alloca.S

会对应makefile.auto文件中的

$(eval $(call RBUILD_GCC_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\archmach.c, boot\freeldr\freeldr\freeldr_arch.rbuild,))
$(eval $(call RBUILD_GCC_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\hardware.c, boot\freeldr\freeldr\freeldr_arch.rbuild,))
$(eval $(call RBUILD_GCC_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\hwacpi.c, boot\freeldr\freeldr\freeldr_arch.rbuild,))
$(eval $(call RBUILD_GCC_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\hwapm.c, boot\freeldr\freeldr\freeldr_arch.rbuild,))
$(eval $(call RBUILD_GCC_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\hwpci.c, boot\freeldr\freeldr\freeldr_arch.rbuild,))
$(eval $(call RBUILD_GCC_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\i386disk.c, boot\freeldr\freeldr\freeldr_arch.rbuild,))
$(eval $(call RBUILD_GCC_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\i386rtl.c, boot\freeldr\freeldr\freeldr_arch.rbuild,))
$(eval $(call RBUILD_GCC_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\i386vid.c, boot\freeldr\freeldr\freeldr_arch.rbuild,))
$(eval $(call RBUILD_GCC_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\loader.c, boot\freeldr\freeldr\freeldr_arch.rbuild,))
$(eval $(call RBUILD_GCC_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\machpc.c, boot\freeldr\freeldr\freeldr_arch.rbuild,))
$(eval $(call RBUILD_GCC_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\pccons.c, boot\freeldr\freeldr\freeldr_arch.rbuild,))
$(eval $(call RBUILD_GCC_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\pcdisk.c, boot\freeldr\freeldr\freeldr_arch.rbuild,))
$(eval $(call RBUILD_GCC_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\pcmem.c, boot\freeldr\freeldr\freeldr_arch.rbuild,))
$(eval $(call RBUILD_GCC_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\pcrtc.c, boot\freeldr\freeldr\freeldr_arch.rbuild,))
$(eval $(call RBUILD_GCC_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\pcvideo.c, boot\freeldr\freeldr\freeldr_arch.rbuild,))
$(eval $(call RBUILD_GCC_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\machxbox.c, boot\freeldr\freeldr\freeldr_arch.rbuild,))
$(eval $(call RBUILD_GCC_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\xboxcons.c, boot\freeldr\freeldr\freeldr_arch.rbuild,))
$(eval $(call RBUILD_GCC_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\xboxdisk.c, boot\freeldr\freeldr\freeldr_arch.rbuild,))
$(eval $(call RBUILD_GCC_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\xboxfont.c, boot\freeldr\freeldr\freeldr_arch.rbuild,))
$(eval $(call RBUILD_GCC_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\xboxhw.c, boot\freeldr\freeldr\freeldr_arch.rbuild,))
$(eval $(call RBUILD_GCC_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\xboxi2c.c, boot\freeldr\freeldr\freeldr_arch.rbuild,))
$(eval $(call RBUILD_GCC_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\xboxmem.c, boot\freeldr\freeldr\freeldr_arch.rbuild,))
$(eval $(call RBUILD_GCC_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\xboxrtc.c, boot\freeldr\freeldr\freeldr_arch.rbuild,))
$(eval $(call RBUILD_GCC_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\xboxvideo.c, boot\freeldr\freeldr\freeldr_arch.rbuild,))
$(eval $(call RBUILD_GAS_RULE,freeldr_arch,boot\freeldr\freeldr\arch\i386\_alloca.S, boot\freeldr\freeldr\freeldr_arch.rbuild,))

而freeldr_arch.rbuild中有会含有。

<directory name="i386">
    <if property="ARCH" value="i386">
        <file>_alloca.S</file>
        <file>archmach.c</file>
        <file>hardware.c</file>
        <file>hwacpi.c</file>
        <file>hwapm.c</file>
        <file>hwpci.c</file>
        <file>i386disk.c</file>
        <file>i386rtl.c</file>
        <file>i386vid.c</file>
        <file>loader.c</file>
        <file>machpc.c</file>
        <file>pccons.c</file>
        <file>pcdisk.c</file>
        <file>pcmem.c</file>
        <file>pcrtc.c</file>
        <file>pcvideo.c</file>
        <file>machxbox.c</file>
        <file>xboxcons.c</file>
        <file>xboxdisk.c</file>
        <file>xboxfont.c</file>
        <file>xboxhw.c</file>
        <file>xboxi2c.c</file>
        <file>xboxmem.c</file>
        <file>xboxrtc.c</file>
        <file>xboxvideo.c</file>
    </if>
</directory>

因此可以看出,首先编写.rbuild文件,它会包含各级目录中的.rbuild文件,然后用rbuild生成根目录中的makefile.auto。
makefile.auto利用一些函数创建最终的makefile规则。

另外,在.rbuild文件中模块moudle可以嵌套,如

<module name="freeldr" type="bootloader">
    <bootstrap installbase="loader" />
    <library>freeldr_startup</library>
    <library>freeldr_base64k</library>
    <library>freeldr_base</library>
    <library>freeldr_arch</library>
    <library>freeldr_main</library>
    <library>rossym</library>
    <library>cmlib</library>
    <library>rtl</library>
    <library>libcntpr</library>
    <linkerflag>-static</linkerflag>
    <linkerflag>-lgcc</linkerflag>
</module>

抱歉!评论已关闭.