MUDOS编译完全手册
by 梁宇翀(Micro Liang)@天下创作室
2000-10-20
( micro_liang@hotmail.com, micro_liang@21cn.com )
MudOS版本:V22Pre11
通常来说MudOS有以下版本:
Alpha 给开发者测试的版本
Beta 给玩家测试的版本
Preview 预发布的版本
Release 发布的版本,即正式版
一、WINDOWS/VC++6·0
使用软件:VC++6·0,BISON
1、将源码解压,进入 v22p11/src 目录
2、将 windows 目录下所有 .mak 文件复制到上层目录
3、使用 VC 建立(File 中的 New)一个名为 MudOS 的 Win32 Application
新 Workspace。选择 Project 中的 Insert Project into Workspace,
加入项目 edit_source.mak。删除 source file 中的 local_options、
make_func.tab.c 两个文件,在步骤4之后加入文件 make_func.c。
4、运行 clean.bat,生成文件 make_func.c。内容如下:
del comptest.*
del configure.h
del efunctions.h
del efun_defs.c
del efun_protos.h
del func_spec.cpp
del grammar_tab.c
del grammar_tab.h
del grammar.c
del grammar.y
del make_func.c
del malloc.c
del mallocwrapper.c
del opc.h
del opcodes.h
del option_defs.c
del trash_me.bat
bison make_func.y
ren malloc.h malloc.h~
5、新建一个文件 cc.h,内容如下:
/* this file automatically generated by the Makefile */
#define COMPILER "cl"
#define OPTIMIZE "-G4"
#define CFLAGS "-DWIN32 -D_ALL_SOURCE -G4"
#define OBJDIR "obj"
5、修改 edit_source.c,把
fprintf(yyout, "#define UINT32 unsigned long\n");
替换为:
{
#ifndef WIN32
fprintf(yyout, "#define UINT32 unsigned long\n");
#else
;
#endif
}
6、编译 edit_source 项目,生成可执行文件 .\debug\edit_source.exe。
7、运行 grammar.bat,生成文件 grammar.c。这个文件内容如下:
ren malloc.h~ malloc.h
.\debug\edit_source -configure
.\debug\edit_source -options -process grammar.y.pre -malloc -build_func_spec "cs
bison grammar.y
8、选择 Project 中的 Insert Project into Workspace,加入项目 mudos.mak。
选择 Project 中的 Settings,在 C/C++ 的 Preprocessor definitions 中
删除 DEBUG,增加 MSDOS 参数。
删除 mudos project 之 source file 中的 grammar_tab.c,增加 grammar.c
删除 malloc.c, parser.c,增加 package/uids.c,package/mudlib_stats.c
将 src 中文件 grammar_tab.h 改为 grammar.h(因为 windows 的 bison
不能产生 grammar.h,所以建议从 UNIX 上取一份版本相同的 grammar_tab.h)
修改 lex.c 将 #include "grammar.tab.h" 改为 #include "grammar.h"
9、修改 backend.c 中的函数 call_heart_beat():
删除以下:
#ifdef WIN32
static long Win32Thread = -1;
#endif
删除以下:
if (Win32Thread == -1) Win32Thread = _beginthread(alarm_loop, 256, 0);
10、修改 crc32.h 在 compute_crc32 函数之前加入:
typedef unsigned int UINT32;
修改 crc32.c 在前面增加:
#include "crc32.h"
11、修改 crypt.h 中的句子
char *custom_crypt( CONST char *key, CONST char *salt, byte *rawout);
为
char *custom_crypt( char *key, char *salt, byte *rawout);
(即删除所有的 CONST)
12、将 interface.h, efuns_main.c, compile_file.c, mudlib/interface.c
中所有名为 interface 的变量名都替换成 if_t_array。
13、编译 mudos 项目,生成可执行文件 .\release\mudos.exe。
下载http://www.21cntx.com/MudOS.zip
http://www.nease.net/~micro/MudOS.zip
二、FreeBSD
1、将源码解压,进入 v22p11/src 目录
2、将文件 system_libs 的内容改为:
-lcrypt -lm
3、运行文件:./build.MudOS 进行配置
4、运行命令:
make clean
rm -rf obj
ln -s . obj
5、运行编译命令:make,生成可执行文件 ./driver
三、RedHat
1、将源码解压,进入 v22p11/src 目录
2、将文件 system_libs 的内容改为:
-lcrypt -lm
3、将文件 file_incl.h 以下段落用 /* */ 注释
#ifdef INCL_SYS_DIRENT_H
# include
#endif
4、修改文件 GNUmakefile,将
$(DRIVER_BIN): packages/packages.a mudlib/mudlib.a $(OBJ)
-mv -f $(DRIVER_BIN) $(DRIVER_BIN).old
$(PROOF) $(CC) -lcrypt $(CFLAGS) $(OPTIMIZE) $(OBJ) -o $(DRIVER_BIN) pa`
第三行加多一个 -lcrypt
5、运行编译命令:gmake,生成可执行文件 ./driver
MUDOS 在WINDOWS下编译过程
2002-6-3
使用软件: vc5以上,bison
将源码解压,进入~v22pre11/src目录
将windows目录下的所有.bat和.mak文件copy到上层目录中
用vc新建一个MUDOS WORKSPACE,选择Insert Project into Workspace…,将src下的edit_source.mak文件加入到workspace中,删除”source
file”中的”local_options”文件,删除”make_func.tab.c”文件,执行step1.bat,得到make_func.c文件,把它加入到edit_source的project中
建立一个新文件,文件名为cc.h,文件内容如下:
#define COMPILER "cl"
#define OPTIMIZE "-G4"
#define CFLAGS "-DWIN32 -D_ALL_SOURCE -G4"
#define OBJDIR "obj"
在edit_source的project的setting项目里的”c/c++”->”preprocessor
definitions”里去掉”DEBUG”参数,在”custom build”的”command”里添加如下命令:
cd E:\work\v22.pre11/src
.\windebug\edit_source -configure
.\windebug\edit_source -options -process grammar.y.pre
-malloc -build_func_spec "cl /E " -build_efuns
“output”里添加”grammar.y”
编辑edit_source.c,把” fprintf(yyout, "#define
UINT32 unsigned long\n");”替换为:
{ //防止重复定义,WINDOWS把UINT32定义为unsigned int了
#ifndef WIN32
fprintf(yyout, "#define UINT32 unsigned long\n");
#else
;
#endif
}
编译edit_source,编译完成后会自动生成grammar.y文件
在dos下执行“bison grammar.y”,生成grammar.c
选择”project”->”insert project into workspace”,把Mudos.mak加入到mudos
workspace中。修改mudos project,将setting->link->”object/library
module”中的所有.lib文件删除,在”c/c++”->”preprocessor definites”中删除”DEBUG”,增加”MSDOS”参数。
修改backend.c,将static void call_heart_beat();替换成如下:
static void call_heart_beat()
{
object_t *ob;
heart_beat_t *curr_hb;
heart_beat_flag = 0;
#ifdef SIGALRM
signal(SIGALRM, sigalrm_handler);
#endif
#ifdef HAS_UALARM
ualarm(HEARTBEAT_INTERVAL, 0);
#else
# ifdef WIN32
# else
alarm(SYSV_HEARTBEAT_INTERVAL); /* defined in config.h
*/
# edif
#enndif
debug(256, ("."));
current_time = get_current_time();
current_interactive = 0;
if ((num_hb_to_do = num_hb_objs))
{
num_hb_calls++;
heart_beat_index = 0;
while (!heart_beat_flag)
{
ob = (curr_hb = &heart_beats[heart_beat_index])->ob;
DEBUG_CHECK(!(ob->flags & O_HEART_BEAT),
"Heartbeat not set in object on heartbeat list!");
DEBUG_CHECK(ob->flags & O_SWAPPED,
"Heartbeat in swapped object.\n");
/* is it time to do a heart beat ? */
curr_hb->heart_beat_ticks--;
if (ob->prog->heart_beat != -1)
{
if (curr_hb->heart_beat_ticks < 1)
{
curr_hb->heart_beat_ticks = curr_hb->time_to_heart_beat;
current_heart_beat = ob;
command_giver = ob;
#ifndef NO_SHADOWS
while (command_giver->shadowing)
command_giver = command_giver->shadowing;
#endif
#ifndef NO_ADD_ACTION
if (!(command_giver->flags & O_ENABLE_COMMANDS))
command_giver = 0;
#endif
#ifdef PACKAGE_MUDLIB_STATS
add_heart_beats(&ob->stats, 1);
#endif
eval_cost = max_cost;
/* this should be looked at ... */
call_function(ob->prog, ob->prog->heart_beat);
command_giver = 0;
current_object = 0;
}
}
if (++heart_beat_index == num_hb_to_do)
break;
}
if (heart_beat_index < num_hb_to_do)
perc_hb_probes = 100 * (float) heart_beat_index
/ num_hb_to_do;
else
perc_hb_probes = 100.0;
heart_beat_index = num_hb_to_do = 0;
}
current_prog = 0;
current_heart_beat = 0;
look_for_objects_to_swap();
call_out();
#ifdef PACKAGE_MUDLIB_STATS
mudlib_stats_decay();
#endif
} /* call_heart_beat() */
修改crc32.h,在compute_crc32函数之前加入
typedef unsigned int UINT32;
把interface.h,efuns_main.c,compile_file.c中所有名称为interface的变量名都替换为_interface,以避免和windows关键字冲突
去掉crypt.h中char *custom_crypt( CONST char *key, CONST
char *salt, byte *rawout);
的所有CONST设定,删掉mudos project里的grammar.tab.c文件,增加grammar.c,
修改lex.c,把grammar.tab.h改为grammar.h(因为WINDOWS的bison无法产生grammar.h,所以建议从UNIX上拿一份版本相同的.h回来用),删除project中的”mallocwrapper.c”、”parser.c”,把”package/uids.c”增加到project中。
最后编译mudos,大功告成!^_^
尊重作者 转载请注明出处52mud.com