CruiseControl.net ndk-建立在Windows 64位没有Cygwin
最新的Android NDK(版本8)允许呼叫ndk-build
没有额外的cygwin安装。CruiseControl.net ndk-建立在Windows 64位没有Cygwin
我的问题是:我可以插入CruiseControl.Net这个定期的本地构建吗?
我认为最有可能我会需要使用蚂蚁作为构建方法,然后将其添加到CCNET服务器配置。
所以问题是:
如何调用
ndk-build.cmd
从蚂蚁命令如何配置
build.xml
文件? 我尝试了几种方法,但都失败了。如果可能,你能给我一些线索吗?
好我得到了一些进步,我能够通过蚂蚁或恶性但在这两种情况下,插入到cc.net服务器配置来构建JNI代码给我strane错误:
但现在CC .NET让我奇怪的错误:
<builderror>
<type>NAnt.Core.BuildException</type>
<message><![CDATA[External Program Failed: G:\\android-ndk-r8b\\ndk-build.cmd (return code was 2)]]></message>
<location>
<filename>G:/MYPath/project.build</filename>
<linenumber>7</linenumber>
<columnnumber>4</columnnumber>
</location>
<stacktrace><![CDATA[ at NAnt.Core.Tasks.ExternalProgramBase.ExecuteTask()
at NAnt.Core.Tasks.ExecTask.ExecuteTask()
at NAnt.Core.Task.Execute()
at NAnt.Core.Target.Execute()
at NAnt.Core.Project.Execute(String targetName, Boolean forceDependencies)
at NAnt.Core.Project.Execute()
at NAnt.Core.Project.Run()]]></stacktrace>
</builderror>
</failure>
<duration>296.40000000000003</duration>
</buildresults>Buildfile: file:///G:/MYPath/project.build
Target framework: Microsoft .NET Framework 4.0
Target(s) specified: build
清洁:
[echo] Starting Android ndk CLEAN ...
[exec] Android NDK: Unable to determine HOST_OS from uname -s:
[exec] Android NDK: Please define HOST_OS in your environment.
[exec] process_begin: CreateProcess(NULL, uname -s, ...) failed.
[exec] G:/android-ndk-r8b/build/core/init.mk:131: *** Android NDK: Aborting. . Stop.
构建失败 - 0非致命错误(S),2个警告
我在cc.net配置项目:
<project>
<name>MY_PROJECT_NAME</name>
<workingDirectory>PATH_TO_MY_PROJECT</workingDirectory>
<tasks>
<nant>
<executable>G:\nant-0.92\bin\Nant.exe</executable>
<baseDirectory>PATH_TO_MY_PROJECT</baseDirectory>
<buildFile>MYPROJECTNAME.build</buildFile>
<buildArgs>build</buildArgs>
<buildTimeoutSeconds>1200</buildTimeoutSeconds>
</nant>
</tasks>
</project>
我的楠构建文件:
<project name="my name" default="build" basedir=".">
<description>My project Build Files.</description>
<target name="clean" description="remove all generated files">
<echo message="Starting Android ndk CLEAN ..."/>
<exec program="G:\\android-ndk-r8b\\ndk-build.cmd" failonerror="true"
basedir="MY PROJECT PATH">
<arg value="clean" />
</exec>
<echo message="Android ndk CLEAN done."/>
</target>
<target name="build" description="remove all generated files" depends="clean">
<echo message="Starting Android ndk BUILD ..."/>
<exec program="G:/android-ndk-r8b/ndk-build.cmd" failonerror="true" />
<echo message="Android ndk BUILD done."/>
</target>
</project>
正如我所说的,我可以为我的项目运行Nant.exe并清理和建设正确。 它看起来像cc.net试图运行其他ndk-build commend用于Linux和缺少一些命令为uname。 你知道cI可能会做错什么吗?
当尝试直接从build.xml使用Windows上的CC.net调用“ndk-build.cmd”时,遇到了同样的问题(CreateProcess故障等)。我想出了如何使这个工作,所以我觉得不得不分享我的解决方案。
首先,创建一个1行的Windows命令文件如下(我把它命名为 “ndkwrapper.cmd”):
sh ndkwrap.sh %1 %2 %3
接下来,如下(名为“ndkwrap.sh创建一个简单的bash shell脚本“):
#!/usr/bin/sh
# Wrapper around ndk-build script for Windows
#
NDK_PROJECT_PATH=/cygdrive/c/workspace/agnc_android
export NDK_PROJECT_PATH
/cygdrive/c/Android/android-ndk-r8b/ndk-build $1 $2 $3
当然,你的确切路径(工作区和NDK目录)可以是不同的,但要注意,特别地,该 “/ cygdrive/C” 是指 “C:”。
在上面创建脚本之后,一个非常重要的步骤是将行结束符从Windows转换为UNIX。您可以使用一个名为“dos2unix.exe”的实用程序来完成此操作,该实用程序可以免费使用。我不记得我在哪里,但它是移植到Windows的一些开源的GNU/Linux工具包的一部分。 (Google上的“用于Windows的UNIX文件实用程序”。)如果您不转换行结束符,那么sh或bash将无法读取脚本,并且您会得到有关“\ r”的各种错误...因此,为了调用等效的“ndk-build.cmd clean”,例如,你需要输入“ndkwrapper.cmd clean”来删除你的中间和输出NDK相关的构建文件,准备完整的NDK构建。
在为CC.net build.xml文件在Windows上,你可以调用NDK生成文件如下:
<tasks>
<exec>
<executable>cmd.exe</executable>
<baseDirectory>C:\Android</baseDirectory>
<buildArgs>/C ndkwrapper.cmd clean</buildArgs>
</exec>
希望这有助于!
本
我观察运行NDK建造作为CCNET任务时也存在问题。 我花了一段时间,但最后我注意到,你必须提供HOST_OS
和HOST_ARCH
作为ndk-build参数让它运行。
<exec>
<executable>cmd</executable>
<buildArgs>/C ndk-build HOST_OS=windows HOST_ARCH=x86 -B NDK_PROJECT_PATH=[PROJECT] APP_BUILD_SCRIPT=[ANDROIDMKFILE] NDK_APPLICATION_MK=[APPLICATIONMKFILE] NDK_LOG=1</buildArgs>
<buildTimeoutSeconds>120</buildTimeoutSeconds>
</exec>
希望它可以帮助任何人节省时间。
最初的问题是询问有关蚂蚁的构建。这个答案与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位)上测试的。