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

Comments
Write a Comment

Tags

游戏开发   随笔   Programming   C/C++   优化   Unity   C++   知乎   游戏设计   比特币   Unity3D   区块链   软件开发   引擎设计   系统架构   Production   idtech   中国文化   加密货币   项目管理   Bitcoin   游戏评论   资源管理   资源流水线   效率   道德经   网络   方法论   模板编程   Lua   Oculus   GDC   渲染   VR   PerfAssist   Unity MemoryProfiler   BCH   经济学   信息过载   行业报告   字体   Productivity   图形   网络编程   Dice   协程   EMC   Premake   测试   中间件   Game Engine   新手引导   Methodology   CI   命令行解析   goroutine   ndk   Ethereum   nanomsg   自动化   Scripting   摘录   Debugging   同步技术   cppcon   C++模板   DOOM3   技术评估   Unity GC   C++11   学习方法   Surface Pro 3   Engine Evaluation   CRT   文化   Blockchain   笔记   golang   图形编程   多线程   ETH   Blockchain Computing   Bitcoin Cash   cppcon14   Bitcoin SV   Visual Studio   Unity Coroutine   跨语言可变参数列表   团队协作   货币   Deployment   Visual Assist   工程改进   Michael Abrash   exp   开放世界   域名   虚拟现实   系统重构   slua   遮挡剔除   完美转发   协作式调度   Modern C++   类型推导   Memory Debugging   个人成长   小故事   BTC   暴雪   产品   历史   错误处理   Unity Profiler   MOD  

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