Open Kastle
Open Kastle

Reputation: 427

Running an executable from a different working directory using ant

Is it possible to run an executable from ant using a working directory other than the one which contains the executable? This small ant project demonstrates what I'm trying to achieve.

Folder structure

ant test
|   build.xml
|   bin
|   |   debug
|   |   |    program.exe
|   |   release
|   |   |    program.exe
|   |   inputs
|   |   |    ...
|   |   outputs
|   |   |    ...

build.xml

<project name="test" basedir="./">    
    <target name="run">
        <exec executable="${configuration}\program.exe" dir="bin"/> 
    </target>
</project>

${configuration} is set to release.

bin needs to be the working directory so the executable can reference files in inputs and outputs correctly, so I want to be able to run the executable contained in bin/release from the bin directory. However, ant fails to find the executable:

BUILD FAILED
D:\ant test\build.xml:6: Execute failed: java.io.IOException: Cannot run program "release\program.exe" (in directory "D:\ant test\bin"): CreateProcess error=2, The system cannot find the file specified

I am able to work around this on windows by launching cmd.exe in the bin directory and then passing it the parameter release\program.exe, but I need to be able to use the ant file on multiple platforms, so I was hoping to find a consistent syntax.

One option I considered was using conditional tasks and having separate syntaxes for windows and unix. However, in the actual project, the exec statement occurs inside a macro, and the target calls the macro a large number of times. Since conditions can only affect things at the target level, I would have to duplicate the long list of macro calls for each syntax I wanted to target, e.g.

<target name="runAll" depends="runAll-win,runAll-unix"/>

<target name"runAll-win" if="win">
    <myMacro-win .../>
    <!-- Huge list of macro calls -->
    ...
    <myMacro-win .../>
</target>

<target name"runAll-unix" if="unix">
    <myMacro-unix .../>
    <!-- Huge list of macro calls -->
    ...
    <myMacro-unix .../>
</target>

Upvotes: 2

Views: 4657

Answers (1)

M A
M A

Reputation: 72884

The dir attribute specifies the working directory but the executable path is resolved against the project basedir. Hence the task will search for the executable D:\ant test\release\program.exe.

A simple solution is to add resolveexecutable="true" to the task call:

<target name="run">
    <exec executable="${configuration}\program.exe" dir="bin" resolveexecutable="true" /> 
</target>

From the exec task documentation:

When this attribute is true, the name of the executable is resolved firstly against the project basedir and if that does not exist, against the execution directory if specified. On Unix systems, if you only want to allow execution of commands in the user's path, set this to false. since Ant 1.6

Upvotes: 5

Related Questions