CMakeUserFindWix: Difference between revisions

From KitwarePublic
Jump to navigationJump to search
(Find WIX)
 
No edit summary
Line 1: Line 1:
[[CMake_User_Contributed_Macros|Back]]
[[CMake_User_Contributed_Macros|Back]]
-----
-----
# - Try to find Windows Installer XML
# See http://wix.sourceforge.net
#
# The follwoing variables are optionally searched for defaults
#  WIX_ROOT_DIR:            Base directory of WIX2 tree to use.
#
# The following are set after configuration is done:
#  WIX_FOUND
#  WIX_ROOT_DIR
#  WIX_CANDLE
#  WIX_LIGHT
#
# 2009/02 Petr Pytelka (pyta at lightcomp.cz)
#
MACRO(DBG_MSG _MSG)
#  MESSAGE(STATUS "${CMAKE_CURRENT_LIST_FILE}(${CMAKE_CURRENT_LIST_LINE}):\n ${_MSG}")
ENDMACRO(DBG_MSG)
# typical root dirs of installations, exactly one of them is used
SET (WIX_POSSIBLE_ROOT_DIRS
  "${WIX_ROOT_DIR}"
  "$ENV{WIX_ROOT_DIR}"
  "$ENV{ProgramFiles}/Windows Installer XML"
  )
#DBG_MSG("DBG (WIX_POSSIBLE_ROOT_DIRS=${WIX_POSSIBLE_ROOT_DIRS}")
#
# select exactly ONE WIX base directory/tree
# to avoid mixing different version headers and libs
#
FIND_PATH(WIX_ROOT_DIR
  NAMES
  bin/candle.exe
  bin/light.exe
  PATHS ${WIX_POSSIBLE_ROOT_DIRS})
DBG_MSG("WIX_ROOT_DIR=${WIX_ROOT_DIR}")
#
# Logic selecting required libs and headers
#
SET(WIX_FOUND OFF)
IF(WIX_ROOT_DIR)
  SET(WIX_FOUND ON)
ENDIF(WIX_ROOT_DIR)
# display help message
IF(NOT WIX_FOUND)
  # make FIND_PACKAGE friendly
  IF(NOT WIX_FIND_QUIETLY)
    IF(WIX_FIND_REQUIRED)
      MESSAGE(FATAL_ERROR
        "Windows Installer XML required but some files not found. Please specify it's location with WIX_ROOT_DIR env. variable.")
    ELSE(WIX_FIND_REQUIRED)
      MESSAGE(STATUS
        "ERROR: Windows Installer XML was not found.")
    ENDIF(WIX_FIND_REQUIRED)
  ENDIF(NOT WIX_FIND_QUIETLY)
ELSE(NOT WIX_FOUND)
  SET(WIX_CANDLE ${WIX_ROOT_DIR}/bin/candle.exe)
  SET(WIX_LIGHT ${WIX_ROOT_DIR}/bin/light.exe)
#  MESSAGE(STATUS "Windows Installer XML found.")
ENDIF(NOT WIX_FOUND)
MARK_AS_ADVANCED(
  WIX_ROOT_DIR
  WIX_CANDLE
  WIX_LIGHT
  )
#
# Call wix compiler
#
# Parameters:
#  _sources - name of list with sources
#  _obj - name of list for target objects
#
MACRO(WIX_COMPILE _sources _objs _extra_dep)
  DBG_MSG("WIX compile: ${${_sources}}")
  FOREACH (_current_FILE ${${_sources}})
    GET_FILENAME_COMPONENT(_tmp_FILE ${_current_FILE} ABSOLUTE)
    GET_FILENAME_COMPONENT(_basename ${_tmp_FILE} NAME_WE)
    SET (SOURCE_WIX_FILE ${CMAKE_CURRENT_SOURCE_DIR}/${_current_FILE} )
    DBG_MSG("WIX source file: ${SOURCE_WIX_FILE}")
    # Check whether source exists
    IF(EXISTS ${SOURCE_WIX_FILE})
    ELSE(EXISTS ${SOURCE_WIX_FILE})
      MESSAGE(FATAL_ERROR "Path not exists: ${SOURCE_WIX_FILE}")
    ENDIF(EXISTS ${SOURCE_WIX_FILE})
    SET (OUTPUT_WIXOBJ ${_basename}.wixobj )
    DBG_MSG("WIX output: ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_WIXOBJ}")
    DBG_MSG("WIX command: ${WIX_CANDLE}")
    ADD_CUSTOM_COMMAND(
      OUTPUT    ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_WIXOBJ}
      COMMAND  ${WIX_CANDLE}
      ARGS      ${WIX_CANDLE_FLAGS} ${SOURCE_WIX_FILE}
      DEPENDS  ${SOURCE_WIX_FILE} ${${_extra_dep}}
      COMMENT  "Compiling ${SOURCE_WIX_FILE} -> ${OUTPUT_WIXOBJ}"
    )
    SET(${_objs} ${${_objs}} ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_WIXOBJ} )
    DBG_MSG("WIX compile output: ${${_objs}}")
  ENDFOREACH (_current_FILE)
ENDMACRO(WIX_COMPILE)
#
# Call wix compiler
#
# Parameters:
#  _sources - name of list with sources
#  _obj - name of list for target objects
#
MACRO(WIX_COMPILE_ALL _target _sources _extra_dep)
  DBG_MSG("WIX compile all: ${${_sources}}, dependencies: ${${_extra_dep}}")
  ADD_CUSTOM_COMMAND(
      OUTPUT    ${_target}
      COMMAND  ${WIX_CANDLE}
      ARGS      ${WIX_CANDLE_FLAGS} -out "${_target}" ${${_sources}}
      DEPENDS  ${${_sources}} ${${_extra_dep}}
      COMMENT  "Compiling ${${_sources}} -> ${_target}"
    )
ENDMACRO(WIX_COMPILE_ALL)
#
# Link MSI file
#
# Parameters
#  _target - Name of target file
#  _sources - Name of list with sources
#
MACRO(WIX_LINK _target _sources _loc_files)
  DBG_MSG("WIX command: ${WIX_LIGHT}\n WIX target: ${_target} objs: ${${_sources}}")
  SET( WIX_LINK_FLAGS_A "" )
  # Add localization
  FOREACH (_current_FILE ${${_loc_files}})
    SET( WIX_LINK_FLAGS_A ${WIX_LINK_FLAGS_A} -loc "${_current_FILE}" )
    DBG_MSG("WIX link localization: ${_current_FILE}")
  ENDFOREACH (_current_FILE)
  DBG_MSG("WIX link flags: ${WIX_LINK_FLAGS_A}")
  ADD_CUSTOM_COMMAND(
      OUTPUT    ${_target}
      COMMAND  ${WIX_LIGHT}
      ARGS      ${WIX_LINK_FLAGS_A} -out "${_target}" ${${_sources}}
      DEPENDS  ${${_sources}}
      COMMENT  "Linking ${${_sources}} -> ${_target}"
    )
ENDMACRO(WIX_LINK)
-----
-----
[[CMake_User_Contributed_Macros|Back]]
[[CMake_User_Contributed_Macros|Back]]

Revision as of 15:41, 6 March 2009

Back


  1. - Try to find Windows Installer XML
  2. See http://wix.sourceforge.net
  3. The follwoing variables are optionally searched for defaults
  4. WIX_ROOT_DIR: Base directory of WIX2 tree to use.
  5. The following are set after configuration is done:
  6. WIX_FOUND
  7. WIX_ROOT_DIR
  8. WIX_CANDLE
  9. WIX_LIGHT
  10. 2009/02 Petr Pytelka (pyta at lightcomp.cz)

MACRO(DBG_MSG _MSG)

  1. MESSAGE(STATUS "${CMAKE_CURRENT_LIST_FILE}(${CMAKE_CURRENT_LIST_LINE}):\n ${_MSG}")

ENDMACRO(DBG_MSG)


  1. typical root dirs of installations, exactly one of them is used

SET (WIX_POSSIBLE_ROOT_DIRS

 "${WIX_ROOT_DIR}"
 "$ENV{WIX_ROOT_DIR}"
 "$ENV{ProgramFiles}/Windows Installer XML"
 )


  1. DBG_MSG("DBG (WIX_POSSIBLE_ROOT_DIRS=${WIX_POSSIBLE_ROOT_DIRS}")
  1. select exactly ONE WIX base directory/tree
  2. to avoid mixing different version headers and libs

FIND_PATH(WIX_ROOT_DIR

 NAMES 
 bin/candle.exe
 bin/light.exe
 PATHS ${WIX_POSSIBLE_ROOT_DIRS})

DBG_MSG("WIX_ROOT_DIR=${WIX_ROOT_DIR}")


  1. Logic selecting required libs and headers

SET(WIX_FOUND OFF) IF(WIX_ROOT_DIR)

 SET(WIX_FOUND ON)

ENDIF(WIX_ROOT_DIR)


  1. display help message

IF(NOT WIX_FOUND)

 # make FIND_PACKAGE friendly
 IF(NOT WIX_FIND_QUIETLY)
   IF(WIX_FIND_REQUIRED)
     MESSAGE(FATAL_ERROR
       "Windows Installer XML required but some files not found. Please specify it's location with WIX_ROOT_DIR env. variable.")
   ELSE(WIX_FIND_REQUIRED)
     MESSAGE(STATUS 
       "ERROR: Windows Installer XML was not found.")
   ENDIF(WIX_FIND_REQUIRED)
 ENDIF(NOT WIX_FIND_QUIETLY)

ELSE(NOT WIX_FOUND)

 SET(WIX_CANDLE ${WIX_ROOT_DIR}/bin/candle.exe)
 SET(WIX_LIGHT ${WIX_ROOT_DIR}/bin/light.exe)
  1. MESSAGE(STATUS "Windows Installer XML found.")

ENDIF(NOT WIX_FOUND)


MARK_AS_ADVANCED(

 WIX_ROOT_DIR
 WIX_CANDLE
 WIX_LIGHT
 )
  1. Call wix compiler
  2. Parameters:
  3. _sources - name of list with sources
  4. _obj - name of list for target objects

MACRO(WIX_COMPILE _sources _objs _extra_dep)

 DBG_MSG("WIX compile: ${${_sources}}")
 FOREACH (_current_FILE ${${_sources}})
   GET_FILENAME_COMPONENT(_tmp_FILE ${_current_FILE} ABSOLUTE)
   GET_FILENAME_COMPONENT(_basename ${_tmp_FILE} NAME_WE)
   SET (SOURCE_WIX_FILE ${CMAKE_CURRENT_SOURCE_DIR}/${_current_FILE} )
   DBG_MSG("WIX source file: ${SOURCE_WIX_FILE}")
   # Check whether source exists
   IF(EXISTS ${SOURCE_WIX_FILE})
   ELSE(EXISTS ${SOURCE_WIX_FILE})
     MESSAGE(FATAL_ERROR "Path not exists: ${SOURCE_WIX_FILE}")
   ENDIF(EXISTS ${SOURCE_WIX_FILE})
   SET (OUTPUT_WIXOBJ ${_basename}.wixobj )
   DBG_MSG("WIX output: ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_WIXOBJ}")
   DBG_MSG("WIX command: ${WIX_CANDLE}")
   ADD_CUSTOM_COMMAND( 
     OUTPUT    ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_WIXOBJ}
     COMMAND   ${WIX_CANDLE}
     ARGS      ${WIX_CANDLE_FLAGS} ${SOURCE_WIX_FILE}
     DEPENDS   ${SOURCE_WIX_FILE} ${${_extra_dep}}
     COMMENT   "Compiling ${SOURCE_WIX_FILE} -> ${OUTPUT_WIXOBJ}"
   )
   SET(${_objs} ${${_objs}} ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_WIXOBJ} )
   DBG_MSG("WIX compile output: ${${_objs}}")
 ENDFOREACH (_current_FILE)

ENDMACRO(WIX_COMPILE)

  1. Call wix compiler
  2. Parameters:
  3. _sources - name of list with sources
  4. _obj - name of list for target objects

MACRO(WIX_COMPILE_ALL _target _sources _extra_dep)

 DBG_MSG("WIX compile all: ${${_sources}}, dependencies: ${${_extra_dep}}")
 ADD_CUSTOM_COMMAND( 
     OUTPUT    ${_target}
     COMMAND   ${WIX_CANDLE}
     ARGS      ${WIX_CANDLE_FLAGS} -out "${_target}" ${${_sources}}
     DEPENDS   ${${_sources}} ${${_extra_dep}}
     COMMENT   "Compiling ${${_sources}} -> ${_target}"
   )

ENDMACRO(WIX_COMPILE_ALL)


  1. Link MSI file
  2. Parameters
  3. _target - Name of target file
  4. _sources - Name of list with sources

MACRO(WIX_LINK _target _sources _loc_files)

 DBG_MSG("WIX command: ${WIX_LIGHT}\n WIX target: ${_target} objs: ${${_sources}}")
 SET( WIX_LINK_FLAGS_A "" )
 # Add localization
 FOREACH (_current_FILE ${${_loc_files}})
   SET( WIX_LINK_FLAGS_A ${WIX_LINK_FLAGS_A} -loc "${_current_FILE}" )
   DBG_MSG("WIX link localization: ${_current_FILE}")
 ENDFOREACH (_current_FILE)
 DBG_MSG("WIX link flags: ${WIX_LINK_FLAGS_A}")
 ADD_CUSTOM_COMMAND( 
     OUTPUT    ${_target}
     COMMAND   ${WIX_LIGHT}
     ARGS      ${WIX_LINK_FLAGS_A} -out "${_target}" ${${_sources}}
     DEPENDS   ${${_sources}}
     COMMENT   "Linking ${${_sources}} -> ${_target}"
   )

ENDMACRO(WIX_LINK)


Back



CMake: [Welcome | Site Map]