|
| 1 | +# This CMake build file is intended for use with the llvm-mingw toolchain: |
| 2 | +# https://github.com/mstorsjo/llvm-mingw |
| 3 | +# |
| 4 | +# It most probably doesn't work with MSVC. |
| 5 | + |
| 6 | +cmake_minimum_required(VERSION 3.12) |
| 7 | + |
| 8 | +project(cppwinrt LANGUAGES CXX) |
| 9 | + |
| 10 | +set(CMAKE_CXX_STANDARD 17) |
| 11 | +set(CMAKE_CXX_STANDARD_REQUIRED True) |
| 12 | + |
| 13 | +set(CPPWINRT_BUILD_VERSION "2.3.4.5" CACHE STRING "The version string used for cppwinrt.") |
| 14 | +add_compile_definitions(CPPWINRT_VERSION_STRING="${CPPWINRT_BUILD_VERSION}") |
| 15 | + |
| 16 | +# WinMD uses CreateFile2 which requires Windows 8. |
| 17 | +add_compile_definitions(_WIN32_WINNT=0x0602) |
| 18 | + |
| 19 | + |
| 20 | +# === prebuild: Generator tool for strings.cpp, strings.h, version.rc === |
| 21 | + |
| 22 | +set(PREBUILD_SRCS |
| 23 | + prebuild/main.cpp |
| 24 | + prebuild/pch.h |
| 25 | +) |
| 26 | +add_executable(prebuild ${PREBUILD_SRCS}) |
| 27 | +target_include_directories(prebuild PRIVATE cppwinrt/) |
| 28 | + |
| 29 | + |
| 30 | +# === Step to create autogenerated files === |
| 31 | + |
| 32 | +file(GLOB PREBUILD_STRINGS_FILES |
| 33 | + LIST_DIRECTORIES false |
| 34 | + CONFIGURE_DEPENDS |
| 35 | + strings/*.h |
| 36 | +) |
| 37 | +add_custom_command( |
| 38 | + OUTPUT |
| 39 | + ${PROJECT_BINARY_DIR}/strings.cpp |
| 40 | + ${PROJECT_BINARY_DIR}/version.rc |
| 41 | + COMMAND "${PROJECT_BINARY_DIR}/prebuild.exe" ARGS "${PROJECT_SOURCE_DIR}/strings" "${PROJECT_BINARY_DIR}" |
| 42 | + DEPENDS |
| 43 | + prebuild |
| 44 | + ${PREBUILD_STRINGS_FILES} |
| 45 | + VERBATIM |
| 46 | +) |
| 47 | + |
| 48 | + |
| 49 | +# === cppwinrt === |
| 50 | + |
| 51 | +set(CPPWINRT_SRCS |
| 52 | + cppwinrt/main.cpp |
| 53 | + "${PROJECT_BINARY_DIR}/strings.cpp" |
| 54 | +) |
| 55 | + |
| 56 | +set(CPPWINRT_HEADERS |
| 57 | + cppwinrt/pch.h |
| 58 | + cppwinrt/cmd_reader.h |
| 59 | + cppwinrt/code_writers.h |
| 60 | + cppwinrt/component_writers.h |
| 61 | + cppwinrt/file_writers.h |
| 62 | + cppwinrt/helpers.h |
| 63 | + cppwinrt/pch.h |
| 64 | + cppwinrt/settings.h |
| 65 | + cppwinrt/task_group.h |
| 66 | + cppwinrt/text_writer.h |
| 67 | + cppwinrt/type_writers.h |
| 68 | +) |
| 69 | + |
| 70 | +add_custom_command( |
| 71 | + OUTPUT |
| 72 | + "${PROJECT_BINARY_DIR}/app.manifest" |
| 73 | + COMMAND ${CMAKE_COMMAND} -E copy "${PROJECT_SOURCE_DIR}/cppwinrt/app.manifest" "${PROJECT_BINARY_DIR}/app.manifest" |
| 74 | + DEPENDS "${PROJECT_SOURCE_DIR}/cppwinrt/app.manifest" |
| 75 | + VERBATIM |
| 76 | +) |
| 77 | +# Do the configure_file dance so that app.manifest.rc don't get modified every |
| 78 | +# single time the project is reconfigured and trigger a rebuild. |
| 79 | +file(WRITE "${PROJECT_BINARY_DIR}/app.manifest.rc.in" "1 24 \"app.manifest\"\n") |
| 80 | +configure_file( |
| 81 | + "${PROJECT_BINARY_DIR}/app.manifest.rc.in" |
| 82 | + "${PROJECT_BINARY_DIR}/app.manifest.rc" |
| 83 | + COPYONLY |
| 84 | +) |
| 85 | + |
| 86 | +set(CPPWINRT_RESOURCES |
| 87 | + "${PROJECT_BINARY_DIR}/app.manifest" |
| 88 | + "${PROJECT_BINARY_DIR}/app.manifest.rc" |
| 89 | + "${PROJECT_BINARY_DIR}/version.rc" |
| 90 | +) |
| 91 | + |
| 92 | +add_executable(cppwinrt ${CPPWINRT_SRCS} ${CPPWINRT_RESOURCES} ${CPPWINRT_HEADERS}) |
| 93 | +target_include_directories(cppwinrt PRIVATE ${PROJECT_BINARY_DIR}) |
| 94 | +target_link_libraries(cppwinrt shlwapi) |
| 95 | + |
| 96 | + |
| 97 | +# HACK: Handle the xmllite import lib. |
| 98 | +# mingw-w64 before commit 5ac1a2c is missing the import lib for xmllite. This |
| 99 | +# checks whether the current build environment provides libxmllite.a, and |
| 100 | +# generates the import lib if needed. |
| 101 | + |
| 102 | +set(XMLLITE_LIBRARY xmllite) |
| 103 | +if(MINGW) |
| 104 | + function(TestLinkXmlLite OUTPUT_VARNAME) |
| 105 | + include(CheckCXXSourceCompiles) |
| 106 | + set(CMAKE_REQUIRED_LIBRARIES xmllite) |
| 107 | + check_cxx_source_compiles(" |
| 108 | +#include <xmllite.h> |
| 109 | +int main() { |
| 110 | + CreateXmlReader(__uuidof(IXmlReader), nullptr, nullptr); |
| 111 | +} |
| 112 | + " ${OUTPUT_VARNAME}) |
| 113 | + endfunction() |
| 114 | + |
| 115 | + function(TestIsI386 OUTPUT_VARNAME) |
| 116 | + include(CheckCXXSourceCompiles) |
| 117 | + check_cxx_source_compiles(" |
| 118 | +#if !defined(__i386__) && !defined(_M_IX86) |
| 119 | +# error Not i386 |
| 120 | +#endif |
| 121 | +int main() {} |
| 122 | + " ${OUTPUT_VARNAME}) |
| 123 | + endfunction() |
| 124 | + |
| 125 | + TestLinkXmlLite(HAS_LIBXMLLITE) |
| 126 | + if(NOT HAS_LIBXMLLITE) |
| 127 | + TestIsI386(TARGET_IS_I386) |
| 128 | + if(TARGET_IS_I386) |
| 129 | + set(XMLLITE_DEF_FILE xmllite_i386) |
| 130 | + else() |
| 131 | + set(XMLLITE_DEF_FILE xmllite) |
| 132 | + endif() |
| 133 | + add_custom_command( |
| 134 | + OUTPUT |
| 135 | + "${PROJECT_BINARY_DIR}/libxmllite.a" |
| 136 | + COMMAND dlltool -k -d "${PROJECT_SOURCE_DIR}/mingw-support/${XMLLITE_DEF_FILE}.def" -l "${PROJECT_BINARY_DIR}/libxmllite.a" |
| 137 | + DEPENDS "${PROJECT_SOURCE_DIR}/mingw-support/${XMLLITE_DEF_FILE}.def" |
| 138 | + VERBATIM |
| 139 | + ) |
| 140 | + add_custom_target(gen-libxmllite |
| 141 | + DEPENDS "${PROJECT_BINARY_DIR}/libxmllite.a" |
| 142 | + ) |
| 143 | + set(XMLLITE_LIBRARY "${PROJECT_BINARY_DIR}/libxmllite.a") |
| 144 | + add_dependencies(cppwinrt gen-libxmllite) |
| 145 | + endif() |
| 146 | +endif() |
| 147 | +target_link_libraries(cppwinrt "${XMLLITE_LIBRARY}") |
| 148 | + |
| 149 | + |
| 150 | +# === winmd: External header-only library for reading winmd files === |
| 151 | + |
| 152 | +include(ExternalProject) |
| 153 | +ExternalProject_Add(winmd |
| 154 | + URL https://github.com/microsoft/winmd/releases/download/1.0.210629.2/Microsoft.Windows.WinMD.1.0.210629.2.nupkg |
| 155 | + URL_HASH SHA256=4c5f29d948f5b3d724d229664c8f8e4823250d3c9f23ad8067b732fc7076d8c7 |
| 156 | + CONFIGURE_COMMAND "" |
| 157 | + BUILD_COMMAND "" |
| 158 | + INSTALL_COMMAND "" |
| 159 | +) |
| 160 | +add_dependencies(cppwinrt winmd) |
| 161 | +ExternalProject_Get_Property(winmd SOURCE_DIR) |
| 162 | +set(winmd_SOURCE_DIR "${SOURCE_DIR}") |
| 163 | +target_include_directories(cppwinrt PRIVATE "${winmd_SOURCE_DIR}") |
| 164 | + |
| 165 | + |
| 166 | +include(CTest) |
| 167 | +add_subdirectory(test) |
0 commit comments