View Issue Details Jump to Notes ] Print ]
IDProjectCategoryView StatusDate SubmittedLast Update
0014925CMakeCPackpublic2014-05-22 09:192016-06-10 14:31
ReporterRichard Ulrich 
Assigned ToNils Gladitz 
PrioritynormalSeverityfeatureReproducibilityalways
StatusclosedResolutionmoved 
PlatformOSOS Version
Product VersionCMake 2.8.12.2 
Target VersionFixed in Version 
Summary0014925: Generate Multilanguage msi files with the WiX generator
DescriptionWhen I first saw that CPACK_WIX_CULTURES accepts a list, I assumed it would build a multilanguage package.
Later I learned, that the behavior comes from WiX itself, that it builds a package for the first culture entry, and uses the others as backup if a certain string is not available for the primary culture.
At first, I read on the WiX Tutorial, that msi packages are always single culture. But then I found out the procedure to make them multilanguage. It's a bit cumbersome:
* build an msi for each culture
* make a diff for each of them
* inject the diffs into the main msi
* tell the msi which cultures it supports

I created a custom target that creates a multilanguage msi for me.
But it would be much nicer, if this could be baked into cpack.
Additional Information# build a separate msi for each of the different supported languages
# generate *.mst (transform) files of the diffs # inject the transforms into the german installer
# http://www.codeproject.com/Articles/103749/Creating-a-Localized-Windows-Installer-Bootstrap [^]
GET_FILENAME_COMPONENT(CPACK_COMMAND ${CMAKE_COMMAND} PATH)
SET(CPACK_COMMAND ${CPACK_COMMAND}/cpack.exe)
FILE(WRITE ${PROJECT_BINARY_DIR}/WixMultiLang.bat "@echo off" \n)
# build the english installer
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat ":: building the installer in english" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "\"${CMAKE_COMMAND}\" -D CPACK_WIX_CULTURES:STRING=en-us \"${PointLine_MAIN_DIR}\"" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "if %ERRORLEVEL% neq 0 goto exit" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "\"${CPACK_COMMAND}\" -G WIX -C RelWithDebInfo" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "if %ERRORLEVEL% neq 0 goto exit" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "del ${CPACK_PACKAGE_NAME}-${VERSION_STR3}-win32_en-us.msi" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "ren ${CPACK_PACKAGE_NAME}-${VERSION_STR3}-win32.msi ${CPACK_PACKAGE_NAME}-${VERSION_STR3}-win32_en-us.msi" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "if %ERRORLEVEL% neq 0 goto exit" \n)
# build the dutch installer
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat ":: building the installer in dutch" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "\"${CMAKE_COMMAND}\" -D CPACK_WIX_CULTURES:STRING=nl-nl \"${PointLine_MAIN_DIR}\"" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "if %ERRORLEVEL% neq 0 goto exit" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "\"${CPACK_COMMAND}\" -G WIX -C RelWithDebInfo" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "if %ERRORLEVEL% neq 0 goto exit" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "del ${CPACK_PACKAGE_NAME}-${VERSION_STR3}-win32_nl-nl.msi" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "ren ${CPACK_PACKAGE_NAME}-${VERSION_STR3}-win32.msi ${CPACK_PACKAGE_NAME}-${VERSION_STR3}-win32_nl-nl.msi" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "if %ERRORLEVEL% neq 0 goto exit" \n)
# build the french installer
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat ":: building the installer in french" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "\"${CMAKE_COMMAND}\" -D CPACK_WIX_CULTURES:STRING=fr-fr \"${PointLine_MAIN_DIR}\"" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "if %ERRORLEVEL% neq 0 goto exit" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "\"${CPACK_COMMAND}\" -G WIX -C RelWithDebInfo" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "if %ERRORLEVEL% neq 0 goto exit" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "del ${CPACK_PACKAGE_NAME}-${VERSION_STR3}-win32_fr-fr.msi" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "ren ${CPACK_PACKAGE_NAME}-${VERSION_STR3}-win32.msi ${CPACK_PACKAGE_NAME}-${VERSION_STR3}-win32_fr-fr.msi" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "if %ERRORLEVEL% neq 0 goto exit" \n)
# build the german installer
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat ":: building the installer in german" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "\"${CMAKE_COMMAND}\" -D CPACK_WIX_CULTURES:STRING=de-de \"${PointLine_MAIN_DIR}\"" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "if %ERRORLEVEL% neq 0 goto exit" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "\"${CPACK_COMMAND}\" -G WIX -C RelWithDebInfo" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "if %ERRORLEVEL% neq 0 goto exit" \n)
# make diffs and generate the transforms
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat ":: generating the transforms from the diffs" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "\"${WIX_TORCH}\" ${CPACK_PACKAGE_NAME}-${VERSION_STR3}-win32.msi ${CPACK_PACKAGE_NAME}-${VERSION_STR3}-win32_en-us.msi -o ${CPACK_PACKAGE_NAME}-${VERSION_STR3}-win32_en-us.mst" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "if %ERRORLEVEL% neq 0 goto exit" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "\"${WIX_TORCH}\" ${CPACK_PACKAGE_NAME}-${VERSION_STR3}-win32.msi ${CPACK_PACKAGE_NAME}-${VERSION_STR3}-win32_nl-nl.msi -o ${CPACK_PACKAGE_NAME}-${VERSION_STR3}-win32_nl-nl.mst" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "if %ERRORLEVEL% neq 0 goto exit" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "\"${WIX_TORCH}\" ${CPACK_PACKAGE_NAME}-${VERSION_STR3}-win32.msi ${CPACK_PACKAGE_NAME}-${VERSION_STR3}-win32_fr-fr.msi -o ${CPACK_PACKAGE_NAME}-${VERSION_STR3}-win32_fr-fr.mst" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "if %ERRORLEVEL% neq 0 goto exit" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "@echo sucessfully generated the language transforms" \n)
# inject the diffs into the german installer
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat ":: injecting the transforms into the german installer" \n)
SET(MSWSWDEVKIT_CSCRIPT cscript.exe) # Windows Script Host
SET(MSWSWDEVKIT_WiSubStg ${PointLine_MAIN_DIR}/Installer/WiX/WiSubStg.vbs) # From Microsoft Windows SDK for Windows
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "\"${MSWSWDEVKIT_CSCRIPT}\" \"${MSWSWDEVKIT_WiSubStg}\" ${CPACK_PACKAGE_NAME}-${VERSION_STR3}-win32.msi ${CPACK_PACKAGE_NAME}-${VERSION_STR3}-win32_en-us.mst 1033" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "if %ERRORLEVEL% neq 0 goto exit" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "\"${MSWSWDEVKIT_CSCRIPT}\" \"${MSWSWDEVKIT_WiSubStg}\" ${CPACK_PACKAGE_NAME}-${VERSION_STR3}-win32.msi ${CPACK_PACKAGE_NAME}-${VERSION_STR3}-win32_nl-nl.mst 1043" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "if %ERRORLEVEL% neq 0 goto exit" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "\"${MSWSWDEVKIT_CSCRIPT}\" \"${MSWSWDEVKIT_WiSubStg}\" ${CPACK_PACKAGE_NAME}-${VERSION_STR3}-win32.msi ${CPACK_PACKAGE_NAME}-${VERSION_STR3}-win32_fr-fr.mst 1036" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "if %ERRORLEVEL% neq 0 goto exit" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "@echo sucessfully injected the language transforms" \n)
# tell the installer, which localizations it contains
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat ":: tell the installer, which localizations it contains" \n)
SET(MSWSWDEVKIT_WiLangId ${PointLine_MAIN_DIR}/Installer/WiX/wilangid.vbs) # From Microsoft Windows SDK for Windows
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "\"${MSWSWDEVKIT_CSCRIPT}\" \"${MSWSWDEVKIT_WiLangId}\" ${CPACK_PACKAGE_NAME}-${VERSION_STR3}-win32.msi Package 1031,1033,1043,1036" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "if %ERRORLEVEL% neq 0 goto exit" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat "@echo sucessfully injected the localization information" \n)
FILE(APPEND ${PROJECT_BINARY_DIR}/WixMultiLang.bat ":exit" \n)

ADD_CUSTOM_TARGET(WiX_LangTransforms
        COMMAND ${PROJECT_BINARY_DIR}/WixMultiLang.bat
        WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
        COMMENT "build the msi for the different supported languages, and generate mst (transform) files of the diffs"
)
TagsNo tags attached.
Attached Files

 Relationships

  Notes
(0038914)
Richard Ulrich (reporter)
2015-06-12 02:23

If the different language specific installers could be built in parallel, It could signifficantly reduce the total build time.
(0042549)
Kitware Robot (administrator)
2016-06-10 14:29

Resolving issue as `moved`.

This issue tracker is no longer used. Further discussion of this issue may take place in the current CMake Issues page linked in the banner at the top of this page.

 Issue History
Date Modified Username Field Change
2014-05-22 09:19 Richard Ulrich New Issue
2014-05-22 09:42 Nils Gladitz Assigned To => Nils Gladitz
2014-05-22 09:42 Nils Gladitz Status new => assigned
2015-06-12 02:23 Richard Ulrich Note Added: 0038914
2016-06-10 14:29 Kitware Robot Note Added: 0042549
2016-06-10 14:29 Kitware Robot Status assigned => resolved
2016-06-10 14:29 Kitware Robot Resolution open => moved
2016-06-10 14:31 Kitware Robot Status resolved => closed


Copyright © 2000 - 2018 MantisBT Team