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