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