1

I have an existing Ant script that calls MakeNSIS and successfully creates an installer file. I want the output path to be changed within Ant, and then passed along to NSIS. Currently, I have tried calling NSIS in this way:

    <exec executable="${nsis_exe.dir}/makensis.exe">
        <arg value="${installer.dir}/installer.nsi" />
        <arg value="/DTEST=myvalue"/>
        <arg value="/DBUILD_VERSION_LABEL=${build.version.label}"/>
    </exec>

But I have not been able to retrieve this value in the nsi file. I cannot use this solution because I want to use the parameter in the File command, which requires a symbol, not a variable, to work correctly.

I'm using the following in my nsi file:

DetailPrint ${TEST}
DetailPrint ${DTEST}
DetailPrint ${BUILD_VERSION_LABEL}
File /r "C:\DTU\Build\${BUILD_VERSION_LABEL}\*" 

And the errors I receive are:

[exec] warning: unknown variable/constant "{TEST}" detected, ignoring (../Solution/third_party/NSIS_Build/dtu_installer.nsi:184)
[exec] DetailPrint: "${TEST}"
[exec] warning: unknown variable/constant "{DTEST}" detected, ignoring (../Solution/third_party/NSIS_Build/dtu_installer.nsi:185)
[exec] DetailPrint: "${DTEST}"
[exec] warning: unknown variable/constant "{BUILD_VERSION_LABEL}" detected, ignoring (../Solution/third_party/NSIS_Build/dtu_installer.nsi:186)
[exec] DetailPrint: "${BUILD_VERSION_LABEL}"
[exec] File: Returning to: "C:\DTU\Build\${BUILD_VERSION_LABEL}"
[exec] File: "C:\DTU\Build\${BUILD_VERSION_LABEL}\*" -> no files found.

Any ideas what I could use or what I'm doing wrong?

Community
  • 1
  • 1
codemonkey
  • 203
  • 2
  • 12

2 Answers2

1

The issue I had was the order of my arguments. I had the following in my ANT script:

<exec executable="${nsis_exe.dir}/makensis.exe">
        <arg value="${installer.dir}/installer.nsi" />
        <arg value="/DTEST=myvalue"/>
        <arg value="/DBUILD_VERSION_LABEL=${build.version.label}"/>
</exec>

But apparently I cannot see the /D parameters in the nsi file this way. If I change it so the nsi file is the last parameter, it works:

<exec executable="${nsis_exe.dir}/makensis.exe">
        <arg value="/DTEST=myvalue"/>
        <arg value="/DBUILD_VERSION_LABEL=${build.version.label}"/>
        <arg value="${installer.dir}/installer.nsi" />
</exec>

Then I can access the parameters in the nsi file as I was:

DetailPrint ${TEST}
DetailPrint ${BUILD_VERSION_LABEL}
File /r "C:\DTU\Build\${BUILD_VERSION_LABEL}\*"
codemonkey
  • 203
  • 2
  • 12
0

Ant properties don't work outside of the build.xml file. If you want these values in your nsi file you can create a template file, and then copy that template file to your nsi while using <filterset/> and <filter/> entities. This will replace the parameters with the values you've specified:

nsi Template File

DetailPrint @TEST@
DetailPrint @DTEST@
DetailPrint @BUILD_VERSION_LABEL@
File /r "C:\DTU\Build\@BUILD_VERSION_LABEL@\*" 

Then copy over your nsi template like this:

<copy file="${NSI.TEMPLATE.DIR}/${NSI.TEMPLATE.FILE}"
     tofile="${NSI.DIR}/${NSI.FILE}">
     <filterset>
         <filter token="TEST"                 value="${TEST}"/>
         <filter token="DTEST"                value="${DTEST}"/>
         <filter token="BUILD_VERSION_LABEL"  value="${BUILD_VERSION_LABEL}"/>
     </filterset>
</copy>

Now, you can execute your command using the newly copied nsi file. Make sure you've defined your various Ant properties such as ${TEST} and ${DTEST}.


Addendum

You can use <concat/> to build your file. It might be easier because you won't need to first create a template, and then copy the template with <filterset>:

<target name="build.nsi.file">
    <concat destfile="${NSI.file}">DetailPrint ${TEST}
DetailPrint ${DTEST}
DetailPrint ${BUILD_VERSION_LABEL}
File /r "C:\DTU\Build\${BUILD_VERSION_LABEL}\*"
</concat>
</target>
David W.
  • 105,218
  • 39
  • 216
  • 337
  • This is a good solution, but I was hoping for something cleaner. Are command line arguments inaccessible in the NSI file? – codemonkey Apr 02 '14 at 14:35
  • The command line arguments are passed to Ant for execution, and if the parameter begins with `-D`, are considered Ant properties which are unavailable outside of Ant's Java execution. You can pass them as parameters as you were doing, or you can use `` to replace tokens in a file. You can also use `` to build your file from scratch. This way, you don't have to have a template file. See Addendum above. – David W. Apr 02 '14 at 18:48
  • Actually, I was referring to the command line arguments passed to makensis.exe. If I pass -D arguments to makensis, how can I access these in the NSI file? – codemonkey Apr 02 '14 at 18:56
  • You can't except by building the `makensis.exx` command like you do and passing them as `/D` parameters to that command. You had that in your OP. Then, it's up to NSI to use the `/D` parameters in that `nsi` file. – David W. Apr 02 '14 at 20:01