最初的问题是询问有关蚂蚁的构建。这个答案与CC.NET中的问题有关,蚂蚁和gradle构建将以同样的方式受到影响。
我们使用gradle和一些自定义gradle任务,可以通过调用ndk-build.cmd(来自其中没有空格的路径)来编译项目的本机代码。
gradle文件准备好后,shell启动的gradle builds可以工作,但cc.net发起的build会失败。
我们CC.NET任务定义如下:
<exec executable=".\gradlew.bat">
<baseDirectory>$(projSrcDir)</baseDirectory>
<buildArgs>clean assemblePlayRelease assembleProRelease</buildArgs>
<buildTimeoutSeconds>900</buildTimeoutSeconds>
</exec>
的问题是关系到一个CC.NET错误,导致shell变量名是小写。 Windows shell脚本不关心shell变量名称的情况,但是因为NDK启动使得可变大小写成为一个问题。作为构建过程一部分的init.mk make文件依赖于shell变量名来标识主机操作系统类型。特别是shell变量OS。通常,OS的值的定义如下:
OS=Windows_NT
但当变量传递从CC.NET到摇篮它被转化成这样:
os=Windows_NT
这导致在初始化的检测机构。MK失败,尝试执行UNIX检测序列和寻找Unix的UNAME实用程序,不存在在Windows上导致:
Android NDK: Unable to determine HOST_OS from uname -s:
Android NDK: Please define HOST_OS in your environment.
make.exe: Entering directory `D:/CC.NET/svncheckout/pes/src/project/src/main/jni'
make.exe: Leaving directory `D:/CC.NET/svncheckout/pes/src/project/src/main/jni'
而最终:
process_begin: CreateProcess(NULL, uname -s, ...) failed.
c:/ndk/build/core/init.mk:160: *** Android NDK: Aborting. . Stop.
FAILURE: Build failed with an exception.
的解决方法是小于理想但它完成了工作。我们的想法是编辑ndk-build.cmd,并且仅在从CC.NET构建时才更改传递变量的大小写。
在NDK-build.cmd的关闭@echo线后只需插入此代码:
IF DEFINED ccnetproject (
ECHO Applying Environment variable hack for CC.NET.
SET OS2=%os%
SET OS=
REM SET PATH=%path%
SET TEMP2=%temp%
SET TEMP=
)
IF DEFINED ccnetproject (
SET OS=%OS2%
SET OS2=
SET TEMP=%TEMP2%
SET TEMP2=
)
此脚本首先对在较低的情况下,OS和TEMP变量值的临时副本。接下来,通过清除它们的值来取消定义它们。最后反过来完成。需要因为只是说
SET OS=%os%
没有做太多,因为脚本是不区分大小写
两个步骤。它首先找到操作系统变量,找到一个小写版本并将自己的值赋给自己。
这是在CC.NET v1.6.7981.1,gradle v1.1.0和Android NDK v10(64位)上测试的。