使用 Premake 自动化 Android 编译脚本的维护

premake0

需求

在使用 ndk 做 Android 开发时,一件比较麻烦的事情是编译脚本 (也就是 Android.mk 和 Application.mk ) 的维护工作。今天尝试了一下把这个维护的工作自动化,完成以后简单记录一下。

在日常工作里我尝试过不少生成脚本的自动化工具,用下来觉得最方便的是 Premake,这个工具的好处是 Lua 语法,跟 cmake 之类的脚本相比,非常清晰易读。我用 C++ 写的库,大多是用这个工具生成工程文件 (sln/vcxproj) 的,这样的生成两大好处:

  1. 可以使工程文件与磁盘上的目录结构自动对应。
  2. 所有的编译选项清楚地列在一个简短的 Lua 内,维护时不容易出错。

这一次我的目标就是使用 Premake 把 Android.mk 和 Application.mk 这两个脚本的维护自动化,最好能做到一键生成 vs2013/android 两个平台对应的编译脚本。


Make it run

这个页面可以看到,Premake 没有原生对 android ndk 的支持,但在 Third-Party Modules 里可以看到两个相关的包,一个是 TurkeyMan(Manu Evans) 的 premake-android,另一个是 Meoo(Bastien Brunnenstein) 的 premake-androidmk,这一次我们使用后者。

阅读 Premake 的文档 Using Modules 可以知道,使用第三方模块本质上就是一个普通的 require,我们 git clone 到本地后,按照 README 这样照葫芦画瓢写个例子测试一下吧。

写完以后发现,作者在 readme 里没有写具体用什么命令来执行……翻代码之后发现正确姿势是这样的:

premake5.exe --file=premake_android.lua androidmk

运行后—— duang~~ 得到一个 Lua 报错,大致是说几个期望的表为 nil,翻代码看了一下,是几个实际上无需指定的 optional 参数,作者提供的例子里也没有指定。那么把代码 fork 到本地修一下吧。 (这里) 是对应的修复 commit。

再次运行就一切正常了。

premake1

注意事项

需要注意以下事项,

  • 生成脚本 (此处为 premake_android.lua) 内所有的路径为相对于生成脚本的路径,而非相对于 Android.mk 的路径,Premake 会完成路径的转换

  • 为了生成恰当的 LOCAL_MODULE_FILENAME,需要在 project 内指明 targetname

premake2

  • 以下三个选项是最常用到的选项,分别是 Android.mk 的生成路径,abi 选择和 sdk 版本号的选择

premake3

  • 实际的 include $(BUILD_STATIC_LIBRARY) 在配置项 $(PM5_CONFIG) 对应的条件分支内,编译时需要指明这个配置项的值 (如下图中的情况需要在编译时指明 ndk-build PM5_CONFIG=debug,或在引用脚本里指明是使用 debug 还是 release )

premake4

代码清单

这里是全部的脚本清单,可以看到与同类型的工具相比,非常简洁和易于维护:

require "modules/premake-androidmk/androidmk"

solution "mici"
    configurations { "Debug", "Release" }
    language "C++"

    location    "android/jni"      
    ndkabi      "default"
    ndkplatform "android-19"

    filter "configurations:Release"
        optimize "On"
    filter "configurations:Debug"
        optimize "Debug"

    project "mici_static"
        targetname "libmici"
        kind "StaticLib"
        includedirs "../"
        files {
            "../mici/**",
        }

使用以下的命令一键生成 vs2013/android 的工程文件和编译脚本:

premake5.exe --file=premake_vs2013.lua vs2013
premake5.exe --file=premake_android.lua androidmk

我的修复版 premake-androidmk 在这里维护。

[完]
Gu Lu
[2016-04-17]

知识共享许可协议
本作品由Gu Lu创作,采用知识共享Attribution-NonCommercial-NoDerivatives 4.0 国际许可协议进行许可。