From b80c5256cc847910b420f51d49048a228ebacb9b Mon Sep 17 00:00:00 2001 From: AnHeuermann <38031952+AnHeuermann@users.noreply.github.com> Date: Fri, 17 Nov 2023 16:27:35 +0100 Subject: [PATCH 1/5] Uninstall User's Guide link --- OpenModelicaSetup.nsi | 1 + 1 file changed, 1 insertion(+) diff --git a/OpenModelicaSetup.nsi b/OpenModelicaSetup.nsi index 1545c62..5ce6f45 100644 --- a/OpenModelicaSetup.nsi +++ b/OpenModelicaSetup.nsi @@ -340,6 +340,7 @@ Section "Uninstall" Delete "$SMPROGRAMS\$R1\Documentation\OpenModelica - MetaProgramming Guide.pdf.lnk" Delete "$SMPROGRAMS\$R1\Documentation\OpenModelica - Modelica Tutorial by Peter Fritzson.pdf.lnk" Delete "$SMPROGRAMS\$R1\Documentation\OpenModelica - System Guide.pdf.lnk" + Delete "$SMPROGRAMS\$R1\Documentation\OpenModelica - Users Guide.lnk" Delete "$SMPROGRAMS\$R1\Documentation\OpenModelica - Users Guide.pdf.lnk" RMDir "$SMPROGRAMS\$R1\Documentation" Delete "$SMPROGRAMS\$R1\PySimulator\README.lnk" From 909cc8067d57e97e171f7af77b486aeb9fa81d26 Mon Sep 17 00:00:00 2001 From: AnHeuermann <38031952+AnHeuermann@users.noreply.github.com> Date: Mon, 27 Nov 2023 18:05:38 +0100 Subject: [PATCH 2/5] Build installer with CMake build of OM --- BuildWindowsRelease.sh | 2 +- OpenModelicaSetup.nsi | 72 ++++++++++++++++++++++++---------------- README.md | 74 +++++++++++++++++++++++++++++++++++++++++- 3 files changed, 118 insertions(+), 30 deletions(-) diff --git a/BuildWindowsRelease.sh b/BuildWindowsRelease.sh index 3f9f966..0a22817 100644 --- a/BuildWindowsRelease.sh +++ b/BuildWindowsRelease.sh @@ -185,7 +185,7 @@ make -f Makefile.omdev.mingw omsimulator # build the installer cd /c/dev/${OM_ENCRYPT}OM${PLATFORM}/OMSetup rm -rf OMLibraries.nsh -if ! makensis //DPLATFORMVERSION="${PLATFORM::-3}" //DOMVERSION="${REVISION_SHORT}" //DPRODUCTVERSION=${PRODUCT_VERSION} OpenModelicaSetup.nsi > trace.txt 2>&1 ; then +if ! makensis //DPLATFORMVERSION="${PLATFORM::-3}" //DOMVERSION="${REVISION_SHORT}" //DPRODUCTVERSION=${PRODUCT_VERSION} //DOPENMODELICASOURCEDIR=/c/dev/${OM_ENCRYPT}OM${PLATFORM} //DOPENMODELICAHOME="${OPENMODELICAHOME}" //DMSYSTEM="${MSYSTEM}" OpenModelicaSetup.nsi > trace.txt 2>&1 ; then cat trace.txt exit 1 fi diff --git a/OpenModelicaSetup.nsi b/OpenModelicaSetup.nsi index 5ce6f45..7b18c6d 100644 --- a/OpenModelicaSetup.nsi +++ b/OpenModelicaSetup.nsi @@ -15,6 +15,18 @@ Unicode true !error "Argument PRODUCTVERSION is not set. Call with argument /DPRODUCTVERSION=OpenModelica version" !endif +!ifndef OPENMODELICASOURCEDIR + !error "Argument OPENMODELICASOURCEDIR is not set. Call with argument /DOPENMODELICASOURCEDIR=c:\path\to\OpenModelica" +!endif + +!ifndef OPENMODELICAHOME + !error "Argument OPENMODELICAHOME is not set. Call with argument /DOPENMODELICAHOME=c:\path\to\OpenModelica\build_cmake\install_cmake" +!endif + +!ifndef MSYSTEM + !error "Argument MSYSTEM is not set. Call with argument /DMSYSTEM=UCRT64" +!endif + Name OpenModelica${OMVERSION}-${PLATFORMVERSION}bit # General Symbol Definitions @@ -114,10 +126,10 @@ Section "OpenModelica Core" Section1 SetOverwrite on # Create bin directory and copy files in it SetOutPath "\\?\$INSTDIR\bin" - File "..\build\bin\*" - File "..\OSMC-License.txt" + File "${OPENMODELICAHOME}\bin\*" + File "${OPENMODELICASOURCEDIR}\OSMC-License.txt" # Copy the openssl binaries -!if ${PLATFORMVERSION} == "32" +!if PLATFORMVERSION == "32" File "bin\32bit\libeay32.dll" File "bin\32bit\libssl32.dll" File "bin\32bit\ssleay32.dll" @@ -127,43 +139,47 @@ Section "OpenModelica Core" Section1 File "bin\64bit\ssleay32.dll" !endif # Copy the qt plugins - File /r /x "*.svn" "$%OMDEV%\tools\msys\mingw${PLATFORMVERSION}\share\qt5\plugins\*" + File /r /x "*.svn" "$%OMDEV%\tools\msys\${MSYSTEM}\share\qt5\plugins\*" # Create the bin\osgPlugins-3.6.5 directory SetOutPath "\\?\$INSTDIR\bin\osgPlugins-3.6.5" - File /r /x "*.svn" "$%OMDEV%\tools\msys\mingw${PLATFORMVERSION}\bin\osgPlugins-3.6.5\*" + File /r /x "*.svn" "$%OMDEV%\tools\msys\${MSYSTEM}\bin\osgPlugins-3.6.5\*" # Create bin\ffi directory and copy files in it SetOutPath "\\?\$INSTDIR\bin\ffi" - File "..\build\bin\ffi\*" -!if /FILEEXISTS "..\build\bin\omc-semla\*.*" + File "${OPENMODELICAHOME}\bin\ffi\*" +!if /FILEEXISTS "${OPENMODELICAHOME}\bin\omc-semla\*.*" # Create bin\omc-semla directory and copy files in it SetOutPath "\\?\$INSTDIR\bin\omc-semla" - File /r "..\build\bin\omc-semla\*" + File /r "${OPENMODELICAHOME}\bin\omc-semla\*" !endif # Create icons directory and copy files in it SetOutPath "\\?\$INSTDIR\icons" File /r /x "*.svn" "icons\*" - File "..\OMEdit\OMEditLIB\Resources\icons\omedit.ico" - File "..\OMOptim\OMOptim\GUI\Resources\omoptim.ico" - File "..\OMPlot\OMPlot\OMPlotGUI\Resources\icons\omplot.ico" - File "..\OMShell\OMShell\OMShellGUI\Resources\omshell.ico" - File "..\OMNotebook\OMNotebook\OMNotebookGUI\Resources\OMNotebook_icon.ico" + File "${OPENMODELICASOURCEDIR}\OMEdit\OMEditLIB\Resources\icons\omedit.ico" + File "${OPENMODELICASOURCEDIR}\OMOptim\OMOptim\GUI\Resources\omoptim.ico" + File "${OPENMODELICASOURCEDIR}\OMPlot\OMPlot\OMPlotGUI\Resources\icons\omplot.ico" + File "${OPENMODELICASOURCEDIR}\OMShell\OMShell\OMShellGUI\Resources\omshell.ico" + File "${OPENMODELICASOURCEDIR}\OMNotebook\OMNotebook\OMNotebookGUI\Resources\OMNotebook_icon.ico" # Create include\omc directory and copy files in it SetOutPath "\\?\$INSTDIR\include\omc" - File /r /x "*.svn" "..\build\include\omc\*" + File /r /x "*.svn" "${OPENMODELICAHOME}\include\omc\*" # Create lib\omc directory and copy files in it SetOutPath "\\?\$INSTDIR\lib\omc" - File /r /x "*.svn" /x "*.git" "..\build\lib\omc\*" + File /r /x "*.svn" /x "*.git" "${OPENMODELICAHOME}\lib\omc\*" +!if /FILEEXISTS "${OPENMODELICAHOME}\lib\python\*" # Create lib\python directory and copy files in it SetOutPath "\\?\$INSTDIR\lib\python" - File /r /x "*.svn" /x "*.git" "..\build\lib\python\*" + File /r /x "*.svn" /x "*.git" "${OPENMODELICAHOME}\lib\python\*" +!endif # Create tools directory and copy files in it SetOutPath "\\?\$INSTDIR\tools" # copy the setup file / readme +!if /FILEEXISTS "$%OMDEV%\tools\MSYS_SETUP.bat" File "$%OMDEV%\tools\MSYS_SETUP*" +!endif # Create msys directory and copy files in it SetOutPath "\\?\$INSTDIR\tools\msys" -!if ${PLATFORMVERSION} == "32" - File /r /x "mingw64" /x "group" /x "passwd" /x "pacman.log" /x "tmp\*.*" /x "*.pyc" /x "libQt5*.*" \ +!if PLATFORMVERSION == "32" + File /r /x "${MSYSTEM::-2}64" /x "group" /x "passwd" /x "pacman.log" /x "tmp" /x "*.pyc" /x "libQt5*.*" \ /x "moc.exe" /x "qt*.qch" /x "Qt5*.dll" /x "libwx*.*" /x "libgtk*.*" /x "qtcreator" /x "rcc.exe" \ /x "testcon.exe" /x "libsicu*.*" /x "libicu*.*" /x "wx*.dll" /x "libosg*.*" /x "Adwaita" /x "OpenSceneGraph" /x "gtk-doc" \ /x "poppler" /x "man" /x "libdbus.*" /x "tcl*.*" /x "avcodec*.*" /x "windeployqt.exe" /x "python3.5" /x "mingw_osg*.*" \ @@ -181,7 +197,7 @@ Section "OpenModelica Core" Section1 /x "osgVolume" /x "osgWidget" /x "clang-cl.exe" /x "clang-check.exe" /x "llvm-lto2.exe" /x "doc" \ "$%OMDEV%\tools\msys\*" !else - File /r /x "mingw32" /x "group" /x "passwd" /x "pacman.log" /x "tmp\*.*" /x "*.pyc" /x "libQt5*.*" \ + File /r /x "${MSYSTEM::-2}32" /x "group" /x "passwd" /x "pacman.log" /x "tmp" /x "*.pyc" /x "libQt5*.*" \ /x "moc.exe" /x "qt*.qch" /x "Qt5*.dll" /x "libwx*.*" /x "libgtk*.*" /x "qtcreator" /x "rcc.exe" \ /x "testcon.exe" /x "libsicu*.*" /x "libicu*.*" /x "wx*.dll" /x "libosg*.*" /x "Adwaita" /x "OpenSceneGraph" /x "gtk-doc" \ /x "poppler" /x "man" /x "libdbus.*" /x "tcl*.*" /x "avcodec*.*" /x "windeployqt.exe" /x "python3.5" /x "mingw_osg*.*" \ @@ -201,14 +217,14 @@ Section "OpenModelica Core" Section1 !endif # Create share directory and copy files in it SetOutPath "\\?\$INSTDIR\share" - File /r /x "*.svn" /x "*.git" "..\build\share\*" + File /r /x "*.svn" /x "*.git" "${OPENMODELICAHOME}\share\*" # Copy the OpenModelica web page & users guide url shortcut SetOutPath "\\?\$INSTDIR\share\doc\omc" - File "..\doc\OpenModelica Project Online.url" - File "..\doc\OpenModelicaUsersGuide.url" + File "${OPENMODELICASOURCEDIR}\doc\OpenModelica Project Online.url" + File "${OPENMODELICASOURCEDIR}\doc\OpenModelicaUsersGuide.url" # Copy OMSens directory SetOutPath "\\?\$INSTDIR\share\OMSens" - File /r /x ".git*" "..\build\share\OMSens\*" + File /r /x ".git*" "${OPENMODELICAHOME}\share\OMSens\*" SectionEnd Section -Main SEC0000 @@ -254,12 +270,12 @@ Section -post SEC0001 Exec '"$INSTDIR\tools\msys\usr\bin\mkgroup.exe" -l -c > $INSTDIR\tools\msys\etc\group' # Rename libeay32.dll and ssleay32.dll as they seem to have issues on some newer Windows versions # https://trac.openmodelica.org/OpenModelica/ticket/5909 https://www.openmodelica.org/forum/default-topic/2944-installation-problems -!if ${PLATFORMVERSION} == "32" - Rename "$INSTDIR\tools\msys\mingw32\bin\libeay32.dll" "$INSTDIR\tools\msys\mingw32\bin\libeay32-O.dll" - Rename "$INSTDIR\tools\msys\mingw32\bin\ssleay32.dll" "$INSTDIR\tools\msys\mingw32\bin\ssleay32-O.dll" +!if PLATFORMVERSION == "32" + Rename "$INSTDIR\tools\msys\${MSYSTEM}\bin\libeay32.dll" "$INSTDIR\tools\msys\${MSYSTEM}\bin\libeay32-O.dll" + Rename "$INSTDIR\tools\msys\${MSYSTEM}\bin\ssleay32.dll" "$INSTDIR\tools\msys\${MSYSTEM}\bin\ssleay32-O.dll" !else - Rename "$INSTDIR\tools\msys\mingw64\bin\libeay32.dll" "$INSTDIR\tools\msys\mingw64\bin\libeay32-O.dll" - Rename "$INSTDIR\tools\msys\mingw64\bin\ssleay32.dll" "$INSTDIR\tools\msys\mingw64\bin\ssleay32-O.dll" + Rename "$INSTDIR\tools\msys\${MSYSTEM}\bin\libeay32.dll" "$INSTDIR\tools\msys\${MSYSTEM}\bin\libeay32-O.dll" + Rename "$INSTDIR\tools\msys\${MSYSTEM}\bin\ssleay32.dll" "$INSTDIR\tools\msys\${MSYSTEM}\bin\ssleay32-O.dll" !endif # do post installation actions WriteRegStr SHCTX "${REGKEY}" Path $INSTDIR diff --git a/README.md b/README.md index b06b0cd..7839611 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,79 @@ OpenModelica Windows installer based on [NSIS](https://nsis.sourceforge.io/Main_ ## Dependencies -- [NSIS](https://nsis.sourceforge.io/Main_Page) + - [NSIS 3.0.4](https://nsis.sourceforge.io/Main_Page) + - [git](https://git-scm.com/) + - [OMDev](https://gitlab.liu.se/OpenModelica/OMDevUCRT) + - [SignTool](https://learn.microsoft.com/en-us/windows/win32/seccrypto/signtool), + part of + [Microsoft Windows Software Development Kit](https://developer.microsoft.com/en-us/windows/downloads/windows-sdk/). + +## Build Windows installer + +### Environment variables + +You'll need to export all tools to `PATH` environment variable in your MSYS2 UCRT64 shell +`%OMDEV%\tools\msys\ucrt64.exe`: + +```bash +export PATH=$PATH:/c/Program\ Files/Git/bin +export PATH=$PATH:/c/Program\ Files\ \(x86\)/NSIS/Bin +``` + +Also make sure to set environment variables + + - `OMDEV`, e.g. `c:\\OMDev` + - `OPENMODELICAHOME`, e.g. `d:\\path\\to\\OpenModelica\\build_cmake\\install_cmake` + - `OPENMODELICALIBRARY`, e.g. `d:\\path\\to\\OpenModelica\\build_cmake\\install_cmake\\lib\\omlibrary` + +with Windows style paths using `\`. + +Build: + + - OpenModelica + - OpenModelica libraries + - OMPython + - OMSimulator + - OMSens + +Download the the HTML and PDF versions of OpenModelica User's Guide: + +```bash +cd ${OPENMODELICAHOME}/share/doc/omc +wget --no-check-certificate https://openmodelica.org/doc/openmodelica-doc-latest.tar.xz +tar -xJf openmodelica-doc-latest.tar.xz --strip-components=2 +rm openmodelica-doc-latest.tar.xz +wget --no-check-certificate https://openmodelica.org/doc/OpenModelicaUsersGuide/OpenModelicaUsersGuide-latest.pdf +``` + +## Run NSIS + +Start `%OMDEV%\tools\msys\ucrt64.exe` or `%OMDEV%\tools\msys\mingw64.exe` and run: + +```bash +export PLATFORM="64" # 64 or 32 bit +export OPENMODELICA_SOURCE_DIR="d:\\path\\to\\OpenModelica" +export REVISION_SHORT=`cd $OPENMODELICASOURCEDIR; git describe --match "v*.*" --always --abbrev=0` +export PRODUCT_VERSION="${REVISION_SHORT:1}" + +makensis //DPLATFORMVERSION="${PLATFORM}" \ + //DOMVERSION="${REVISION_SHORT}" \ + //DPRODUCTVERSION="${PRODUCT_VERSION}" \ + //DOPENMODELICASOURCEDIR="${OPENMODELICA_SOURCE_DIR}" \ + //DOPENMODELICAHOME="${OPENMODELICAHOME}" \ + //DMSYSTEM="${MSYSTEM}" \ + OpenModelicaSetup.nsi +``` + +## Sign the installer + +To sign the installer you'll need a code-signing certificate (SPC). +See the [doc for more information](https://learn.microsoft.com/en-us/dotnet/framework/tools/signtool-exe). + +```bash +export SIGNTOOL=`find /c/Program\ Files\ \(x86\)/Windows\ Kits/10/ -wholename "*${XPREFIX}/signtool.exe" | tail -1` +"${SIGNTOOL}" sign /n "Me" /f MySPC.pfx /tr "http://timestamp.globalsign.com/tsa/r6advanced1" /a /td SHA256 /v OpenModelica.exe +``` ## Bug Reports From da51590199e4c8330781d37ae23bb0c080fb9e58 Mon Sep 17 00:00:00 2001 From: AnHeuermann <38031952+AnHeuermann@users.noreply.github.com> Date: Wed, 29 Nov 2023 10:09:35 +0100 Subject: [PATCH 3/5] Updating README --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7839611..95100c1 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,8 @@ OpenModelica Windows installer based on [NSIS](https://nsis.sourceforge.io/Main_ ## Dependencies - [NSIS 3.0.4](https://nsis.sourceforge.io/Main_Page) + - Copy `AccessControlW.dll` into your NSIS plugin directory, e.g. into + `C:\Program Files (x86)\NSIS\Plugins\x86-unicode`. - [git](https://git-scm.com/) - [OMDev](https://gitlab.liu.se/OpenModelica/OMDevUCRT) - [SignTool](https://learn.microsoft.com/en-us/windows/win32/seccrypto/signtool), @@ -56,8 +58,12 @@ Start `%OMDEV%\tools\msys\ucrt64.exe` or `%OMDEV%\tools\msys\mingw64.exe` and ru ```bash export PLATFORM="64" # 64 or 32 bit export OPENMODELICA_SOURCE_DIR="d:\\path\\to\\OpenModelica" -export REVISION_SHORT=`cd $OPENMODELICASOURCEDIR; git describe --match "v*.*" --always --abbrev=0` +export REVISION_SHORT=`cd $OPENMODELICA_SOURCE_DIR; git describe --match "v*.*" --always --abbrev=0` export PRODUCT_VERSION="${REVISION_SHORT:1}" +# make a valid VIProductVersion by stripping everything after "-" +BEGIN=${PRODUCT_VERSION/-*/} +PRODUCT_VERSION=${PRODUCT_VERSION::${#BEGIN}} +PRODUCT_VERSION=${PRODUCT_VERSION}.0 makensis //DPLATFORMVERSION="${PLATFORM}" \ //DOMVERSION="${REVISION_SHORT}" \ @@ -68,6 +74,9 @@ makensis //DPLATFORMVERSION="${PLATFORM}" \ OpenModelicaSetup.nsi ``` +> [!NOTE] +> `PRODUCT_VERSION` needs to be in `X.X.X.X` format. + ## Sign the installer To sign the installer you'll need a code-signing certificate (SPC). From 13efd5ec704f1ff7181f0ae62ac0fcba763a7380 Mon Sep 17 00:00:00 2001 From: AnHeuermann <38031952+AnHeuermann@users.noreply.github.com> Date: Wed, 29 Nov 2023 11:20:11 +0100 Subject: [PATCH 4/5] Exclude unused msys shells --- OpenModelicaSetup.nsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenModelicaSetup.nsi b/OpenModelicaSetup.nsi index 72c2a35..3debdd5 100644 --- a/OpenModelicaSetup.nsi +++ b/OpenModelicaSetup.nsi @@ -198,7 +198,7 @@ Section "OpenModelica Core" Section1 "$%OMDEV%\tools\msys\*" !else #64 bit !if ${MSYSRUNTIME} == "ucrt" - File /r /x "mingw32" /x "mingw64" /x "clang64" /x "clang32" /x "group" /x "passwd" /x "pacman.log" /x "tmp\*.*" /x "*.pyc" /x "libQt5*.*" \ + File /r /x "mingw32" /x "mingw64" /x "mingw*.*" /x "clang64" /x "clang32" /x "clang*.*" /x "group" /x "passwd" /x "pacman.log" /x "tmp" /x "home" /x "*.pyc" /x "libQt5*.*" \ /x "moc.exe" /x "qt*.qch" /x "Qt5*.dll" /x "libwx*.*" /x "libgtk*.*" /x "qtcreator" /x "rcc.exe" \ /x "testcon.exe" /x "libsicu*.*" /x "libicu*.*" /x "wx*.dll" /x "libosg*.*" /x "Adwaita" /x "OpenSceneGraph" /x "gtk-doc" \ /x "poppler" /x "man" /x "libdbus.*" /x "tcl*.*" /x "avcodec*.*" /x "windeployqt.exe" /x "python3.5" /x "mingw_osg*.*" \ @@ -216,7 +216,7 @@ Section "OpenModelica Core" Section1 /x "osgVolume" /x "osgWidget" /x "clang-cl.exe" /x "clang-check.exe" /x "llvm-lto2.exe" /x "doc" \ "$%OMDEV%\tools\msys\*" !else # mingw64 - File /r /x "mingw32" /x "ucrt64" /x "clang64" /x "clang32" /x "group" /x "passwd" /x "pacman.log" /x "tmp\*.*" /x "*.pyc" /x "libQt5*.*" \ + File /r /x "mingw32" /x "mingw32.*" /x "ucrt64" /x "ucrt64.*" /x "clang64" /x "clang32" /x "clang*.*" /x "group" /x "passwd" /x "pacman.log" /x "tmp" /x "home" /x "*.pyc" /x "libQt5*.*" \ /x "moc.exe" /x "qt*.qch" /x "Qt5*.dll" /x "libwx*.*" /x "libgtk*.*" /x "qtcreator" /x "rcc.exe" \ /x "testcon.exe" /x "libsicu*.*" /x "libicu*.*" /x "wx*.dll" /x "libosg*.*" /x "Adwaita" /x "OpenSceneGraph" /x "gtk-doc" \ /x "poppler" /x "man" /x "libdbus.*" /x "tcl*.*" /x "avcodec*.*" /x "windeployqt.exe" /x "python3.5" /x "mingw_osg*.*" \ From 89ce7eb2305b4bd472a5643b9077008616615df4 Mon Sep 17 00:00:00 2001 From: AnHeuermann <38031952+AnHeuermann@users.noreply.github.com> Date: Wed, 29 Nov 2023 11:55:05 +0100 Subject: [PATCH 5/5] SignTool optional --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9dec716..5f3c103 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ OpenModelica Windows installer based on [NSIS](https://nsis.sourceforge.io/Main_ `C:\Program Files (x86)\NSIS\Plugins\x86-unicode`. - [git](https://git-scm.com/) - [OMDev](https://gitlab.liu.se/OpenModelica/OMDevUCRT) - - [SignTool](https://learn.microsoft.com/en-us/windows/win32/seccrypto/signtool), + - (optional) [SignTool](https://learn.microsoft.com/en-us/windows/win32/seccrypto/signtool), part of [Microsoft Windows Software Development Kit](https://developer.microsoft.com/en-us/windows/downloads/windows-sdk/). @@ -78,7 +78,7 @@ makensis //DMSYSRUNTIME="${MSYSRUNTIME}" \ > [!NOTE] > `PRODUCT_VERSION` needs to be in `X.X.X.X` format. -## Sign the installer +## Optional: Sign the installer To sign the installer you'll need a code-signing certificate (SPC). See the [doc for more information](https://learn.microsoft.com/en-us/dotnet/framework/tools/signtool-exe).