转载

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

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

需求

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

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

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

这一次我的目标就是使用 Premake 把 Android.mk 和 Application.mk 这两个脚本的维护自动化,最好能做到一键生成 vs2013/vs2015/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。

再次运行就一切正常了。

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

注意事项

需要注意以下事项,

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

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

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

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

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

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

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

代码清单

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

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]

原文  http://www.gulu-dev.com/post/2016-04-17-premake-android-mk
正文到此结束
Loading...