You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@ant.apache.org by Michael Bolin <bo...@gmail.com> on 2010/02/28 19:45:38 UTC

parameterizing the "error" attribute of an exec task

I am creating a macrodef that calls <exec>. I want to make it possible to
parameterize the "error" attribute by doing something like:

  <macrodef name="closure-compile-with-error">
    <attribute name="outputfile" />
    <attribute name="compilationlevel" default="SIMPLE_OPTIMIZATIONS" />
    <attribute name="outputmode" default="compiled" />
    <attribute name="failonerror" default="true" />
    <attribute name="error" default="" />
    <element name="extraflags" optional="yes" />
    <element name="extrapaths" optional="yes" />
    <sequential>
      <exec executable="python"
            failonerror="@{failonerror}"
            error="@{error}"
            logError="true">
        <arg value="${calcdeps.py}" />
        <arg line='--output_file="@{outputfile}"' />
        <extrapaths />
        <arg line='-p "${closure-library.dir}"' />
        <arg line="-o @{outputmode}" />
        <arg line='-c "${closure-compiler.jar}"' />
        <arg line='-f "--compilation_level=@{compilationlevel}"' />
        <extraflags />
      </exec>
    </sequential>
  </macrodef>

The problem is that by defining an optional attribute:

    <attribute name="error" default="" />

I have to give it a default value, which in this case becomes empty string.
If the caller of <closure-compiler-with-error> does not want to specify
"error", then <exec> ends up trying to write stderr to the current
directory, which fails because it is a directory and not a file. Ideally,
the default value would be "/dev/null" or something like that, but I also
want this to work on Windows.

It seems that this is a more general problem where I only want to include
certain options if they are specified. As you can see, I created
<extraflags> and <extrapaths> to handle that problem in general, but I do
not believe I can do something similar for <exec>, can I?

Thank you,
Michael