OSDN Git Service

Add renderscript support to the Ant build system.
authorXavier Ducrohet <xav@android.com>
Tue, 11 Jan 2011 02:35:03 +0000 (18:35 -0800)
committerXavier Ducrohet <xav@android.com>
Wed, 19 Jan 2011 00:51:18 +0000 (16:51 -0800)
Change-Id: Iba1c956d33725716923da89b788f7f8d14524e41

anttasks/src/com/android/ant/AaptExecLoopTask.java
anttasks/src/com/android/ant/AidlExecTask.java
anttasks/src/com/android/ant/AntConstants.java
anttasks/src/com/android/ant/RenderScriptTask.java [new file with mode: 0644]
anttasks/src/com/android/ant/SetupTask.java
files/ant/main_rules.xml
sdkmanager/libs/sdklib/src/com/android/sdklib/IAndroidTarget.java
sdkmanager/libs/sdklib/src/com/android/sdklib/PlatformTarget.java
sdkmanager/libs/sdklib/src/com/android/sdklib/SdkConstants.java

index f3824ef..d7d53c9 100644 (file)
@@ -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);
 
index 862d745..f2fa094 100644 (file)
@@ -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);
index 81c6682..a87d0d5 100644 (file)
@@ -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 (file)
index 0000000..f001311
--- /dev/null
@@ -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();
+            }
+        }
+    }
+}
index 4d1bac6..c3cedfd 100644 (file)
@@ -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
 
index e63f941..a8d7266 100644 (file)
         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" />
     <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>
         </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>
index dc75c61..3be51d2 100644 (file)
@@ -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
index e14af0b..817053c 100644 (file)
@@ -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);
index 09e3502..30451cf 100644 (file)
@@ -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.