获取源代码
推荐使用 git 。
git clone https://github.com/cloudwu/skynet.git
或者下载最新的 release 包1,自行解开。但下载的源代码包中并不包含 jemalloc2 ,请自行下载放在 3rd/jemalloc 目录下。
编译工具
skynet 的开发环境是 Ubuntu Linux 。但同时也应该能在其它 Linux 平台编译运行。它同时支持 MacOSX 及 FreeBSD ,没有经过严格测试、不保证没有问题。
skynet 所有代码以及引用的第三方库都可以被支持 C99 的编译器编译。所以你需要先安装 gcc 4.4及以上版本。(Clang 应该也没有问题)。它还需要 GNU Make 以运行 Makefile 脚本。
关于 jemalloc2 和 malloc hook
skynet 对 malloc api 做了 hook ,用来统计 skynet 内部服务分别占用了多少内存。这个 hook 是用实现 malloc 等同名 api 以重载 libc 对应 api 实现的。同时,为了内存管理的高效,默认链接了 jemalloc 。
而在 MacOSX 下,这种 hook 手段是不成立的。需要额外编写 memory zone ,这将引入更多复杂的问题,所以直接在编译时就关闭了 jemaloc 。如果你在 linux 下也不想使用 jemalloc 以及 skynet 自带的服务内存统计模块,那么可以参考 platform.mk 中针对 macosx 的写法关闭它们。
注意:编译 jemmaloc 需要先安装 autoconf 工具。
如果你是通过 git clone 得到的 skynet 的源代码,那么你应该已经安装了 git 。Makefile 里编写的规则会自动下载 jemalloc 的代码;如果你是直接下载的 skynet 源码包,就有可能无法自动工作。那么你可能需要手工把 jemalloc 下载到 3rd 目录下,或在 skynet 源码服务下运行 git init 将其初始化为一个 git 仓库,让 git submodule 可以正常工作。
编译
cd skynet
make linux
通常可以成功。
如果你不是 Linux 系统,那么可以在 make 后尝试 macosx 和 freebsd 两个选项。由于 freeBSD 默认的 make 不是 gnu make ,请用 gmake 。
通常,skynet 会作为一个框架在你的项目中使用,推荐你把 skynet 作为一个 submodule 引入。你可以在你的 Makefile 文件中调用 GNU Make 编译它。你可以把平台设置在 PLAT 这个环境变量中。
默认状态下,skynet 执行文件会被编译输出到 skynet 目录下。你很可能希望自定义输出位置,通过修改 SKYNET_BUILD_PATH
变量可以改变它。
关于 lua
skynet 自带了一份 Lua 5.2.3 的源代码。并在官方版本的基础上做了一点小修改。
这是因为,skynet 框架有可能启动大量的 lua 虚拟机。而大量的 Lua 虚拟机中运行的是相同的代码。skynet 带的修改版 Lua 实现会尽量共享相同的 Lua 函数原型以节约内存、提供初始化 Lua 虚拟机的速度。其副作用是,通过 loadfile luaL_loadfile
等加载过的 lua 文件,不会再次从文件系统加载(但你可以通过 code cache 接口重置)。
如果你不喜欢这个设计,也可以链接自己的 Lua 库。方法是改写 Makefile 中的 LUA_LIB
以及 LUA_INC
变量。
注:skynet 需要 Lua 5.2 版,不支持 Lua 5.1 以及 LuaJIT 。
如果你在编译 lua 的过程中遇到问题,请仔细阅读:http://www.lua.org/manual/5.2/readme.html
Windows
skynet 没有支持 Windows 平台的计划。但社区中有 Mr.j 同学成功移植到 Windows 下3。
如有这方面的需要,请自行联系 Community 。