edit_source——编译MudOS的前奏

http://blog.csdn.net/lijingze2003/article/details/83608


这个程序将自动生成一些mudos编译时所需要的文件。下面这个表描述了edit_source在使用不同参数的情况下,输入文件(待处理的文件)和输出文件(处理后的结果)分别是什么:

命令参数

输入文件

输出文件

-configure

 

configure.h

-options

options.h

local_options

options_incl.h

option_def.c

–malloc

sysmalloc.c

smalloc.c

bsdmalloc.c

wrappedmalloc.c

debugmalloc.c

malloc.c

mallocwrapper.c

-process grammar.y.pre

grammar.y.pre

grammar.y

–build_spec “gcc –E”

func_spec.c

packages中的某些文件

func_spec.cpp

-build_efuns

func_spec.cpp

efunctions.h

opc.h

opcodes.h

efun_protos.h

efun_defs.c

 

实际上,有些命令并不能单独使用,因为 –options的结果将保存在内存中——一个hash talbe,后面的处理都将根据这个hash table中存储的预编译指令来决定处理方式。正确的命令格式应该是:

l         edit_source –configure

这条命令将根据所处的编译环境产生configure.h:

如果是win32环境,直接输出一些默认的预编译宏,比如#define INCL_STDLIB_H,这个宏在std_incl.h中使用:

#ifdef INCL_STDLIB_H

#  include

#endif

 

如果是其他环境,见makefile脚本,首先检查是否存在configure.h和configuration这两个文件,存在则结束程序,如果不存在,则由于*nix之间的差异,需要做一个测试来判断该系统是否存在某个lib,比如判断系统是否存在stdlib.h:先生成一个文件comptest.c,这个文件的内容如下:

#include "configure.h"

#include "std_incl.h"

#include "file_incl.h"

#include "stdlib.h"

通过调用system函数编译这个文件,根据system函数的返回值来判断出系统是否存在stdlib.h文件。如果存在,就往configure.h里写入#define INCL_STDLIB_H。

这段代码同样展示了如何在win32环境下如何判断某个文件是否存在。它的做法如下:

intcompile(char *command) {

    FILE *tf = fopen("trash_me.bat","wt+");

      

    fprintf(tf,"%s/n%s",

              command,

              "if errorlevel == 1 goto error/n"

              "del trash_me.err >nul/n"

              "goto ok/n"

              ":error/n"

              "echo ERROR > trash_me.err/n"

              ":ok/n");

       fclose(tf);

      

       if (!system("trash_me.bat")) return 1;

       if (_access("trash_me.err",0) ) return 1;

       return 0;

}

l         edit_source -process grammar.y.pre

这条指令将解析grammar.y.pre文件,生成MudOS的文法文件grammar.y,规则(这些规则可以使用vc小工具WinDiff对比两个文件获得)如下:

遇到%define DEFINES 则将DEFINES加入到hash table中;

遇到%ifdef DEFINES、%else、%endif,则在hash table中查找这个DEFINES,然后执行类似c语言的条件编译的动作选择输出某些内容;

遇到%line则输出所在grammar.y.pre的行号,比如”#line 3576 grammar.y.pre”;

遇到为某个匹配式定义的action函数“{”时输出所在行号,比如

argument_list:

       new_arg

           {

#line 818 "grammar.y.pre"

遇到其它内容则直接输出。

edit_source –process在同样也可以用来生成makefile文件,在MudOS源码内有些后缀名为.pre的文件,这些文件都可以用edit_source来解析。

l         edit_source -options -malloc -build_func_spec "gcc -E" -build_efuns

-options         将options.h中的宏定义加入到链表散列中。

-mallo           检查有关内存分配的宏定义,决定编译mudos时所使用的函数库(详见《MudOS中的内存管理》),比如定义了SYSMALLOC.C和DEBUGMALLOC这两个宏,程序将把sysmalloc.c和debugmalloc.c中的内容分别拷贝到malloc.c和mallocwrapper.c中,在makefile中加入这两个文件并对其编译——这一点在*nix下编译时可以看到,不过在release版本中一般不会用到包含调试信息的内存管理库,因此,通常并不需要加入mallocwrapper.c。

-build_func_spec "gcc -E"          将用 “gcc –E func_spec.c > func_spec.cpp”指令生成func_spec.cpp文件,”gcc –E”将指示gcc对func_spec.c进行预处理,输出源代码列表到func_spec.cpp中,然后检查与package有关的宏定义,如果需要包含package中的某个函数包,则用”gcc –E *.c >> func_spec.cpp”指令追加这些函数包的源代码列表到func_spec.cpp中。在vc下,可以用”cl /E”指令。

      -build_efuns

对func_spec.cpp文件进行解析,它的解析规则定义于make_func.y中。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值