0
votes

Sample nsis script:

(--helpers.nsh--)
!define CreateSymbolicLinkFolder "!insertmacro CreateSymbolicLinkFolder"
!ifdef CreateSymbolicLinkFolder_   ; <--- always false
    Function CreateSymbolicLinkFolderFunc
        Exch $0   ; _TARGET
        Exch 1
        Exch $1   ; _JUNCTION
        IfFileExists "$0" 0 done
        ${GetParent} "$1" $R0
        CreateDirectory "$R0"
        System::Call "kernel32::CreateSymbolicLinkW(w `$1`, w `$0`, i 1) i .s"
        done:
        Pop $R0
        Pop $1
        Pop $0
    FunctionEnd
!endif
!macro CreateSymbolicLinkFolder _JUNCTION _TARGET
    !define CreateSymbolicLinkFolder_   ; <--- not work...
    Push "${_JUNCTION}"
    Push "${_TARGET}"
    Call CreateSymbolicLinkFolderFunc
!macroend

(--sample.nsi--)
!include "helpers.nsh"
...
Function Clean
    ${CreateSymbolicLinkFolder} "$APPDATA\SOMEPATH" "$EXEDIR\Data"
FunctionEnd
Section "Main"
    Call Clean
SectionEnd

Nsis error:
Error: resolving install function "CreateSymbolicLinkFolderFunc" in function "Clean"
Note: uninstall functions must begin with "un.", and install functions must not

How can i define CreateSymbolicLinkFolder_ correctly in macro CreateSymbolicLinkFolder?
The "!ifdef CreateSymbolicLinkFolder_" code is to avoid nsis warning, when i don't need to call the macro CreateSymbolicLinkFolder:
install function "CreateSymbolicLinkFolder_" not referenced - zeroing code

1

1 Answers

0
votes

Part one of your question is of course a bit hard to answer when you don't show us the functions in the error message!

The second part should be obvious, you define CreateSymbolicLinkFolder_ before the !ifdef CreateSymbolicLinkFolder_ check so it is always going to be true and the Function will always exist so if you don't call it you will get a warning.

You should rewrite it like this:

!include Util.nsh
!include FileFunc.nsh

!macro CreateSymbolicLinkFolderImplementation
Exch $0   ; _TARGET
Exch 1
Exch $1   ; _JUNCTION
IfFileExists "$0" 0 done
${GetParent} "$1" $R0
CreateDirectory "$R0"
System::Call "kernel32::CreateSymbolicLinkW(w `$1`, w `$0`, i 1) i .s"
done:
Pop $R0
Pop $1
Pop $0
!macroend
!macro CreateSymbolicLinkFolder _JUNCTION _TARGET
Push "${_JUNCTION}"
Push "${_TARGET}"
${CallArtificialFunction} CreateSymbolicLinkFolderImplementation
!macroend
!define CreateSymbolicLinkFolder "!insertmacro CreateSymbolicLinkFolder"

Section
${CreateSymbolicLinkFolder} "c:\foo" "c:\bar"
SectionEnd