master
cmake 84 lines 3.69 KB
Raw
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()