本篇文章将介绍如何使用AMBuild工具来编译我们的module源码,生成Windows版本的*_amxx.dll模块文件。

工具环境

操作系统:windows 10 64位(可以装在VMWare等虚拟机)
编译工具:Visual Studio 2017、AMBuild编译工具
开发工具:amxmodx、metamod、hlsdk、mysql等sdk

操作系统安装和配置

操作系统我们用的是64位的win10,并且安装git for windows工具。

编译工具安装和配置

安装vs2017

安装Visual Studio 2017,是为了使用它的编译环境和cl.exe编译工具(AMBuild在windows平台下会自动检测和调用),另外,还需要使用它的x86 Native Tools Command Prompt for VS 2017,一个含有windows平台编译x86程序时,所使用的众多的环境变量(通过这个shell来执行ambuild命令,可以省去手动配置环境变量的步骤,减少出错的概率)

我们可以在“开始”菜单中的“Visual Studio 2017”中找到x86 Native Tools Command Prompt for VS 2017

或者你也可以在桌面新建一个快捷,目标指向下边的路径。

1
%comspec% /k "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars32.bat"

双击打开运行结果如下:

有提示:[vcvarsall.bat] Environment initialized for: 'x86'

cmd命令行下,切换盘符方法:输入D:,然后回车即可切换到D盘

安装mingw64

首先,我们先下载mingw64,打开网站后,我们选择MinGW-W64 GCC-8.1.0下的x86_64-win32-seh这个版本进行下载,下载后得到x86_64-8.1.0-release-win32-seh-rt_v6-rev0.7z这个压缩包,我们将它解压到D盘根目录下。

然后,我们给D:\mingw64\bin这个路径添加到环境变量path中,这样我们在cmd中直接输入gcc --version就可以看到gcc的版本信息了。

安装nasm

紧接着,我们下载nasm,选择nasm-2.15.05-win64.zip这个版本进行下载,下载完成后,我们把nasm.exe文件放到D:\mingw64\bin即可,这样ambuild就能够正确找到它了。

安装python3

我们的ambuild是使用python编写的,所以我们还需要安装python3,
选择Windows installer (64-bit)安装包下载安装即可。

安装完成后可以通过cmd命令python --version看到版本是3.11.X的版本信息。

开发工具安装和配置

首先在D创建名为sdk的文件夹,即D:\sdk。

然后在sdk文件夹中,通过git命令clone以下sdk开发包到本地。

另外,如果没有git命令,请先自行安装git工具。

1
2
3
4
5
6
7
8
9
10
11
12
13
git clone https://github.com/wudics/ambuild.git
git clone https://github.com/wudics/metamod-hl1.git
git clone https://github.com/wudics/hlsdk.git
git clone --recursive https://github.com/wudics/amxmodx.git

# recursive 包含子项目,如果不能正常安装,可以自行下载到相应的目录

# 安装ambuild
pip install ./ambuild

# 或者,也可以进入ambuild文件夹里边通过如下命令安装,效果是一样的
cd ambuild
python setup.py install

接着在mysql官网下载MySQL5.5版本的win32开发包,依次选择“5.5.60”版本、“Microsoft Windows”,然后选择Windows (x86, 32-bit), ZIP Archive这个x86架构32位版本的下载。你也可以直接点击这里直接下载。

下载后得到mysql-5.5.60-win32.zip,解压出来放到D:\sdk目录下,并将目录名称修改为mysql-5.5。

此时,目录结构应该是这样的

1
2
3
4
5
D:\sdk\ambuild
D:\sdk\metamod-hl1
D:\sdk\hlsdk
D:\sdk\amxmodx
D:\sdk\mysql-5.5

注意,文件夹名称不能修改成其他的,否则可能ambuild时会无法识别出正确的路径

版本问题,如果版本与此时不一致的话,可能会影响兼容性,导致后续的操作无法正确完成。
ambuild此时版本是2.2版本(amxmodx此时使用的是2.0版本,不过无须担心,是可以兼容的)。
metamod-hl1已经很久没有更新了,无需考虑版本问题。
hlsdk也是很久没有更新了,也不用担心版本问题。
amxmodx此时的版本是1.8.x,它里边还有个子项目amtl,位于amxmodx/public/amtl。
如果编译时因为amtl版本问题导致出错的话,可以在我的fork仓库中找到此时版本的amtl替换即可。
地址是https://github.com/wudics/amtl。

初始化编译

初始化编译,意思是我们需要先对amxmodx进行编译。

成功对amxmodx进行编译之后才对我们自己开发的module进行编译。

此时,我们就需要用到x86 Native Tools Command Prompt for VS 2017这个工具了,我们以下所输入的命令都是需要通过这个工具来进行执行的,否则可能会因为找不到环境变量导致编译失败。我们这里把它简称为vshell。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 从C盘切换至D盘,进入sdk/amxmodx文件夹
D:
cd sdk
cd amxmodx

# 创建build文件夹(用于存放我们编译后的可执行程序)
mkdir build

# 进入build文件夹配置ambuild编译工程
cd build
python ../configure.py

# 执行ambuild命令开始编译
ambuild

此时,可能会出现cc1: all warnings being treated as errors的错误提示,其实是gcc编译器加了-Werror参数导致的,意思就是所有的warning都会进行error报错。为了能够正常编译,一是修改源码,二是去掉-Werror参数。

我们这里为了方便,就先把-Werror去掉了。

使用编辑器打开D:\sdk\amxmodx\AMBuildScript文件,找到configure_gcc中的-Werror并把它注释起来即可,修改后如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
  def configure_gcc(self, cxx):
cxx.cflags += [
'-pipe',
'-fno-strict-aliasing',
'-Wall',
# '-Werror',
'-Wno-uninitialized',
'-Wno-unused',
'-Wno-switch',
'-Wno-format',
'-Wno-format-security',
'-m32',
]

然后,使用vshell重新进入D:\sdk\amxmodx\build目录,执行ambuild命令重新编译。

注意,此时已经无需再执行python ../configure.py命令配置,可直接ambuild编译。

1
2
cd build
ambuild

当提示Build succeeded.后,表示整个工程都编译成功了。

在D:\sdk\amxmodx\modules目录下,我们可以看到很多编译好的module模块,这是系统自带的一些有用的模块。

之后,我们编译出来的module也会在这个目录下生成。

开发自己的模块

创建模块项目

首先,我们也需要按照amxmodx的目录结构,来构建我们的module模块项目。

先进入到D:\sdk\amxmodx\modules目录下,在这里创建我们的module模块项目(我这里在github仓库提供了一个template空项目mymodule2,你可以直接用来编译,以后你也可以基于这个模板来开发自己的module模块)。

1
2
3
# 当前目录 D:\sdk\amxmodx\modules

git clone https://github.com/wudics/mymodule2.git czfun

修改模块名称

其中,czfun是我们模块项目的文件夹名称,接下来我们也要用czfun来命名我们的模块。

用编辑器打开D:\sdk\amxmodx\modules\czfun\AMBuilder文件,找到下面的代码:

1
binary = AMXX.MetaModule(builder, 'mymodule2')

把mymodule2修改成czfun,这里修改的是编译生成后的模块名称。

1
binary = AMXX.MetaModule(builder, 'czfun')

添加模块编译代码

这里的意思就是把我们创建的czfun模块,添加到ambuild的编译链中,是ambuild能够找到我们的模块并进行编译。

用编辑器打开D:\sdk\amxmodx\AMBuildScript文件,在最底下,找到如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
builder.RunBuildScripts(
[
'amxmodx/AMBuilder',
'compiler/amxxpc/AMBuilder',
'compiler/libpc300/AMBuilder',
'modules/cstrike/cstrike/AMBuilder',
...
'modules/tfcx/AMBuilder',
'modules/ts/tsfun/AMBuilder',
'modules/ts/tsx/AMBuilder',
],
{ 'AMXX': AMXX }
)

然后,在其底部添加czfun模块编译子脚本的路径:'modules/czfun/AMBuilder',

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
builder.RunBuildScripts(
[
'amxmodx/AMBuilder',
'compiler/amxxpc/AMBuilder',
'compiler/libpc300/AMBuilder',
'modules/cstrike/cstrike/AMBuilder',
...
'modules/tfcx/AMBuilder',
'modules/ts/tsfun/AMBuilder',
'modules/ts/tsx/AMBuilder',
# 在这里添加
'modules/czfun/AMBuilder',
],
{ 'AMXX': AMXX }
)

开始编译模块

继续cd进入之前我们创建的build文件夹,执行ambuild命令即可。

1
2
cd build
ambuild

提示编译成功后,我们在D:\sdk\amxmodx\build\modules\czfun目录下,就可以看到我们编译的模块了。

在Windows编译模块,通常会加上特殊的后缀,即czfun_amxx.dll,就是我们的模块文件了。

参考文献

AMBuild WiKi & Tutorial
Building AMX Mod X with AMBuild
Building Sourcemod
AMBuild 2.2 API
AMBuild 2.1 API
AMBuild 2.0 API

手动编译Sourcemod(Linux)
博客园AMBuild教学