Skip to content

Commit 3cd13e0

Browse files
committed
Windows installer
1 parent b50044e commit 3cd13e0

9 files changed

Lines changed: 1422 additions & 9 deletions

File tree

.github/workflows/dls-build-and-test-windows.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ on:
1818
permissions: {}
1919
env:
2020
DLS_REPO_TARGET_DIRECTORY: 'C:\dlstreamer_repo'
21-
DLS_BUILD_DIRECTORY: '$env:TEMP\dlstreamer_tmp\build'
21+
DLS_BUILD_DIRECTORY: 'C:\dlstreamer_repo\build'
2222
DLS_DLL_TARGET_DIRECTORY: 'C:\dlstreamer'
2323
OPENVINO_RUNTIME_DIRECTORY: '$env:LOCALAPPDATA\Programs\openvino\runtime'
2424
GSTREAMER_DIRECTORY: 'C:\Program Files\gstreamer'
@@ -94,6 +94,7 @@ jobs:
9494
shell: powershell
9595
run: |
9696
cd ${{ env.DLS_REPO_TARGET_DIRECTORY }}
97+
$env:NSIS_SKIP_COMPRESSION = "ON"
9798
& ./scripts/build_dlstreamer_dlls.ps1
9899
99100
- name: Copy DLLs

CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,3 +219,7 @@ if(${ENABLE_TESTS} AND NOT(WIN32))
219219
enable_testing()
220220
add_subdirectory(tests)
221221
endif()
222+
223+
if(WIN32)
224+
include(cmake/packaging/windows/cpack_windows.cmake)
225+
endif()

LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
The MIT License
22

3-
Copyright (c) 2018-2019 Intel Corporation
3+
Copyright (c) 2018-2026 Intel Corporation
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal
Lines changed: 337 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,337 @@
1+
# ==============================================================================
2+
# Copyright (C) 2026 Intel Corporation
3+
#
4+
# SPDX-License-Identifier: MIT
5+
# ==============================================================================
6+
7+
; NSIS script template for CPack
8+
; Based on CMake/Modules/Internal/CPack/NSIS.template.in
9+
10+
;--------------------------------
11+
;Defines
12+
13+
!define VERSION "@CPACK_PACKAGE_VERSION@"
14+
!define VERSION_MAJOR "@CPACK_PACKAGE_VERSION_MAJOR@"
15+
!define VERSION_MINOR "@CPACK_PACKAGE_VERSION_MINOR@"
16+
!define VERSION_PATCH "@CPACK_PACKAGE_VERSION_PATCH@"
17+
!define INST_DIR "@CPACK_TEMPORARY_DIRECTORY@"
18+
19+
;--------------------------------
20+
;Includes
21+
22+
!include "MUI2.nsh"
23+
!include "Sections.nsh"
24+
25+
;--------------------------------
26+
;General
27+
28+
;Name and file
29+
Name "@CPACK_NSIS_PACKAGE_NAME@"
30+
OutFile "@CPACK_TOPLEVEL_DIRECTORY@/@CPACK_OUTPUT_FILE_NAME@"
31+
32+
;Default installation folder
33+
InstallDir "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@"
34+
35+
;Set compression
36+
SetCompressor @CPACK_NSIS_COMPRESSOR@
37+
38+
;Require administrator access
39+
RequestExecutionLevel admin
40+
@CPACK_NSIS_DEFINES@
41+
@CPACK_NSIS_DLSTREAMER_DEFINES@
42+
43+
;--- Component support macros: ---
44+
; The code for the add/remove functionality is from:
45+
; https://nsis.sourceforge.io/Add/Remove_Functionality
46+
; It has been modified slightly and extended to provide
47+
; inter-component dependencies.
48+
Var AR_SecFlags
49+
Var AR_RegFlags
50+
@CPACK_NSIS_SECTION_SELECTED_VARS@
51+
52+
; Loads the "selected" flag for the section named SecName into the
53+
; variable VarName.
54+
!macro LoadSectionSelectedIntoVar SecName VarName
55+
SectionGetFlags ${${SecName}} $${VarName}
56+
IntOp $${VarName} $${VarName} & ${SF_SELECTED} ;Turn off all other bits
57+
!macroend
58+
59+
; Loads the value of a variable... can we get around this?
60+
!macro LoadVar VarName
61+
IntOp $R0 0 + $${VarName}
62+
!macroend
63+
64+
; Sets the value of a variable
65+
!macro StoreVar VarName IntValue
66+
IntOp $${VarName} 0 + ${IntValue}
67+
!macroend
68+
69+
!macro InitSection SecName
70+
; This macro reads component installed flag from the registry and
71+
;changes checked state of the section on the components page.
72+
;Input: section index constant name specified in Section command.
73+
74+
ClearErrors
75+
;Reading component status from registry
76+
ReadRegDWORD $AR_RegFlags HKLM "${UNINSTALL_REGISTRY_KEY}" "${SecName}_Installed"
77+
IfErrors "default_${SecName}"
78+
;Status will stay default if registry value not found
79+
;(component was never installed)
80+
IntOp $AR_RegFlags $AR_RegFlags & ${SF_SELECTED} ;Turn off all other bits
81+
SectionGetFlags ${${SecName}} $AR_SecFlags ;Reading default section flags
82+
IntOp $AR_SecFlags $AR_SecFlags & ${SECTION_OFF} ;Turn lowest (selected) bit off
83+
IntOp $AR_SecFlags $AR_RegFlags | $AR_SecFlags ;Change lowest bit
84+
85+
; Note whether this component was installed before
86+
!insertmacro StoreVar ${SecName}_was_installed $AR_RegFlags
87+
88+
;Writing modified flags
89+
SectionSetFlags ${${SecName}} $AR_SecFlags
90+
91+
"default_${SecName}:"
92+
!insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected
93+
!macroend
94+
95+
!macro FinishSection SecName
96+
; This macro reads section flag set by user
97+
;Then it writes component installed flag to registry
98+
;Input: section index constant name specified in Section command.
99+
100+
SectionGetFlags ${${SecName}} $AR_SecFlags ;Reading section flags
101+
IntOp $AR_SecFlags $AR_SecFlags & ${SF_SELECTED} ;Checking lowest bit
102+
WriteRegDWORD HKLM "${UNINSTALL_REGISTRY_KEY}" "${SecName}_Installed" $AR_SecFlags
103+
!macroend
104+
105+
!macro RemoveSection_CPack SecName
106+
; This macro is used to call section's Remove_... macro
107+
;from the uninstaller.
108+
;Input: section index constant name specified in Section command.
109+
110+
;Reading component status from registry
111+
ReadRegDWORD $AR_RegFlags HKLM "${UNINSTALL_REGISTRY_KEY}" "${SecName}_Installed"
112+
IfErrors "remove_${SecName}"
113+
IntOp $AR_RegFlags $AR_RegFlags & ${SF_SELECTED} ;Turn off all other bits
114+
!insertmacro StoreVar ${SecName}_was_installed $AR_RegFlags
115+
"remove_${SecName}:"
116+
!insertmacro "Remove_${${SecName}}"
117+
!macroend
118+
119+
; Determine whether the selection of SecName changed
120+
!macro MaybeSelectionChanged SecName
121+
!insertmacro LoadVar ${SecName}_selected
122+
SectionGetFlags ${${SecName}} $R1
123+
IntOp $R1 $R1 & ${SF_SELECTED} ;Turn off all other bits
124+
125+
; See if the status has changed:
126+
IntCmp $R0 $R1 "${SecName}_unchanged"
127+
!insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected
128+
129+
IntCmp $R1 ${SF_SELECTED} "${SecName}_was_selected"
130+
!insertmacro "Deselect_required_by_${SecName}"
131+
goto "${SecName}_unchanged"
132+
133+
"${SecName}_was_selected:"
134+
!insertmacro "Select_${SecName}_depends"
135+
136+
"${SecName}_unchanged:"
137+
!macroend
138+
;--- End of Add/Remove macros ---
139+
140+
Function ConditionalAddToRegistry
141+
Pop $0
142+
Pop $1
143+
StrCmp "$0" "" ConditionalAddToRegistry_EmptyString
144+
WriteRegStr SHCTX "${UNINSTALL_REGISTRY_KEY}" "$1" "$0"
145+
;MessageBox MB_OK "Set Registry: '$1' to '$0'"
146+
DetailPrint "Set install registry entry: '$1' to '$0'"
147+
ConditionalAddToRegistry_EmptyString:
148+
FunctionEnd
149+
150+
;--------------------------------
151+
; Define some macro setting for the gui
152+
!define MUI_ABORTWARNING
153+
@CPACK_NSIS_INSTALLER_MUI_ICON_CODE@
154+
@CPACK_NSIS_INSTALLER_ICON_CODE@
155+
@CPACK_NSIS_INSTALLER_MUI_WELCOMEFINISH_CODE@
156+
@CPACK_NSIS_INSTALLER_MUI_UNWELCOMEFINISH_CODE@
157+
158+
;--------------------------------
159+
;Pages
160+
!insertmacro MUI_PAGE_WELCOME
161+
@CPACK_NSIS_LICENSE_PAGE@
162+
!insertmacro MUI_PAGE_DIRECTORY
163+
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ${CUSTOMFUNCTION_COMPONENTS_SHOW}
164+
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE ${CUSTOMFUNCTION_COMPONENTS_LEAVE}
165+
!insertmacro MUI_PAGE_COMPONENTS
166+
!insertmacro MUI_PAGE_INSTFILES
167+
!insertmacro MUI_PAGE_FINISH
168+
169+
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ${CUSTOMFUNCTION_CONFIRM_SHOW}
170+
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE ${CUSTOMFUNCTION_CONFIRM_LEAVE}
171+
!insertmacro MUI_UNPAGE_CONFIRM
172+
!insertmacro MUI_UNPAGE_INSTFILES
173+
174+
;--------------------------------
175+
;Languages
176+
!insertmacro MUI_LANGUAGE "English" ;first language is the default language
177+
!insertmacro MUI_LANGUAGE "Afrikaans"
178+
!insertmacro MUI_LANGUAGE "Albanian"
179+
!insertmacro MUI_LANGUAGE "Arabic"
180+
!insertmacro MUI_LANGUAGE "Asturian"
181+
!insertmacro MUI_LANGUAGE "Basque"
182+
!insertmacro MUI_LANGUAGE "Belarusian"
183+
!insertmacro MUI_LANGUAGE "Bosnian"
184+
!insertmacro MUI_LANGUAGE "Breton"
185+
!insertmacro MUI_LANGUAGE "Bulgarian"
186+
!insertmacro MUI_LANGUAGE "Catalan"
187+
!insertmacro MUI_LANGUAGE "Corsican"
188+
!insertmacro MUI_LANGUAGE "Croatian"
189+
!insertmacro MUI_LANGUAGE "Czech"
190+
!insertmacro MUI_LANGUAGE "Danish"
191+
!insertmacro MUI_LANGUAGE "Dutch"
192+
!insertmacro MUI_LANGUAGE "Esperanto"
193+
!insertmacro MUI_LANGUAGE "Estonian"
194+
!insertmacro MUI_LANGUAGE "Farsi"
195+
!insertmacro MUI_LANGUAGE "Finnish"
196+
!insertmacro MUI_LANGUAGE "French"
197+
!insertmacro MUI_LANGUAGE "Galician"
198+
!insertmacro MUI_LANGUAGE "German"
199+
!insertmacro MUI_LANGUAGE "Greek"
200+
!insertmacro MUI_LANGUAGE "Hebrew"
201+
!insertmacro MUI_LANGUAGE "Hungarian"
202+
!insertmacro MUI_LANGUAGE "Icelandic"
203+
!insertmacro MUI_LANGUAGE "Indonesian"
204+
!insertmacro MUI_LANGUAGE "Irish"
205+
!insertmacro MUI_LANGUAGE "Italian"
206+
!insertmacro MUI_LANGUAGE "Japanese"
207+
!insertmacro MUI_LANGUAGE "Korean"
208+
!insertmacro MUI_LANGUAGE "Kurdish"
209+
!insertmacro MUI_LANGUAGE "Latvian"
210+
!insertmacro MUI_LANGUAGE "Lithuanian"
211+
!insertmacro MUI_LANGUAGE "Luxembourgish"
212+
!insertmacro MUI_LANGUAGE "Macedonian"
213+
!insertmacro MUI_LANGUAGE "Malay"
214+
!insertmacro MUI_LANGUAGE "Mongolian"
215+
!insertmacro MUI_LANGUAGE "Norwegian"
216+
!insertmacro MUI_LANGUAGE "NorwegianNynorsk"
217+
!insertmacro MUI_LANGUAGE "Pashto"
218+
!insertmacro MUI_LANGUAGE "Polish"
219+
!insertmacro MUI_LANGUAGE "Portuguese"
220+
!insertmacro MUI_LANGUAGE "PortugueseBR"
221+
!insertmacro MUI_LANGUAGE "Romanian"
222+
!insertmacro MUI_LANGUAGE "Russian"
223+
!insertmacro MUI_LANGUAGE "ScotsGaelic"
224+
!insertmacro MUI_LANGUAGE "Serbian"
225+
!insertmacro MUI_LANGUAGE "SerbianLatin"
226+
!insertmacro MUI_LANGUAGE "SimpChinese"
227+
!insertmacro MUI_LANGUAGE "Slovak"
228+
!insertmacro MUI_LANGUAGE "Slovenian"
229+
!insertmacro MUI_LANGUAGE "Spanish"
230+
!insertmacro MUI_LANGUAGE "SpanishInternational"
231+
!insertmacro MUI_LANGUAGE "Swedish"
232+
!insertmacro MUI_LANGUAGE "Tatar"
233+
!insertmacro MUI_LANGUAGE "Thai"
234+
!insertmacro MUI_LANGUAGE "TradChinese"
235+
!insertmacro MUI_LANGUAGE "Turkish"
236+
!insertmacro MUI_LANGUAGE "Ukrainian"
237+
!insertmacro MUI_LANGUAGE "Uzbek"
238+
!insertmacro MUI_LANGUAGE "Vietnamese"
239+
!insertmacro MUI_LANGUAGE "Welsh"
240+
241+
;--------------------------------
242+
; Installation types
243+
@CPACK_NSIS_INSTALLATION_TYPES@
244+
245+
;--------------------------------
246+
; Component sections
247+
@CPACK_NSIS_COMPONENT_SECTIONS@
248+
@CPACK_NSIS_INSTALLER_MUI_COMPONENTS_DESC@
249+
;--------------------------------
250+
;Installer Sections
251+
252+
Section "-Core installation"
253+
;Use the entire tree produced by the INSTALL target. Keep the
254+
;list of directories here in sync with the RMDir commands below.
255+
SetOutPath "$INSTDIR"
256+
257+
;Store installation folder
258+
WriteRegStr SHCTX "${DLSTREAMER_REGISTRY_KEY}" "InstallDir" $INSTDIR
259+
260+
;Create uninstaller
261+
WriteUninstaller "$INSTDIR\@CPACK_NSIS_UNINSTALL_NAME@.exe"
262+
Push "DisplayName"
263+
Push "@CPACK_NSIS_DISPLAY_NAME@"
264+
Call ConditionalAddToRegistry
265+
Push "DisplayVersion"
266+
Push "@CPACK_PACKAGE_VERSION@"
267+
Call ConditionalAddToRegistry
268+
Push "Publisher"
269+
Push "@CPACK_PACKAGE_VENDOR@"
270+
Call ConditionalAddToRegistry
271+
Push "UninstallString"
272+
Push "$\"$INSTDIR\@CPACK_NSIS_UNINSTALL_NAME@.exe$\""
273+
Call ConditionalAddToRegistry
274+
Push "NoRepair"
275+
Push "1"
276+
Call ConditionalAddToRegistry
277+
Push "NoModify"
278+
Push "1"
279+
Call ConditionalAddToRegistry
280+
Push "DisplayIcon"
281+
Push "$INSTDIR\@CPACK_NSIS_INSTALLED_ICON_NAME@"
282+
Call ConditionalAddToRegistry
283+
Push "QuietUninstallString"
284+
Push "$\"$INSTDIR\@CPACK_NSIS_UNINSTALL_NAME@.exe$\" /S"
285+
Call ConditionalAddToRegistry
286+
287+
${DLSTREAMER_EXTRA_INSTALL_COMMANDS}
288+
SectionEnd
289+
290+
;--- Add/Remove callback functions: ---
291+
!macro SectionList MacroName
292+
;This macro used to perform operation on multiple sections.
293+
;List all of your components in following manner here.
294+
@CPACK_NSIS_COMPONENT_SECTION_LIST@
295+
!macroend
296+
297+
Section -FinishComponents
298+
;Removes unselected components and writes component status to registry
299+
!insertmacro SectionList "FinishSection"
300+
SectionEnd
301+
;--- End of Add/Remove callback functions ---
302+
303+
;--------------------------------
304+
; Component dependencies
305+
Function .onSelChange
306+
!insertmacro SectionList MaybeSelectionChanged
307+
FunctionEnd
308+
309+
${DLSTREAMER_DEPENDENCIES_CHECK}
310+
311+
;--------------------------------
312+
;Uninstaller Section
313+
314+
Section "Uninstall"
315+
${DLSTREAMER_EXTRA_UNINSTALL_COMMANDS}
316+
317+
; Removes all optional components
318+
!insertmacro SectionList "RemoveSection_CPack"
319+
320+
; Remove the uninstaller itself.
321+
Delete "$INSTDIR\@CPACK_NSIS_UNINSTALL_NAME@.exe"
322+
323+
; Remove the installation directory if it is empty.
324+
RMDir "$INSTDIR"
325+
326+
; Remove the registry entries.
327+
DeleteRegKey SHCTX "${UNINSTALL_REGISTRY_KEY}"
328+
DeleteRegKey SHCTX "${DLSTREAMER_REGISTRY_KEY}"
329+
SectionEnd
330+
331+
Function .onInit
332+
${DLSTREAMER_INSTALLER_ONINIT}
333+
FunctionEnd
334+
335+
Function un.onInit
336+
${DLSTREAMER_UNINSTALLER_ONINIT}
337+
FunctionEnd

0 commit comments

Comments
 (0)