From 68d0fb4cbfa47402910027c97bc91410da75ea10 Mon Sep 17 00:00:00 2001 From: Xavier Ducrohet Date: Mon, 10 Jan 2011 18:35:03 -0800 Subject: [PATCH] Add renderscript support to the Ant build system. Change-Id: Iba1c956d33725716923da89b788f7f8d14524e41 --- anttasks/src/com/android/ant/AaptExecLoopTask.java | 3 + anttasks/src/com/android/ant/AidlExecTask.java | 11 +- anttasks/src/com/android/ant/AntConstants.java | 9 +- anttasks/src/com/android/ant/RenderScriptTask.java | 143 +++++++++++++++++++++ anttasks/src/com/android/ant/SetupTask.java | 6 + files/ant/main_rules.xml | 27 +++- .../src/com/android/sdklib/IAndroidTarget.java | 2 + .../src/com/android/sdklib/PlatformTarget.java | 1 + .../src/com/android/sdklib/SdkConstants.java | 19 +++ 9 files changed, 215 insertions(+), 6 deletions(-) create mode 100644 anttasks/src/com/android/ant/RenderScriptTask.java diff --git a/anttasks/src/com/android/ant/AaptExecLoopTask.java b/anttasks/src/com/android/ant/AaptExecLoopTask.java index f3824ef36..d7d53c906 100644 --- a/anttasks/src/com/android/ant/AaptExecLoopTask.java +++ b/anttasks/src/com/android/ant/AaptExecLoopTask.java @@ -302,6 +302,9 @@ public final class AaptExecLoopTask extends Task { task.setExecutable(mExecutable); task.setFailonerror(true); + File exe = new File(mExecutable); + task.setTaskName(exe.getName()); + // aapt command. Only "package" is supported at this time really. task.createArg().setValue(mCommand); diff --git a/anttasks/src/com/android/ant/AidlExecTask.java b/anttasks/src/com/android/ant/AidlExecTask.java index 862d745cd..f2fa094c7 100644 --- a/anttasks/src/com/android/ant/AidlExecTask.java +++ b/anttasks/src/com/android/ant/AidlExecTask.java @@ -72,11 +72,14 @@ public class AidlExecTask extends Task { @Override public void execute() throws BuildException { + if (mExecutable == null) { + throw new BuildException("AidlExecTask's 'executable' is required."); + } if (mFramework == null) { - throw new BuildException("AidlExecTask's framework is required."); + throw new BuildException("AidlExecTask's 'framework' is required."); } if (mGenFolder == null) { - throw new BuildException("AidlExecTask's genFolder is required."); + throw new BuildException("AidlExecTask's 'genFolder' is required."); } Project taskProject = getProject(); @@ -90,6 +93,9 @@ public class AidlExecTask extends Task { } } + File exe = new File(mExecutable); + String execTaskName = exe.getName(); + // now loop on all the source folders to find all the aidl to compile // and compile them for (String sourceFolder : sourceFolders) { @@ -109,6 +115,7 @@ public class AidlExecTask extends Task { task.setProject(taskProject); task.setOwningTarget(getOwningTarget()); task.setExecutable(mExecutable); + task.setTaskName(execTaskName); task.setFailonerror(true); task.createArg().setValue("-p" + mFramework); diff --git a/anttasks/src/com/android/ant/AntConstants.java b/anttasks/src/com/android/ant/AntConstants.java index 81c66821e..a87d0d572 100644 --- a/anttasks/src/com/android/ant/AntConstants.java +++ b/anttasks/src/com/android/ant/AntConstants.java @@ -21,18 +21,23 @@ package com.android.ant; */ public interface AntConstants { - /** ant property with the path to the android.jar */ + /** ant property with the path to the android.jar file */ public final static String PROP_ANDROID_JAR = "android.jar"; - /** ant property with the path to the framework.jar */ + /** ant property with the path to the framework.aidl file */ public final static String PROP_ANDROID_AIDL = "android.aidl"; + /** ant property with the path to the renderscript framework include folder. */ + public final static String PROP_ANDROID_RENDERSCRIPT = "android.rs"; + /** ant property with the path to the aapt tool */ public final static String PROP_AAPT = "aapt"; /** ant property with the path to the aidl tool */ public final static String PROP_AIDL = "aidl"; /** ant property with the path to the dx tool */ public final static String PROP_DX = "dx"; + /** ant property with the path to the renderscript tool */ + public final static String PROP_RENDERSCRIPT = "renderscript"; /** ref id to the object containing all the boot classpaths. */ public final static String PROP_CLASSPATH_REF = "android.target.classpath"; diff --git a/anttasks/src/com/android/ant/RenderScriptTask.java b/anttasks/src/com/android/ant/RenderScriptTask.java new file mode 100644 index 000000000..f00131151 --- /dev/null +++ b/anttasks/src/com/android/ant/RenderScriptTask.java @@ -0,0 +1,143 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.ant; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.taskdefs.ExecTask; +import org.apache.tools.ant.types.FileSet; +import org.apache.tools.ant.types.Path; +import org.apache.tools.ant.types.PatternSet.NameEntry; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; + +/** + * Task to execute aidl. + *

+ * It expects 3 attributes:
+ * 'executable' ({@link Path} with a single path) for the location of the aidl executable
+ * 'framework' ({@link Path} with a single path) for the "preprocessed" file containing all the + * parcelables exported by the framework
+ * 'genFolder' ({@link Path} with a single path) for the location of the gen folder. + * + * It also expects one or more inner elements called "source" which are identical to {@link Path} + * elements. + */ +public class RenderScriptTask extends Task { + + private String mExecutable; + private String mFramework; + private String mGenFolder; + private String mResFolder; + private final List mPaths = new ArrayList(); + + /** + * Sets the value of the "executable" attribute. + * @param executable the value. + */ + public void setExecutable(Path executable) { + mExecutable = TaskHelper.checkSinglePath("executable", executable); + } + + public void setFramework(Path value) { + mFramework = TaskHelper.checkSinglePath("framework", value); + } + + public void setGenFolder(Path value) { + mGenFolder = TaskHelper.checkSinglePath("genFolder", value); + } + + public void setResFolder(Path value) { + mResFolder = TaskHelper.checkSinglePath("resFolder", value); + } + + public Path createSource() { + Path p = new Path(getProject()); + mPaths.add(p); + return p; + } + + @Override + public void execute() throws BuildException { + if (mExecutable == null) { + throw new BuildException("RenderScriptTask's 'executable' is required."); + } + if (mFramework == null) { + throw new BuildException("RenderScriptTask's 'framework' is required."); + } + if (mGenFolder == null) { + throw new BuildException("RenderScriptTask's 'genFolder' is required."); + } + if (mResFolder == null) { + throw new BuildException("RenderScriptTask's 'resFolder' is required."); + } + + Project taskProject = getProject(); + + // build a list of all the source folders + ArrayList sourceFolders = new ArrayList(); + for (Path p : mPaths) { + String[] values = p.list(); + if (values != null) { + sourceFolders.addAll(Arrays.asList(values)); + } + } + + File exe = new File(mExecutable); + String execTaskName = exe.getName(); + + // now loop on all the source folders to find all the renderscript to compile + // and compile them + for (String sourceFolder : sourceFolders) { + // create a fileset to find all the aidl files in the current source folder + FileSet fs = new FileSet(); + fs.setProject(taskProject); + fs.setDir(new File(sourceFolder)); + NameEntry include = fs.createInclude(); + include.setName("**/*.rs"); + + // loop through the results of the file set + Iterator iter = fs.iterator(); + while (iter.hasNext()) { + Object next = iter.next(); + + ExecTask task = new ExecTask(); + task.setTaskName(execTaskName); + task.setProject(taskProject); + task.setOwningTarget(getOwningTarget()); + task.setExecutable(mExecutable); + task.setFailonerror(true); + + task.createArg().setValue("-I"); + task.createArg().setValue(mFramework); + task.createArg().setValue("-p"); + task.createArg().setValue(mGenFolder); + task.createArg().setValue("-o"); + task.createArg().setValue(mResFolder); + task.createArg().setValue(next.toString()); + + // execute it. + task.execute(); + } + } + } +} diff --git a/anttasks/src/com/android/ant/SetupTask.java b/anttasks/src/com/android/ant/SetupTask.java index 4d1bac6fc..c3cedfd14 100644 --- a/anttasks/src/com/android/ant/SetupTask.java +++ b/anttasks/src/com/android/ant/SetupTask.java @@ -199,9 +199,15 @@ public final class SetupTask extends ImportTask { String androidAidl = androidTarget.getPath(IAndroidTarget.ANDROID_AIDL); antProject.setProperty(AntConstants.PROP_ANDROID_AIDL, androidAidl); + String androidRS = androidTarget.getPath(IAndroidTarget.ANDROID_RS); + antProject.setProperty(AntConstants.PROP_ANDROID_RENDERSCRIPT, androidRS); + antProject.setProperty(AntConstants.PROP_AAPT, androidTarget.getPath(IAndroidTarget.AAPT)); antProject.setProperty(AntConstants.PROP_AIDL, androidTarget.getPath(IAndroidTarget.AIDL)); antProject.setProperty(AntConstants.PROP_DX, androidTarget.getPath(IAndroidTarget.DX)); + antProject.setProperty(AntConstants.PROP_RENDERSCRIPT, + sdkOsPath + SdkConstants.OS_SDK_PLATFORM_TOOLS_FOLDER + + SdkConstants.FN_RENDERSCRIPT); // sets up the boot classpath diff --git a/files/ant/main_rules.xml b/files/ant/main_rules.xml index e63f94146..a8d726670 100644 --- a/files/ant/main_rules.xml +++ b/files/ant/main_rules.xml @@ -22,6 +22,10 @@ classname="com.android.ant.AidlExecTask" classpathref="android.antlibs" /> + + @@ -294,7 +298,7 @@ - + Generating R.java / Manifest.java from the resources... @@ -330,12 +334,31 @@ + + + + + Compiling RenderScript files into Java classes and RenderScript bytecode... + + + + + + + hasCode = false. Skipping... + + + + - diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/IAndroidTarget.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/IAndroidTarget.java index dc75c61dc..3be51d201 100644 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/IAndroidTarget.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/IAndroidTarget.java @@ -77,6 +77,8 @@ public interface IAndroidTarget extends Comparable { public final static int DX_JAR = 23; /** OS Path to the "ant" folder which contains the ant build rules (ver 2 and above) */ public final static int ANT = 24; + /** OS Path to the Renderscript include folder. */ + public final static int ANDROID_RS = 25; /** * Return value for {@link #getUsbVendorId()} meaning no USB vendor IDs are defined by the diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/PlatformTarget.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/PlatformTarget.java index e14af0bbb..817053c88 100644 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/PlatformTarget.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/PlatformTarget.java @@ -76,6 +76,7 @@ final class PlatformTarget implements IAndroidTarget { mPaths.put(ANDROID_JAR, mRootFolderOsPath + SdkConstants.FN_FRAMEWORK_LIBRARY); mPaths.put(SOURCES, mRootFolderOsPath + SdkConstants.FD_ANDROID_SOURCES); mPaths.put(ANDROID_AIDL, mRootFolderOsPath + SdkConstants.FN_FRAMEWORK_AIDL); + mPaths.put(ANDROID_RS, mRootFolderOsPath + SdkConstants.OS_FRAMEWORK_RS); mPaths.put(IMAGES, mRootFolderOsPath + SdkConstants.OS_IMAGES_FOLDER); mPaths.put(SAMPLES, mRootFolderOsPath + SdkConstants.OS_PLATFORM_SAMPLES_FOLDER); mPaths.put(SKINS, mRootFolderOsPath + SdkConstants.OS_SKINS_FOLDER); diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/SdkConstants.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/SdkConstants.java index 09e3502c9..30451cf97 100644 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/SdkConstants.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/SdkConstants.java @@ -62,6 +62,10 @@ public final class SdkConstants { public static final String FN_ATTRS_MANIFEST_XML = "attrs_manifest.xml"; /** framework aidl import file */ public static final String FN_FRAMEWORK_AIDL = "framework.aidl"; + /** framework renderscript folder */ + public static final String FN_FRAMEWORK_RENDERSCRIPT = "renderscript"; + /** framework include folder */ + public static final String FN_FRAMEWORK_INCLUDE = "include"; /** layoutlib.jar file */ public static final String FN_LAYOUTLIB_JAR = "layoutlib.jar"; /** widget list file */ @@ -116,6 +120,10 @@ public final class SdkConstants { public final static String FN_AIDL = (CURRENT_PLATFORM == PLATFORM_WINDOWS) ? "aidl.exe" : "aidl"; //$NON-NLS-1$ //$NON-NLS-2$ + /** renderscript executable (with extension for the current OS) */ + public final static String FN_RENDERSCRIPT = (CURRENT_PLATFORM == PLATFORM_WINDOWS) ? + "llvm-rs-cc.exe" : "llvm-rs-cc"; //$NON-NLS-1$ //$NON-NLS-2$ + /** adb executable (with extension for the current OS) */ public final static String FN_ADB = (CURRENT_PLATFORM == PLATFORM_WINDOWS) ? "adb.exe" : "adb"; //$NON-NLS-1$ //$NON-NLS-2$ @@ -221,6 +229,8 @@ public final class SdkConstants { public final static String FD_ANT = "ant"; /** Name of the SDK data folder, i.e. "data" */ public final static String FD_DATA = "data"; + /** Name of the SDK renderscript folder, i.e. "rs" */ + public final static String FD_RENDERSCRIPT = "rs"; /** Name of the SDK resources folder, i.e. "res" */ public final static String FD_RES = "res"; /** Name of the SDK font folder, i.e. "fonts" */ @@ -287,6 +297,11 @@ public final class SdkConstants { * This is an OS path, ending with a separator. */ public final static String OS_PLATFORM_DATA_FOLDER = FD_DATA + File.separator; + /** Path of the renderscript directory relative to a platform folder. + * This is an OS path, ending with a separator. */ + public final static String OS_PLATFORM_RENDERSCRIPT_FOLDER = FD_RENDERSCRIPT + File.separator; + + /** Path of the samples directory relative to a platform folder. * This is an OS path, ending with a separator. */ public final static String OS_PLATFORM_SAMPLES_FOLDER = FD_SAMPLES + File.separator; @@ -325,6 +340,10 @@ public final class SdkConstants { public final static String OS_PLATFORM_LAYOUTLIB_JAR = OS_PLATFORM_DATA_FOLDER + FN_LAYOUTLIB_JAR; + /** Path of the renderscript include folder relative to a platform folder. */ + public final static String OS_FRAMEWORK_RS = + FN_FRAMEWORK_RENDERSCRIPT + File.separator + FN_FRAMEWORK_INCLUDE; + /* Folder paths relative to a addon folder */ /** Path of the images directory relative to a folder folder. -- 2.11.0