| 1 | function(add_appx_target target binaries manifest_in output_package dependencies) |
| 2 | |
| 3 | set(PACKAGE_LAYOUT "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PLATFORM}/package_layout") |
| 4 | set(MANIFEST "${CMAKE_CURRENT_BINARY_DIR}/AppxManifest.xml") |
| 5 | set(PRI_CONF "${CMAKE_CURRENT_BINARY_DIR}/priconf.xml") |
| 6 | set(OUTPUT_RESOURCES_PRI "${CMAKE_CURRENT_BINARY_DIR}/resources.pri") |
| 7 | |
| 8 | # generate the list of languages for the appxmanifest |
| 9 | set(SUPPORTED_LANGS_MANIFEST_ENTRIES "") |
| 10 | foreach(LANG ${SUPPORTED_LANGS}) |
| 11 | string(TOUPPER "${LANG}" LANG) |
| 12 | set(SUPPORTED_LANGS_MANIFEST_ENTRIES "${SUPPORTED_LANGS_MANIFEST_ENTRIES}\n <Resource Language=\"${LANG}\"/>") |
| 13 | endforeach() |
| 14 | |
| 15 | configure_file(${manifest_in} ${MANIFEST}) |
| 16 | |
| 17 | file(MAKE_DIRECTORY ${PACKAGE_LAYOUT}) |
| 18 | |
| 19 | # images |
| 20 | file(MAKE_DIRECTORY ${PACKAGE_LAYOUT}/Images) |
| 21 | set(RESOURCES_DEPENDENCY) |
| 22 | file(GLOB IMAGES RELATIVE ${PROJECT_SOURCE_DIR}/ "${PROJECT_SOURCE_DIR}/images/*.png") |
| 23 | foreach(e ${IMAGES}) |
| 24 | file(CREATE_LINK ${PROJECT_SOURCE_DIR}/${e} ${PACKAGE_LAYOUT}/${e} SYMBOLIC) |
| 25 | list(APPEND RESOURCES_DEPENDENCY ${PROJECT_SOURCE_DIR}/${e}) |
| 26 | endforeach() |
| 27 | |
| 28 | # Localization. Note: these files aren't added to the resource map, so they aren't added to the package, |
| 29 | # but they are used by makepri to generate resources.pri |
| 30 | file(CREATE_LINK ${PROJECT_SOURCE_DIR}/localization/strings ${PACKAGE_LAYOUT}/Strings SYMBOLIC) |
| 31 | |
| 32 | foreach(binary ${binaries}) |
| 33 | set(BINARY_SRC "${BIN}/${binary}") |
| 34 | set(BINARY_DEST "${PACKAGE_LAYOUT}/${binary}") |
| 35 | add_custom_command( |
| 36 | OUTPUT ${BINARY_DEST} |
| 37 | COMMAND ${CMAKE_COMMAND} -E create_symlink "${BINARY_SRC}" "${BINARY_DEST}" |
| 38 | DEPENDS ${BINARY_SRC} |
| 39 | ) |
| 40 | list(APPEND BINARIES_DEPENDENCY ${BINARY_DEST}) |
| 41 | endforeach() |
| 42 | |
| 43 | # Reduce the output of makeappx unless WSL_APPX_DEBUG is set to make the build output nicer to read |
| 44 | if (WSL_SILENT_APPX_BUILD) |
| 45 | set(COMMAND_SUFFIX "2>NUL;>;NUL") |
| 46 | endif () |
| 47 | |
| 48 | # generate priconf.xml |
| 49 | string(REPLACE ";" "_" SUPPORTED_LANGS_STR "${SUPPORTED_LANGS}") |
| 50 | add_custom_command( |
| 51 | OUTPUT ${PRI_CONF} |
| 52 | COMMAND makepri.exe createconfig /cf ${PRI_CONF} /dq ${SUPPORTED_LANGS_STR} /pv 10.0 /o ${COMMAND_SUFFIX} |
| 53 | COMMAND_EXPAND_LISTS |
| 54 | ) |
| 55 | |
| 56 | # generate resources.pri |
| 57 | add_custom_command( |
| 58 | OUTPUT ${OUTPUT_RESOURCES_PRI} ${CMAKE_CURRENT_BINARY_DIR}/resources.map.txt |
| 59 | COMMAND makepri.exe new /pr ${PACKAGE_LAYOUT} /cf ${PRI_CONF} /of ${OUTPUT_RESOURCES_PRI} /mn ${MANIFEST} /mf AppX /o /IndexOptions +lf ${COMMAND_SUFFIX} |
| 60 | COMMAND_EXPAND_LISTS |
| 61 | DEPENDS ${PRI_CONF} ${MANIFEST} ${BINARIES_DEPENDENCY} ${RESOURCES_DEPENDENCY} # Make sure the package is rebuilt if any of the resources change |
| 62 | ) |
| 63 | |
| 64 | # make appx |
| 65 | add_custom_command( |
| 66 | OUTPUT ${output_package} |
| 67 | COMMAND makeappx.exe pack /m ${MANIFEST} /f ${CMAKE_CURRENT_BINARY_DIR}/resources.map.txt /p ${output_package} /o ${COMMAND_SUFFIX} |
| 68 | COMMAND ${PACKAGE_SIGN_COMMAND} ${output_package} ${COMMAND_SUFFIX} |
| 69 | COMMAND ${CMAKE_COMMAND} -E touch "${CMAKE_CURRENT_BINARY_DIR}/CmakeFiles/${target}" |
| 70 | WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} |
| 71 | COMMAND_EXPAND_LISTS |
| 72 | DEPENDS ${MANIFEST} ${BINARIES_DEPENDENCY} ${OUTPUT_RESOURCES_PRI} ${CMAKE_CURRENT_BINARY_DIR}/resources.map.txt # Make sure the package is rebuilt if any of the binaries or resources change |
| 73 | ) |
| 74 | |
| 75 | add_custom_target(${target} DEPENDS ${output_package}) |
| 76 | |
| 77 | foreach(e ${dependencies}) |
| 78 | add_dependencies(${target} ${e}) |
| 79 | endforeach() |
| 80 | |
| 81 | set_target_properties(${target} PROPERTIES EXCLUDE_FROM_ALL FALSE SOURCES ${manifest_in}) |
| 82 | |
| 83 | set_source_files_properties(${output_package} PROPERTIES GENERATED TRUE) |
| 84 | endfunction() |