1
2MACRO(MAKE_WIX_IDENTIFIER str varname)
3  STRING(REPLACE "/" "." ${varname} "${str}")
4  STRING(REGEX REPLACE "[^a-zA-Z_0-9.]" "_" ${varname} "${${varname}}")
5  STRING(LENGTH "${${varname}}" len)
6  # Identifier should be smaller than 72 character
7  # We have to cut down the length to 70 chars, since we add 2 char prefix
8  # pretty often
9  IF(len GREATER 70)
10     MATH(EXPR diff "${len}-67")
11     STRING(SUBSTRING "${${varname}}" ${diff} 67 shortstr)
12     SET(${varname} "___${shortstr}")
13  ENDIF()
14ENDMACRO()
15
16SET($ENV{VS_UNICODE_OUTPUT} "")
17
18FOREACH(third_party ${WITH_THIRD_PARTY})
19  INCLUDE(${SRCDIR}/${third_party}.cmake)
20
21  # Check than above script produced ${third_party}.wxi and ${third_party}_feature.wxi
22  FOREACH(outfile ${third_party}.wxi ${third_party}_feature.wxi)
23    IF(NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/${outfile})
24      MESSAGE(FATAL_ERROR
25       "${SRCDIR}/${third_party}.cmake did not produce "
26       "${CMAKE_CURRENT_BINARY_DIR}/${outfile}"
27      )
28    ENDIF()
29  ENDFOREACH()
30ENDFOREACH()
31
32
33IF(CMAKE_SIZEOF_VOID_P EQUAL 8)
34  SET(CANDLE_ARCH -arch x64)
35  SET(Win64 " Win64='yes'")
36  SET(Platform x64)
37  SET(PlatformProgramFilesFolder ProgramFiles64Folder)
38  SET(CA_QUIET_EXEC CAQuietExec64)
39ELSE()
40  SET(CANDLE_ARCH -arch x86)
41  SET(Platform x86)
42  SET(PlatformProgramFilesFolder ProgramFilesFolder)
43  SET(CA_QUIET_EXEC CAQuietExec)
44  SET(Win64)
45ENDIF()
46
47SET(ENV{VS_UNICODE_OUTPUT})
48
49INCLUDE(${TOP_BINDIR}/CPackConfig.cmake)
50
51IF(CPACK_WIX_CONFIG)
52  INCLUDE(${CPACK_WIX_CONFIG})
53ENDIF()
54
55IF(NOT CPACK_WIX_UI)
56  SET(CPACK_WIX_UI "MyWixUI_Mondo")
57ENDIF()
58
59IF(CMAKE_INSTALL_CONFIG_NAME)
60  STRING(REPLACE "${CMAKE_CFG_INTDIR}" "${CMAKE_INSTALL_CONFIG_NAME}"
61    WIXCA_LOCATION "${WIXCA_LOCATION}")
62  SET(CONFIG_PARAM "-DCMAKE_INSTALL_CONFIG_NAME=${CMAKE_INSTALL_CONFIG_NAME}")
63ENDIF()
64
65SET(COMPONENTS_ALL "${CPACK_COMPONENTS_ALL}")
66FOREACH(comp ${COMPONENTS_ALL})
67 SET(ENV{DESTDIR} testinstall/${comp})
68 EXECUTE_PROCESS(
69  COMMAND ${CMAKE_COMMAND} ${CONFIG_PARAM} -DCMAKE_INSTALL_COMPONENT=${comp}
70   -DCMAKE_INSTALL_PREFIX=  -P ${TOP_BINDIR}/cmake_install.cmake
71   OUTPUT_QUIET
72
73  )
74  # Exclude empty install components
75  SET(INCLUDE_THIS_COMPONENT 1)
76  SET(MANIFEST_FILENAME "${TOP_BINDIR}/install_manifest_${comp}.txt")
77  IF(EXISTS ${MANIFEST_FILENAME})
78    FILE(READ ${MANIFEST_FILENAME} content)
79    STRING(LENGTH "${content}" content_length)
80    IF (content_length EQUAL 0)
81      MESSAGE(STATUS "Excluding empty component ${comp}")
82      SET(INCLUDE_THIS_COMPONENT 0)
83    ENDIF()
84  ENDIF()
85  IF(NOT INCLUDE_THIS_COMPONENT)
86    LIST(REMOVE_ITEM CPACK_COMPONENTS_ALL "${comp}")
87  ELSE()
88    SET(DIRS ${DIRS} testinstall/${comp})
89  ENDIF()
90ENDFOREACH()
91
92SET(WIX_FEATURES)
93FOREACH(comp ${CPACK_COMPONENTS_ALL})
94 STRING(TOUPPER "${comp}" comp_upper)
95 IF(NOT CPACK_COMPONENT_${comp_upper}_GROUP)
96   SET(WIX_FEATURE_${comp_upper}_COMPONENTS "${comp}")
97   SET(CPACK_COMPONENT_${comp_upper}_HIDDEN 1)
98   SET(CPACK_COMPONENT_GROUP_${comp_upper}_DISPLAY_NAME
99      ${CPACK_COMPONENT_${comp_upper}_DISPLAY_NAME})
100   SET(CPACK_COMPONENT_GROUP_${comp_upper}_DESCRIPTION
101      ${CPACK_COMPONENT_${comp_upper}_DESCRIPTION})
102   SET(CPACK_COMPONENT_GROUP_${comp_upper}_WIX_LEVEL
103      ${CPACK_COMPONENT_${comp_upper}_WIX_LEVEL})
104   SET(WIX_FEATURES ${WIX_FEATURES} WIX_FEATURE_${comp_upper})
105 ELSE()
106   SET(FEATURE_NAME WIX_FEATURE_${CPACK_COMPONENT_${comp_upper}_GROUP})
107   SET(WIX_FEATURES ${WIX_FEATURES} ${FEATURE_NAME})
108   LIST(APPEND ${FEATURE_NAME}_COMPONENTS ${comp})
109 ENDIF()
110ENDFOREACH()
111
112IF(WIX_FEATURES)
113  LIST(REMOVE_DUPLICATES WIX_FEATURES)
114ENDIF()
115
116SET(CPACK_WIX_FEATURES)
117
118FOREACH(f ${WIX_FEATURES})
119 STRING(TOUPPER "${f}" f_upper)
120 STRING(REPLACE "WIX_FEATURE_" "" f_upper ${f_upper})
121 IF (CPACK_COMPONENT_GROUP_${f_upper}_DISPLAY_NAME)
122  SET(TITLE ${CPACK_COMPONENT_GROUP_${f_upper}_DISPLAY_NAME})
123 ELSE()
124  SET(TITLE  CPACK_COMPONENT_GROUP_${f_upper}_DISPLAY_NAME)
125 ENDIF()
126
127 IF (CPACK_COMPONENT_GROUP_${f_upper}_DESCRIPTION)
128  SET(DESCRIPTION ${CPACK_COMPONENT_GROUP_${f_upper}_DESCRIPTION})
129 ELSE()
130  SET(DESCRIPTION CPACK_COMPONENT_GROUP_${f_upper}_DESCRIPTION)
131 ENDIF()
132 IF(CPACK_COMPONENT_${f_upper}_WIX_LEVEL)
133   SET(Level ${CPACK_COMPONENT_${f_upper}_WIX_LEVEL})
134 ELSE()
135   SET(Level 1)
136 ENDIF()
137 IF(CPACK_COMPONENT_GROUP_${f_upper}_HIDDEN)
138   SET(DISPLAY "Display='hidden'")
139   SET(TITLE ${f_upper})
140   SET(DESCRIPTION ${f_upper})
141 ELSE()
142   SET(DISPLAY)
143   IF(CPACK_COMPONENT_GROUP_${f_upper}_EXPANDED)
144    SET(DISPLAY "Display='expand'")
145   ENDIF()
146   IF (CPACK_COMPONENT_GROUP_${f_upper}_DISPLAY_NAME)
147    SET(TITLE ${CPACK_COMPONENT_GROUP_${f_upper}_DISPLAY_NAME})
148   ELSE()
149     SET(TITLE  CPACK_COMPONENT_GROUP_${f_upper}_DISPLAY_NAME)
150   ENDIF()
151   IF (CPACK_COMPONENT_GROUP_${f_upper}_DESCRIPTION)
152     SET(DESCRIPTION ${CPACK_COMPONENT_GROUP_${f_upper}_DESCRIPTION})
153   ELSE()
154     SET(DESCRIPTION CPACK_COMPONENT_GROUP_${f_upper}_DESCRIPTION)
155   ENDIF()
156 ENDIF()
157
158 SET(CPACK_WIX_FEATURES
159 "${CPACK_WIX_FEATURES}
160   <Feature  Id='${f_upper}'
161     Title='${TITLE}'
162     Description='${DESCRIPTION}'
163     ConfigurableDirectory='INSTALLDIR'
164     AllowAdvertise='no'
165     Level='${Level}' ${DISPLAY} >"
166  )
167 FOREACH(c ${${f}_COMPONENTS})
168
169   STRING(TOUPPER "${c}" c_upper)
170   IF (CPACK_COMPONENT_${c_upper}_DISPLAY_NAME)
171    SET(TITLE ${CPACK_COMPONENT_${c_upper}_DISPLAY_NAME})
172   ELSE()
173    SET(TITLE CPACK_COMPONENT_${c_upper}_DISPLAY_NAME)
174   ENDIF()
175
176   IF (CPACK_COMPONENT_${c_upper}_DESCRIPTION)
177     SET(DESCRIPTION ${CPACK_COMPONENT_${c_upper}_DESCRIPTION})
178   ELSE()
179     SET(DESCRIPTION CPACK_COMPONENT_${c_upper}_DESCRIPTION)
180   ENDIF()
181   IF(CPACK_COMPONENT_${c_upper}_WIX_LEVEL)
182    SET(Level ${CPACK_COMPONENT_${c_upper}_WIX_LEVEL})
183   ELSE()
184    SET(Level 1)
185   ENDIF()
186   MAKE_WIX_IDENTIFIER("${c}" cg)
187
188   IF(CPACK_COMPONENT_${c_upper}_HIDDEN)
189   SET(CPACK_WIX_FEATURES
190   "${CPACK_WIX_FEATURES}
191     <ComponentGroupRef Id='componentgroup.${cg}'/>")
192   ELSE()
193   SET(CPACK_WIX_FEATURES
194   "${CPACK_WIX_FEATURES}
195    <Feature Id='${c}'
196       Title='${TITLE}'
197       Description='${DESCRIPTION}'
198       ConfigurableDirectory='INSTALLDIR'
199       AllowAdvertise='no'
200       Level='${Level}'>
201       <ComponentGroupRef Id='componentgroup.${cg}'/>
202    </Feature>")
203  ENDIF()
204
205  ENDFOREACH()
206  IF(${f}_EXTRA_FEATURES)
207  FOREACH(extra_feature ${${f}_EXTRA_FEATURES})
208    SET(CPACK_WIX_FEATURES
209       "${CPACK_WIX_FEATURES}
210       <FeatureRef Id='${extra_feature}' />
211	   ")
212  ENDFOREACH()
213  ENDIF()
214  SET(CPACK_WIX_FEATURES
215   "${CPACK_WIX_FEATURES}
216   </Feature>
217   ")
218ENDFOREACH()
219
220
221
222MACRO(GENERATE_GUID VarName)
223 EXECUTE_PROCESS(COMMAND uuidgen -c
224 OUTPUT_VARIABLE ${VarName}
225 OUTPUT_STRIP_TRAILING_WHITESPACE)
226ENDMACRO()
227
228
229FUNCTION(TRAVERSE_FILES dir topdir file file_comp  dir_root)
230  FILE(GLOB all_files ${dir}/*)
231  IF(NOT all_files)
232    RETURN()
233  ENDIF()
234  FILE(RELATIVE_PATH dir_rel ${topdir} ${dir})
235  IF(dir_rel)
236   MAKE_DIRECTORY(${dir_root}/${dir_rel})
237   MAKE_WIX_IDENTIFIER("${dir_rel}" id)
238   SET(DirectoryRefId  "D.${id}")
239  ELSE()
240   SET(DirectoryRefId "INSTALLDIR")
241  ENDIF()
242  FILE(APPEND ${file} "<DirectoryRef Id='${DirectoryRefId}'>\n")
243
244  SET(NONEXEFILES)
245  FOREACH(f ${all_files})
246    IF(NOT IS_DIRECTORY ${f})
247      FILE(RELATIVE_PATH rel ${topdir} ${f})
248      MAKE_WIX_IDENTIFIER("${rel}" id)
249      FILE(TO_NATIVE_PATH ${f} f_native)
250      GET_FILENAME_COMPONENT(f_ext "${f}" EXT)
251      GET_FILENAME_COMPONENT(name "${f}" NAME)
252
253      IF(name STREQUAL ".empty")
254        # Create an empty directory
255        GENERATE_GUID(guid)
256        FILE(APPEND ${file} "  <Component Id='C.${id}' Guid='${guid}' ${Win64}> <CreateFolder/> </Component>\n")
257        FILE(APPEND ${file_comp} "<ComponentRef Id='C.${id}'/>\n")
258      ELSEIF(NOT ${file}.COMPONENT_EXCLUDE)
259        FILE(APPEND ${file} "  <Component Id='C.${id}' Guid='*' ${Win64} >\n")
260        IF(${id}.COMPONENT_CONDITION)
261          FILE(APPEND ${file} "    <Condition>${${id}.COMPONENT_CONDITION}</Condition>\n")
262        ENDIF()
263        FILE(APPEND ${file} "    <File Id='F.${id}' KeyPath='yes' Source='${f_native}'")
264        IF(${id}.FILE_EXTRA)
265          FILE(APPEND ${file} ">\n${${id}.FILE_EXTRA}</File>")
266        ELSE()
267          FILE(APPEND ${file} "/>\n")
268        ENDIF()
269        FILE(APPEND ${file} "  </Component>\n")
270        FILE(APPEND ${file_comp} "  <ComponentRef Id='C.${id}'/>\n")
271      ENDIF()
272    ENDIF()
273  ENDFOREACH()
274  FILE(APPEND ${file} "</DirectoryRef>\n")
275  IF(NONEXEFILES)
276    GENERATE_GUID(guid)
277    SET(ComponentId "C._files_${COMP_NAME}.${DirectoryRefId}")
278    MAKE_WIX_IDENTIFIER("${ComponentId}" ComponentId)
279    FILE(APPEND ${file}
280    "<DirectoryRef Id='${DirectoryRefId}'>\n<Component Guid='${guid}'
281   Id='${ComponentId}' ${Win64}>${NONEXEFILES}\n</Component></DirectoryRef>\n")
282    FILE(APPEND ${file_comp} "  <ComponentRef Id='${ComponentId}'/>\n")
283  ENDIF()
284  FOREACH(f ${all_files})
285    IF(IS_DIRECTORY ${f})
286      TRAVERSE_FILES(${f} ${topdir} ${file} ${file_comp}  ${dir_root})
287    ENDIF()
288  ENDFOREACH()
289ENDFUNCTION()
290
291FUNCTION(TRAVERSE_DIRECTORIES dir topdir file prefix)
292  FILE(RELATIVE_PATH rel ${topdir} ${dir})
293  IF(rel)
294    IF (IS_DIRECTORY "${f}")
295      MAKE_WIX_IDENTIFIER("${rel}" id)
296      GET_FILENAME_COMPONENT(name ${dir} NAME)
297      FILE(APPEND ${file} "${prefix}<Directory Id='D.${id}' Name='${name}'>\n")
298    ENDIF()
299  ENDIF()
300  FILE(GLOB all_files ${dir}/*)
301    FOREACH(f ${all_files})
302    IF(IS_DIRECTORY ${f})
303      TRAVERSE_DIRECTORIES(${f} ${topdir} ${file} "${prefix}  ")
304    ENDIF()
305  ENDFOREACH()
306  IF(rel)
307    IF(IS_DIRECTORY "${f}")
308      FILE(APPEND ${file} "${prefix}</Directory>\n")
309    ENDIF()
310  ENDIF()
311ENDFUNCTION()
312
313SET(CPACK_WIX_COMPONENTS)
314SET(CPACK_WIX_COMPONENT_GROUPS)
315GET_FILENAME_COMPONENT(abs . ABSOLUTE)
316
317FOREACH(d ${DIRS})
318  GET_FILENAME_COMPONENT(d ${d} ABSOLUTE)
319  GET_FILENAME_COMPONENT(d_name ${d} NAME)
320
321  MAKE_WIX_IDENTIFIER("${d_name}" d_name)
322  FILE(WRITE ${abs}/${d_name}_component_group.wxs
323  "<ComponentGroup Id='componentgroup.${d_name}'>")
324  SET(COMP_NAME ${d_name})
325  TRAVERSE_FILES(${d} ${d} ${abs}/${d_name}.wxs
326    ${abs}/${d_name}_component_group.wxs "${abs}/dirs")
327  FILE(APPEND  ${abs}/${d_name}_component_group.wxs   "</ComponentGroup>")
328  IF(EXISTS ${d_name}.wxs)
329    FILE(READ ${d_name}.wxs WIX_TMP)
330    SET(CPACK_WIX_COMPONENTS "${CPACK_WIX_COMPONENTS}\n${WIX_TMP}")
331    FILE(REMOVE ${d_name}.wxs)
332  ENDIF()
333
334  FILE(READ ${d_name}_component_group.wxs WIX_TMP)
335
336  SET(CPACK_WIX_COMPONENT_GROUPS "${CPACK_WIX_COMPONENT_GROUPS}\n${WIX_TMP}")
337  FILE(REMOVE ${d_name}_component_group.wxs)
338ENDFOREACH()
339
340FILE(WRITE directories.wxs "<DirectoryRef Id='INSTALLDIR'>\n")
341TRAVERSE_DIRECTORIES(${abs}/dirs ${abs}/dirs directories.wxs "")
342FILE(APPEND directories.wxs "</DirectoryRef>\n")
343
344FILE(READ directories.wxs CPACK_WIX_DIRECTORIES)
345FILE(REMOVE directories.wxs)
346
347
348FOREACH(src ${CPACK_WIX_INCLUDE})
349SET(CPACK_WIX_INCLUDES
350"${CPACK_WIX_INCLUDES}
351 <?include ${src}?>"
352)
353ENDFOREACH()
354
355
356CONFIGURE_FILE(${SRCDIR}/mysql_server.wxs.in
357 ${CMAKE_CURRENT_BINARY_DIR}/mysql_server.wxs)
358CONFIGURE_FILE(${SRCDIR}/extra.wxs.in
359  ${CMAKE_CURRENT_BINARY_DIR}/extra.wxs)
360
361SET(EXTRA_CANDLE_ARGS "$ENV{EXTRA_CANDLE_ARGS}")
362
363SET(EXTRA_LIGHT_ARGS -cc . -reusecab)
364IF("$ENV{EXTRA_LIGHT_ARGS}")
365  SET(EXTRA_LIGHT_ARGS "$ENV{EXTRA_LIGHT_ARGS}")
366ENDIF()
367
368FILE(REMOVE mysql_server.wixobj extra.wixobj)
369STRING(REPLACE " " ";" EXTRA_WIX_PREPROCESSOR_FLAGS_LIST ${EXTRA_WIX_PREPROCESSOR_FLAGS})
370EXECUTE_PROCESS(
371 COMMAND ${CANDLE_EXECUTABLE}
372 ${EXTRA_WIX_PREPROCESSOR_FLAGS_LIST}
373 ${CANDLE_ARCH}
374 -ext WixUtilExtension
375 -ext WixFirewallExtension
376 mysql_server.wxs
377 ${EXTRA_CANDLE_ARGS}
378)
379
380EXECUTE_PROCESS(
381 COMMAND ${CANDLE_EXECUTABLE} ${CANDLE_ARCH}
382 ${EXTRA_WIX_PREPROCESSOR_FLAGS_LIST}
383 -ext WixUtilExtension
384 -ext WixFirewallExtension
385 ${CMAKE_CURRENT_BINARY_DIR}/extra.wxs
386 ${EXTRA_CANDLE_ARGS}
387)
388
389IF(VCRedist_MSM)
390  SET(SILENCE_VCREDIST_MSM_WARNINGS  -sice:ICE82 -sice:ICE03)
391ENDIF()
392
393EXECUTE_PROCESS(
394 COMMAND ${LIGHT_EXECUTABLE} -v -ext WixUIExtension -ext WixUtilExtension
395  -ext WixFirewallExtension -sice:ICE61 ${SILENCE_VCREDIST_MSM_WARNINGS}
396  mysql_server.wixobj  extra.wixobj -out  ${CPACK_PACKAGE_FILE_NAME}.msi
397  ${EXTRA_LIGHT_ARGS}
398)
399
400IF(SIGNCODE)
401  SEPARATE_ARGUMENTS(SIGNTOOL_PARAMETERS WINDOWS_COMMAND "${SIGNTOOL_PARAMETERS}")
402  EXECUTE_PROCESS(
403  COMMAND ${SIGNTOOL_EXECUTABLE} sign ${SIGNTOOL_PARAMETERS}
404  /d ${CPACK_PACKAGE_FILE_NAME}.msi
405  ${CPACK_PACKAGE_FILE_NAME}.msi
406)
407ENDIF()
408CONFIGURE_FILE(${CPACK_PACKAGE_FILE_NAME}.msi
409 ${TOP_BINDIR}/${CPACK_PACKAGE_FILE_NAME}.msi
410  COPYONLY)
411
412