On Jan 2, 2008 4:03 PM, Francisco Tolmasky <[EMAIL PROTECTED]> wrote:
> I am running into a problem when outputing files using an identity
> mapper, since sometimes the
> relative paths don't exist. For example, I use GCC in ant as so:
>
> <apply executable = "gcc" dest = "whatever" >
>
> <targetfile/>
> <srcfile/>
>
> <fileset refid = "Sources" />
> <identitymapper/>
>
> </apply>
>
> When I run this, if there is a file in "Sources" such as "Directory/
> Directory/A", I get that
> "whatever/Directory/Directory" doesn't exist, and rightfully so.
> However, is there any way to just
> have these intermediary directories created for me? Or some "create
> every possible directory"
> task I can use?
I've run into this issue too, a while back. What I did to solve it was
to create my own <apply> which derived from Ant's own <apply>, adding
the directory-creation logic just-in-time. That involves some
coding/compiling/packaging, which may or not be an issue for you, but
it works. --DD
package whatever;
import java.io.File;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.taskdefs.ExecuteOn;
/**
* Wrapper around Ant's <apply> that creates target directories.
*/
public class Apply extends ExecuteOn {
/**
* Construct the command line for serial execution,
* creating any necessary output directories.
*
* @param srcFile The filename to add to the commandline
* @param baseDir filename is relative to this dir
* @return the serial command line
*
* @see #createDestinationDirectory
*/
protected String[] getCommandline(String srcFile, File baseDir) {
// Done in parallel's getCommandline, but done here too just in case
createDestinationDirectory(srcFile);
return super.getCommandline(srcFile, baseDir);
}
/**
* Construct the command line for parallel execution.
*
* @param srcFiles The filenames to add to the commandline
* @param baseDirs filenames are relative to this dir
* @return the parallel command line
*
* @see #createDestinationDirectory
*/
protected String[] getCommandline(String[] srcFiles, File[] baseDirs) {
for (int i = 0; i < srcFiles.length; ++i) {
createDestinationDirectory(srcFiles[i]);
}
return super.getCommandline(srcFiles, baseDirs);
}
/**
* Creates the destination directories for a given source file.
* <p>
* If a [EMAIL PROTECTED] #setDest destination directory} and a
* [EMAIL PROTECTED] #createMapper filename mapper} have been specified, the
* target files' destination directories are created.
*
* @param srcFile the source file's relative filename.
* @throws BuildException if a destination directory could not be created.
*/
protected void createDestinationDirectory(String srcFile) {
if (this.mapper == null || this.destDir == null) {
return;
}
String[] targets = this.mapper.mapFileName(srcFile);
if (targets == null || targets.length < 1) {
return;
}
for (int i = 0; i < targets.length; ++i) {
String target = targets[i];
File targetFile = new File(this.destDir, target);
File destination = targetFile.getParentFile();
if (!destination.exists()) {
log("Creating dest. dir: " + destination, Project.MSG_DEBUG);
if (!destination.mkdirs()) {
throw new BuildException("Cannot create dest. dir " +
destination + " of source file " + srcFile);
}
}
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]