1
votes

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?

2

2 Answers

1
votes

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}\*"
0
votes

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>