diff options
author | Xavier Ducrohet <xav@android.com> | 2010-06-25 15:11:17 -0700 |
---|---|---|
committer | Xavier Ducrohet <xav@android.com> | 2010-06-28 12:18:41 -0700 |
commit | 5aea83e90d706a4f14082be562d9d310f171e8c2 (patch) | |
tree | 35ab2d7d57de63b0903f5549d27b26a54df772bb /anttasks/src | |
parent | 44673277a64b2360218d0cb4f1fdaeaebdde7f62 (diff) | |
download | sdk-5aea83e90d706a4f14082be562d9d310f171e8c2.zip sdk-5aea83e90d706a4f14082be562d9d310f171e8c2.tar.gz sdk-5aea83e90d706a4f14082be562d9d310f171e8c2.tar.bz2 |
Support for aidl files in library project in the Ant build system.
Change-Id: I3e36e6f4db60d3d979b24c2b88d496f453394127
Diffstat (limited to 'anttasks/src')
-rw-r--r-- | anttasks/src/com/android/ant/AaptExecLoopTask.java | 5 | ||||
-rw-r--r-- | anttasks/src/com/android/ant/AidlExecTask.java | 129 | ||||
-rw-r--r-- | anttasks/src/com/android/ant/TaskHelper.java | 3 |
3 files changed, 135 insertions, 2 deletions
diff --git a/anttasks/src/com/android/ant/AaptExecLoopTask.java b/anttasks/src/com/android/ant/AaptExecLoopTask.java index f93a208..3e24295 100644 --- a/anttasks/src/com/android/ant/AaptExecLoopTask.java +++ b/anttasks/src/com/android/ant/AaptExecLoopTask.java @@ -26,9 +26,12 @@ import java.io.File; import java.util.ArrayList; /** - * Task able to run an Exec task on aapt several times. + * Task to execute aapt. + * * <p>It does not follow the exec task format, instead it has its own parameters, which maps * directly to aapt.</p> + * <p>It is able to run aapt several times if library setup requires generating several + * R.java files. * <p>The following map shows how to use the task for each supported aapt command line * parameter.</p> * diff --git a/anttasks/src/com/android/ant/AidlExecTask.java b/anttasks/src/com/android/ant/AidlExecTask.java new file mode 100644 index 0000000..862d745 --- /dev/null +++ b/anttasks/src/com/android/ant/AidlExecTask.java @@ -0,0 +1,129 @@ +/* + * 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; + +/** + * 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 AidlExecTask extends Task { + + private String mExecutable; + private String mFramework; + private String mGenFolder; + private final ArrayList<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 Path createSource() { + Path p = new Path(getProject()); + mPaths.add(p); + return p; + } + + @Override + public void execute() throws BuildException { + if (mFramework == null) { + throw new BuildException("AidlExecTask's framework is required."); + } + if (mGenFolder == null) { + throw new BuildException("AidlExecTask's genFolder 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)); + } + } + + // now loop on all the source folders to find all the aidl 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("**/*.aidl"); + + // loop through the results of the file set + Iterator<?> iter = fs.iterator(); + while (iter.hasNext()) { + Object next = iter.next(); + + ExecTask task = new ExecTask(); + task.setProject(taskProject); + task.setOwningTarget(getOwningTarget()); + task.setExecutable(mExecutable); + task.setFailonerror(true); + + task.createArg().setValue("-p" + mFramework); + task.createArg().setValue("-o" + mGenFolder); + // add all the source folders as import in case an aidl file in a source folder + // imports a parcelable from another source folder. + for (String importFolder : sourceFolders) { + task.createArg().setValue("-I" + importFolder); + } + + task.createArg().setValue(next.toString()); + + // execute it. + task.execute(); + } + } + } +} diff --git a/anttasks/src/com/android/ant/TaskHelper.java b/anttasks/src/com/android/ant/TaskHelper.java index b79d274..22cfb30 100644 --- a/anttasks/src/com/android/ant/TaskHelper.java +++ b/anttasks/src/com/android/ant/TaskHelper.java @@ -84,7 +84,8 @@ final class TaskHelper { static String checkSinglePath(String attribute, Path path) { String[] paths = path.list(); if (paths.length != 1) { - throw new BuildException(String.format("Path value for '%1$s' is not valid.", attribute)); + throw new BuildException(String.format( + "Value for '%1$s' is not valid. It must resolve to a single path", attribute)); } return paths[0]; |