第一个要装的游戏是speed-dreams,先去下载几个包:
代码: 全选
axel --user-agent="Mozilla/5.0" "http://jaist.dl.sourceforge.net/project/speed-dreams/2.0.0/speed-dreams-src-base-2.0.0-r4687.tar.xz"
axel --user-agent="Mozilla/5.0" "http://jaist.dl.sourceforge.net/project/speed-dreams/2.0.0/speed-dreams-src-hq-cars-and-tracks-2.0.0-r4687.tar.xz"
axel --user-agent="Mozilla/5.0" "http://jaist.dl.sourceforge.net/project/speed-dreams/2.0.0/speed-dreams-src-more-hq-cars-and-tracks-2.0.0-r4687.tar.xz"
axel --user-agent="Mozilla/5.0" "http://jaist.dl.sourceforge.net/project/speed-dreams/2.0.0/speed-dreams-src-partial-build-patch-2.0.0-r4687.tar.xz"
axel --user-agent="Mozilla/5.0" "http://jaist.dl.sourceforge.net/project/speed-dreams/2.0.0/speed-dreams-src-unmaintained-2.0.0-r4687.tar.xz"
axel --user-agent="Mozilla/5.0" "http://jaist.dl.sourceforge.net/project/speed-dreams/2.0.0/speed-dreams-src-wip-cars-and-tracks-2.0.0-r4687.tar.xz"
代码: 全选
mkdir speed-dreams
tar xf speed-dreams-src-base-2.0.0-r4687.tar.xz -C speed-dreams
tar xf speed-dreams-src-hq-cars-and-tracks-2.0.0-r4687.tar.xz -C speed-dreams
tar xf speed-dreams-src-more-hq-cars-and-tracks-2.0.0-r4687.tar.xz -C speed-dreams
tar xf speed-dreams-src-wip-cars-and-tracks-2.0.0-r4687.tar.xz -C speed-dreams
tar xf speed-dreams-src-unmaintained-2.0.0-r4687.tar.xz -C speed-dreams
代码: 全选
mkdir speed-dreams/build && cd speed-dreams/build
第一个错误是plib,跟着,我们需要去下个plib,蛋疼的人会想到去plib的sf项目主页下一个包来,先configure,然后make&&make install。当然,这不失为一个通用的办法,但是,那么多包,还要一个个主页打开,该弄到猴年马月啊?所以,在这里我推荐一个快捷的办法,直接到一些发行版的网站去下。ArchLinux的那边可以弄到很多新包,所以就选这发行版的包吧。
到这里搜索一下,不难得知speed-dreams依赖plib、openal和enet这些包,点击进去,然后「Download From Mirror」下载对应的库,解压包里面/usr目录的文件到某个目录里面,我这里选择的是/mnt/bin/lib。解压之后可以看到/mnt/bin/lib里面的目录结构。
代码: 全选
ls /mnt/bin/lib
include lib bin
代码: 全选
export CFLAGS="-O2 -pipe -march=corei7"
export CXXFLAGS="${CFLAGS}"
export PATH=$PATH:/mnt/bin/lib/bin
export LIBRARY_PATH=/mnt/bin/lib/lib
export LD_LIBRARY_PATH=/mnt/bin/lib/lib
export CPLUS_INCLUDE_PATH=/mnt/bin/lib/include
最后那几个plib的库的规律看到没?只是「.a」前面几个字符不同而已。CMAKE_BUILD_TYPE设置为Release
CMAKE_INSTALL_PREFIX设置为目标的安装目录,我这里设置为/mnt/bin/speed-dreams
ENET_INCLUDE_DIR设置为/mnt/bin/lib/include
ENET_LIBRARYE设置为/mnt/bin/lib/lib
OPENAL_INCLUDE_DIR设置为/mnt/bin/lib/include
OPENAL_LIBRARY设置为/mnt/bin/lib/lib
OPTION_DEBUG设置为OFF
PLIB_INCLUDE_DIR设置为/mnt/bin/lib/include
PLIB_JS_LIBRARY设置为/mnt/bin/lib/lib/libplibjs.a
PLIB_SG_LIBRARY设置为/mnt/bin/lib/lib/libplibsg.a
PLIB_SL_LIBRARY设置为/mnt/bin/lib/lib/libplibsl.a
PLIB_SSGAUX_LIBRARY设置为/mnt/bin/lib/lib/libplibssgaux.a
PLIB_SSG_LIBRARY设置为/mnt/bin/lib/lib/libplibssg.a
PLIB_UL_LIBRARY设置为/mnt/bin/lib/lib/libplibul.a
SD_BINDIR设置为bin
SD_DATADIR设置为data
设置完毕后,按一下[c],无误后再按一下[g],过程中的WARNING直接忽略即可。
退出ccmake后,可以看到当前目录已经生成了一个Makefile文件。接下来「make -j4」编译即可。不过,这里要说明的是,参数j后面最好是跟cpu的核心数,这个为什么,鉴于不在本文范围内,我就不解释了。
可能有人会比较喜欢命令行的cmake,当然,也可以使用「cmake .. -DCMAKE_INSTALL_PREFIX=/mnt/bin/speed-dreams」的方式,这不过是个人爱好罢了。
make一会后,会发现编译出错了,什么「../../modules/networking/libnetworking.so: undefined reference to `enet_packet_destroy'」之类的东西,根据经验,我们不难知道是链接库的时候出现问题了。
代码: 全选
strings /mnt/bin/lib/lib/libenet.so |grep enet_packet_destroy
再「ccmake ..」进去一次把CMAKE_EXE_LINKER_FLAGS设置为-lenet即可。
编译完毕之后,make install弄到目标文件夹吧。
安装之后,我们还是清理一下。include和share/man这些目录就删掉吧,毕竟我们只是玩游戏。
不过,毕竟这游戏的库还是不全的,所以,我们还需要把运行需要的一些库拷贝过去。
代码: 全选
export LD_LIBRARY_PATH=/mnt/bin/speed-dreams/libs
ldd /mnt/bin/speed-dreams/bin/speed-dreams-2 |grep not
libenet.so.2
我们不难知道还缺一个libenet.so.2
cp -H /mnt/bin/lib/lib/libenet.so.2 /mnt/bin/speed-dreams/libs/
[bash]
#!/bin/bash
export LD_LIBRARY_PATH=/mnt/bin/speed-dreams/libs
/mnt/bin/speed-dreams/bin/speed-dreams-2
[/bash]
第二个要装的游戏是0ad,目前在下载页面可以获取的最新版本的是alpha12,那边提供了tar.xz和tar.gz的压缩包,下哪个,随便你。
下载完毕之后,检查一下md5,无误后,我们把unix-build和unix-data两个包解压好。
至于文件的md5,我们可以在Arch的PKGBUILD里面查到。
开始编译之前,我们先进入源码目录,打个补丁。
[bash]
>>>cat boost-mt-fix.patch
--- build/premake/extern_libs4.lua.old 2013-02-01 20:25:44.164849297 +0800
+++ build/premake/extern_libs4.lua 2013-02-01 20:27:17.689878313 +0800
@@ -218,7 +218,7 @@
-- The following are not strictly link dependencies on all systems, but
-- are included for compatibility with different versions of Boost
android_names = { "boost_filesystem-gcc-mt", "boost_system-gcc-mt" },
- unix_names = { "boost_filesystem-mt", "boost_system-mt" },
+ unix_names = { "boost_filesystem", "boost_system" },
bsd_names = { "boost_filesystem", "boost_system" },
})
end,
@@ -232,7 +232,7 @@
link_settings = function()
add_default_links({
android_names = { "boost_signals-gcc-mt" },
- unix_names = { "boost_signals-mt" },
+ unix_names = { "boost_signals" },
bsd_names = { "boost_signals" },
})
end,
>>>patch -p0 <boost-mt-fix.patch
[/bash]
跟着,再去Arch那边下过来一些要用到的包,boost和wxgtk什么的在0ad的依赖那边都能看到,直接下过来即可。解压过去后,库里面的一些东西可能还需要修改一下。
导出上面的CPLUS_INCLUDE_PATH等一大堆变量后,进入源码的build/workspaces目录下面,运行./update-workspaces.sh -j4,等待准备完毕。/mnt/bin/lib/bin/wx-config重新链接为/mnt/bin/lib/lib/wx/config/gtk2-unicode-release-2.8
/mnt/bin/lib/include/wx-2.8/wx链接到/mnt/bin/lib/include/wx
/mnt/bin/lib/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h也链接到/mnt/bin/lib/include/wx/setup.h
准备完毕之后,就可以用make做事情了。
编译完毕后,直接把源码binaries目录下面的data和system两个文件夹拷贝到/mnt/bin/0ad下面即可。只是我不明白的是,编译时候,明明说好了是release的,但编译出来的文件体积还是很大,所以,我们需要进入/mnt/bin/0ad/system目录运行一次「strip *」才行。
跟着,又到了缺库补库的阶段了,这点上面我们已经说过了,在此也就不重复了。我想,运行一次ldd * 2>/dev/null |grep not分析结果也很容易上手吧。
最后,弄一个脚本,运行system目录下面的pyrogenesis即可。
第三个要弄的游戏是vdrift,先把这东西下载过来。
下载完后,解压一看,你会发现这货的项目管理工具非常奇葩,居然是SCons,先去 scons.org下一个东西过来,然后我们再弄一个脚本scons并添加到/mnt/bin/lib/bin里面:
[bash]
#!/bin/bash
PYTHONPATH=$PYTHONPATH:/mnt/bin/scons/engine
python2 /mnt/bin/scons/scons "$@"
[/bash]
跟着,导出前面的CPLUS_INCLUDE_PATH等一大堆变量,然后,进入源码目录输入scons开始工作。
很好,出错了,说是pkg-config错误,说是找不到bullet这库,我们去Arch那边先下个bullet过来,解压过去。
完毕后,运行下面的命令准备。
代码: 全选
sed -i '1s/\(prefix=\)\/usr/\1\/mnt\/bin\/lib/g' /mnt/bin/lib/lib/pkgconfig/bullet.pc
export PKG_CONFIG_PATH=/mnt/bin/lib/lib/pkgconfig
其实,对于这种问题,我们可以直接绕过项目管理工具,直接去编译。怎么弄?打下面的补丁即可。
[bash]
>>>cat scons-pass.patch
--- SConstruct.bak 2013-02-01 11:22:22.631434777 +0800
+++ SConstruct 2013-02-01 11:27:39.595632717 +0800
@@ -6,17 +6,17 @@
#---------------#
opts = Variables('vdrift.conf', ARGUMENTS)
opts.Add('destdir', 'Staging area to install VDrift to. Useful for packagers. ', '')
-opts.Add('arch', 'Target architecture to compile vdrift for (x86, 686, p4, axp, a64, prescott, nocona, core2)', 'x86')
+opts.Add('arch', 'Target architecture to compile vdrift for (x86, 686, p4, axp, a64, prescott, nocona, core2)', 'a64')
opts.Add(BoolVariable('minimal', 'Only install minimal data (3 cars and 2 tracks)', 0))
opts.Add(BoolVariable('cache', 'Cache options in vdrift.conf', 1))
-opts.Add(BoolVariable('release', 'Turn off debug option during build', 0))
+opts.Add(BoolVariable('release', 'Turn off debug option during build', 1))
opts.Add(BoolVariable('use_apbuild', 'Set this to 1 if you want to compile with apgcc to create an autopackage', 0))
opts.Add(BoolVariable('use_binreloc', 'Set this to 1 if you want to compile with Binary Relocation support', 1))
opts.Add(BoolVariable('os_cc', 'Set this to 1 if you want to use the operating system\'s C compiler environment variable.', 0))
opts.Add(BoolVariable('os_cxx', 'Set this to 1 if you want to use the operating system\'s C++ compiler environment variable.', 0))
opts.Add(BoolVariable('os_cxxflags', 'Set this to 1 if you want to use the operating system\'s C++ compiler flags environment variable.', 0))
opts.Add(BoolVariable('use_distcc', 'Set this to 1 to enable distributed compilation', 0))
-opts.Add(BoolVariable('force_feedback', 'Enable force-feedback support', 0))
+opts.Add(BoolVariable('force_feedback', 'Enable force-feedback support', 1))
opts.Add(BoolVariable('profiling', 'Turn on profiling output', 0))
opts.Add(BoolVariable('efficiency', 'Turn on compile-time efficiency warnings', 0))
opts.Add(BoolVariable('verbose', 'Show verbose compiling output', 1))
@@ -27,8 +27,8 @@
# define a list of CPPDEFINES so they don't get mangled...
cppdefines = []
default_settingsdir = ".vdrift"
-default_prefix = "/usr/local"
-default_datadir = "share/games/vdrift/data"
+default_prefix = "/mnt/bin/vdrift"
+default_datadir = "data"
default_bindir = "bin"
#---------------#
@@ -144,8 +144,8 @@
env['CXXFLAGS'] += SCons.Util.CLVar(os.environ['CXXFLAGS'])
if os.environ.has_key('LDFLAGS'):
env['LINKFLAGS'] += SCons.Util.CLVar(os.environ['LDFLAGS'])
- check_headers = ['GL/gl.h', 'GL/glu.h', 'SDL/SDL.h', 'SDL/SDL_image.h', 'SDL/SDL_rotozoom.h', 'vorbis/vorbisfile.h', 'GL/glew.h', 'curl/curl.h', 'bullet/btBulletCollisionCommon.h', 'archive.h']
- check_libs = [ ['GLEW', 'GL/glew.h', 'glDeleteSamplers(0, NULL);', 'Your GLEW library is out of date.'] ]
+ check_headers = []
+ check_libs = []
if ARGUMENTS.get('verbose') != "1":
env['ARCOMSTR'] = "\tARCH $TARGET"
>>>patch -p0 <scons-pass.patch
[/bash]
不过,这货编译的时候,貌似还要运行一次svnversion获取版本号,我们可以自己弄一个svnversion绕过去,直接显示几个字符的脚本大家会写了吧,这个就不说了。
再scons一下,再次失败,说是SDLK相关的一大堆变量还没有声明,这时候,我们需要打一个叫vdrift-2012-07-22c_bullet281_patch.diff的补丁。
打完补丁之后,再运行一次scons,总算是成功编译了。
然后,运行scons install安装过去即可,至于最后一步的缺库补库,就不说了。
至此,三个游戏也弄过来了,接下来,好好享受游戏吧,折腾就到此结束了,毕竟妹子和游戏才是头等大事。