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

工具环境

操作系统:ubuntu 22.04 桌面版 64位(可以装在VMWare等虚拟机)
编译工具:i386编译工具系列(32位)、AMBuild编译工具
开发工具:amxmodx、metamod、hlsdk、mysql等sdk

操作系统安装和配置

首先我这里用的是VMWare虚拟机,使用NAT方式上网,安装的是ubuntu 22.04桌面版,系统安装完成后,关闭防火墙(默认应该是关闭的),以及安装开启openssh服务,当然还有VM TOOLS(在VMWare中会自动安装)。

1
2
3
4
# 开启openssh远程连接服务
sudo apt install openssh-server -y
sudo systemctl enable --now ssh
sudo systemctl status ssh

编译工具安装和配置

安装32位编译工具(cs1.6是使用32位编译的,64位的会出错的),安装包括gcc、g++、clang、nasm等等。

1
2
3
4
5
6
7
sudo apt-get install gcc g++ clang nasm
# 其中,如果有无法安装的工具,如ia32-libs可能在ubuntu22.04中无法安装,那么自行网上搜索其他的替代。
sudo apt-get install ia32-libs
sudo apt-get install lib32z1 lib32z1-dev
sudo apt-get install libc6-dev-i386 libc6-i386
sudo apt-get install lib32stdc++-7-dev linux-libc-dev:i386
sudo apt-get install gcc-multilib g++-multilib

开发工具安装和配置

首先在工作目录下创建名为sdk的文件夹,即/home/wudics/sdk,其中wudics是你ubuntu的用户名。

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
# 如果是不是使用“ubuntu 22.04 桌面版 64位”的话,你需要自行安装python3,并使python链接到python3
# python2是无法正常安装的
sudo pip install ./ambuild
# 也可以进入ambuild文件夹里边通过如下命令安装,效果是一样的
cd ambuild
sudo python setup.py install # 记得加上sudo,否则可能安装出错

# 下载mysql-5.5,我这里使用的是mysql-5.5.60-linux-glibc2.12-i686.tar.gz这个包,32位的Linux版本
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.5.60-linux-glibc2.12-i686.tar.gz
tar -zxvf mysql-5.5.60-linux-glibc2.12-i686.tar.gz
# 将名称修改成mysql-5.5
mv mysql-5.5.60-linux-glibc2.12-i686 mysql-5.5

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

1
2
3
4
5
/home/wudics/sdk/ambuild
/home/wudics/sdk/metamod-hl1
/home/wudics/sdk/hlsdk
/home/wudics/sdk/amxmodx
/home/wudics/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进行编译。

1
2
3
4
5
6
7
8
9
10
11
12
# 进入sdk/amxmodx文件夹
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去掉了。

使用编辑器打开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',
]

然后,重新cd进入amxmodx/build目录,执行ambuild命令重新编译。

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

1
2
cd build
ambuild

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

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

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

开发自己的模块

创建模块项目

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

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

1
2
3
#wudics@wudics-virtual-machine:~/sdk/amxmodx/modules$

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

修改模块名称

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

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

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

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

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

添加模块编译代码

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

用编辑器打开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

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

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

参考文献

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教学