Search code examples
nsis

makensis gives error on unix with exact same script that works on windows


I wrote a NSIS installer script that builds fine on Windows, however I need it to build on *nix OSes too. When I run it on OS X I get the following error..

Usage: !define ([/date|/utcdate] symbol [value]) | (/file symbol filename) | (/math symbol val1 OP val2)
    OP=(+ - * / % & | ^)
Error in script "/Users/john/Development/java/vordio/src/main/app-resources/win-installer.nsi" on line 6 -- aborting creation process

This is the line of the script that is failing..

 !define VORDIO_ICON "${PROJECT_DIR}\src\main\app-resources\vordio_logo_64x64_win_icon.ico"

I can't see anything wrong with it but I tried adding /file which didn't help, nor did changing file path separators.

Anyone had this NSIS problem?


Solution

  • !define will print that error if you are passing too many parameters. This can happen if quotes terminates the string early:

    !define bar 'BAR" "oops'
    !define foo "${bar}\baz" ; Expands to !define foo "BAR" "oops\baz"
    

    I assume the problem is related to how you are using -D on the command-line to set PROJECT_DIR. You should not quote the value part (a path in your case), you should quote the entire name=value part. How you do that is controlled by the C library implementation, it is responsible for splitting the command-line into individual arguments (and possibly removing quotes). The official NSIS Windows build uses Visual C++ and it is quite forgiving and allows at least these 5 variations:

    1. makensis "-Dname=value" setup.nsi
    2. makensis -"Dname=value" setup.nsi
    3. makensis -D"name=value" setup.nsi
    4. makensis "-Dname="value"" setup.nsi
    5. makensis -D"name="value"" setup.nsi

    ...and all of these should display

    Command line defined: "name=value"

    because the Microsoft implementation has some crazy quote handling.

    Add !warning ">${PROJECT_DIR}<" to your script and change the way you call makensis until there are no quotes between the angle brackets...