1include(CMakeParseArguments) 2 3function(find_msvc_crt_msm OUTPUT_VAR) 4 if(${OUTPUT_VAR}) 5 return() 6 endif() 7 8 message(STATUS "Looking for a CRT MSM:") 9 10 if(NOT MSVC_TOOLSET_VERSION) 11 if(MSVC_VERSION GREATER_EQUAL 1920) 12 set(MSVC_TOOLSET_VERSION 142) 13 elseif(MSVC_VERSION GREATER_EQUAL 1910) 14 set(MSVC_TOOLSET_VERSION 141) 15 elseif(MSVC_VERSION GREATER_EQUAL 1900) 16 set(MSVC_TOOLSET_VERSION 140) 17 endif() 18 endif() 19 20 set(MSM_FILE "Microsoft_VC${MSVC_TOOLSET_VERSION}_CRT_${ARCH}.msm") 21 message(STATUS " * File name: ${MSM_FILE}") 22 23 set(VC_DIR "${CMAKE_CXX_COMPILER}") 24 while(VC_DIR AND NOT VC_DIR MATCHES "/VC$") 25 get_filename_component(VC_DIR "${VC_DIR}" DIRECTORY) 26 endwhile() 27 message(STATUS " * VC directory: ${VC_DIR}") 28 29 file(GLOB VC_VER_DIRS "${VC_DIR}/Redist/MSVC/*") 30 message(STATUS " * Redist directories: ${VC_VER_DIRS}") 31 32 set(CMN_PF_DIR "CommonProgramFiles(x86)") 33 find_file(${OUTPUT_VAR} 34 NAMES "${MSM_FILE}" 35 PATHS ${VC_VER_DIRS} $ENV{${CMN_PF_DIR}} 36 PATH_SUFFIXES "MergeModules" "Merge Modules") 37 message(STATUS " * Result: ${${OUTPUT_VAR}}") 38 39 set(${OUTPUT_VAR} "${${OUTPUT_VAR}}" PARENT_SCOPE) 40endfunction() 41 42function(png2ico OUTPUT_FILE) 43 if(NOT IS_ABSOLUTE "${OUTPUT_FILE}") 44 set(OUTPUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE}") 45 endif() 46 47 add_custom_command( 48 OUTPUT "${OUTPUT_FILE}" 49 COMMAND magick convert ${ARGN} "${OUTPUT_FILE}" 50 DEPENDS ${ARGN}) 51 52 list(APPEND ${OUTPUT_VAR} "${OUTPUT_FILE}") 53 set(${OUTPUT_VAR} "${${OUTPUT_VAR}}" PARENT_SCOPE) 54endfunction() 55 56function(wix_heat OUTPUT_FILE SOURCE_DIR CG_NAME DR_NAME VAR_NAME) 57 cmake_parse_arguments(HEAT "" "XSL_TRANSFORM" "" ${ARGN}) 58 59 if(NOT IS_ABSOLUTE "${OUTPUT_FILE}") 60 set(OUTPUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE}") 61 endif() 62 63 set(OPTIONS -nologo -sfrag -ag -srd -indent 2 -cg "${CG_NAME}" -dr "${DR_NAME}" -var "${VAR_NAME}") 64 set(DEPENDS "${SOURCE_DIR}") 65 if(HEAT_XSL_TRANSFORM) 66 if(NOT IS_ABSOLUTE "${HEAT_XSL_TRANSFORM}") 67 set(HEAT_XSL_TRANSFORM "${CMAKE_CURRENT_SOURCE_DIR}/${HEAT_XSL_TRANSFORM}") 68 endif() 69 list(APPEND OPTIONS -t "${HEAT_XSL_TRANSFORM}") 70 list(APPEND DEPENDS "${HEAT_XSL_TRANSFORM}") 71 endif() 72 73 add_custom_command( 74 OUTPUT "${OUTPUT_FILE}" 75 COMMAND heat dir "${SOURCE_DIR}" ${OPTIONS} -out "${OUTPUT_FILE}" 76 DEPENDS ${DEPENDS}) 77 78 list(APPEND ${OUTPUT_VAR} "${OUTPUT_FILE}") 79 set(${OUTPUT_VAR} "${${OUTPUT_VAR}}" PARENT_SCOPE) 80endfunction() 81 82function(wix_candle OUTPUT_VAR) 83 cmake_parse_arguments(CANDLE "" "ARCHITECTURE" "SOURCES;EXTENSIONS;DEFINITIONS;EXTRA_DEPENDS" ${ARGN}) 84 85 set(OPTIONS -nologo -pedantic -arch "${CANDLE_ARCHITECTURE}" "-I${CMAKE_CURRENT_BINARY_DIR}") 86 foreach(X ${CANDLE_EXTENSIONS}) 87 list(APPEND OPTIONS -ext "${X}") 88 endforeach() 89 foreach(X ${CANDLE_DEFINITIONS}) 90 list(APPEND OPTIONS "-d${X}") 91 endforeach() 92 93 foreach(F ${CANDLE_SOURCES}) 94 if(NOT IS_ABSOLUTE "${F}") 95 set(F "${CMAKE_CURRENT_SOURCE_DIR}/${F}") 96 endif() 97 get_filename_component(F_NAME "${F}" NAME) 98 string(REGEX REPLACE "[.]wxs$" "" F_NAME "${F_NAME}") 99 set(CANDLE_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${F_NAME}.wixobj") 100 add_custom_command( 101 OUTPUT "${CANDLE_OUTPUT}" 102 COMMAND candle ${OPTIONS} "${F}" -out "${CANDLE_OUTPUT}" 103 DEPENDS "${F}" ${CANDLE_EXTRA_DEPENDS}) 104 list(APPEND ${OUTPUT_VAR} "${CANDLE_OUTPUT}") 105 endforeach() 106 107 set(${OUTPUT_VAR} "${${OUTPUT_VAR}}" PARENT_SCOPE) 108endfunction() 109 110function(wix_light OUTPUT_VAR) 111 cmake_parse_arguments(LIGHT "" "NAME" "OBJECTS;EXTENSIONS;EXTRA_DEPENDS" ${ARGN}) 112 113 set(OPTIONS -nologo -pedantic -sw1076) 114 foreach(X ${LIGHT_EXTENSIONS}) 115 list(APPEND OPTIONS -ext "${X}") 116 endforeach() 117 118 set(LIGHT_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${LIGHT_NAME}.msi") 119 add_custom_command( 120 OUTPUT ${LIGHT_OUTPUT} 121 BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/${LIGHT_NAME}.wixpdb" 122 COMMAND light ${OPTIONS} -out "${CMAKE_CURRENT_BINARY_DIR}/${LIGHT_NAME}.msi" ${LIGHT_OBJECTS} 123 DEPENDS ${LIGHT_OBJECTS} ${LIGHT_EXTRA_DEPENDS}) 124 125 list(APPEND ${OUTPUT_VAR} ${LIGHT_OUTPUT}) 126 set(${OUTPUT_VAR} "${${OUTPUT_VAR}}" PARENT_SCOPE) 127endfunction() 128