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中。