IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    Gu Lu\'s Blog发表于 2016-04-17 07:27:00
    love 0

    premake0

    需求

    在使用 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。

    再次运行就一切正常了。

    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]



沪ICP备19023445号-2号
友情链接