diff options
9 files changed, 215 insertions, 6 deletions
diff --git a/anttasks/src/com/android/ant/AaptExecLoopTask.java b/anttasks/src/com/android/ant/AaptExecLoopTask.java index f3824ef..d7d53c9 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 862d745..f2fa094 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 81c6682..a87d0d5 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 <path> 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 0000000..f001311 --- /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. + * <p> + * It expects 3 attributes:<br> + * 'executable' ({@link Path} with a single path) for the location of the aidl executable<br> + * 'framework' ({@link Path} with a single path) for the "preprocessed" file containing all the + * parcelables exported by the framework<br> + * '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<Path> mPaths = new ArrayList<Path>(); + + /** + * 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<String> sourceFolders = new ArrayList<String>(); + 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 4d1bac6..c3cedfd 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 e63f941..a8d7266 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" /> + <taskdef name="renderscript" + classname="com.android.ant.RenderScriptTask" + classpathref="android.antlibs" /> + <taskdef name="apkbuilder" classname="com.android.ant.ApkBuilderTask" classpathref="android.antlibs" /> @@ -294,7 +298,7 @@ <target name="-pre-build"/> <!-- Generates the R.java file for this project's resources. --> - <target name="-resource-src" depends="-dirs, -pre-build"> + <target name="-resource-src" depends="-dirs"> <if condition="${manifest.hasCode}"> <then> <echo>Generating R.java / Manifest.java from the resources...</echo> @@ -330,12 +334,31 @@ </if> </target> + <!-- Compiles RenderScript files into Java and bytecode. --> + <target name="-renderscript" depends="-dirs"> + <if condition="${manifest.hasCode}"> + <then> + <echo>Compiling RenderScript files into Java classes and RenderScript bytecode...</echo> + <renderscript executable="${renderscript}" + framework="${android.rs}" + genFolder="${gen.absolute.dir}" + resFolder="${resource.absolute.dir}/raw"> + <source path="${source.absolute.dir}"/> + <source refid="project.libraries.src"/> + </renderscript> + </then> + <else> + <echo>hasCode = false. Skipping...</echo> + </else> + </if> + </target> + <!-- empty default pre-compile target. Create a similar target in your build.xml and it'll be called instead of this one. --> <target name="-pre-compile"/> <!-- Compiles this project's .java files into .class files. --> - <target name="compile" depends="-resource-src, -aidl, -pre-compile" + <target name="compile" depends="-pre-build, -aidl, -renderscript, -resource-src, -pre-compile" description="Compiles project's .java files into .class files"> <if condition="${manifest.hasCode}"> <then> diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/IAndroidTarget.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/IAndroidTarget.java index dc75c61..3be51d2 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<IAndroidTarget> { 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 e14af0b..817053c 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 09e3502..30451cf 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. |