--- a/src/libunicode/CMakeLists.txt +++ b/src/libunicode/CMakeLists.txt @@ -122,7 +122,7 @@ endif() if(LIBUNICODE_NEEDS_TABLEGEN) # Unified C++ tablegen: self-contained, no library dependencies. # Generates all 9 UCD source files in a single invocation. - add_executable(unicode_tablegen + set(_tablegen_srcs tablegen/tablegen_main.cpp tablegen/ucd_parser.cpp tablegen/enum_generator.cpp @@ -130,17 +130,33 @@ if(LIBUNICODE_NEEDS_TABLEGEN) tablegen/case_norm_generator.cpp tablegen/multistage_generator.cpp ) - set_target_properties(unicode_tablegen PROPERTIES CMAKE_BUILD_TYPE Release) - target_compile_definitions(unicode_tablegen PRIVATE LIBUNICODE_UCD_VERSION="${LIBUNICODE_UCD_VERSION}") - target_include_directories(unicode_tablegen PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..) + if(CMAKE_CROSSCOMPILING) + # build time generator, built for the build host + set(HOST_CXX c++ CACHE STRING "C++ compiler for build time tools") + set(_tablegen "${CMAKE_CURRENT_BINARY_DIR}/unicode_tablegen.host") + add_custom_command( + OUTPUT ${_tablegen} + COMMAND ${HOST_CXX} -std=c++20 -O2 "-DLIBUNICODE_UCD_VERSION=\"${LIBUNICODE_UCD_VERSION}\"" + -I${CMAKE_CURRENT_SOURCE_DIR}/.. ${_tablegen_srcs} -o ${_tablegen} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DEPENDS ${_tablegen_srcs} + VERBATIM + ) + else() + add_executable(unicode_tablegen ${_tablegen_srcs}) + set_target_properties(unicode_tablegen PROPERTIES CMAKE_BUILD_TYPE Release) + target_compile_definitions(unicode_tablegen PRIVATE LIBUNICODE_UCD_VERSION="${LIBUNICODE_UCD_VERSION}") + target_include_directories(unicode_tablegen PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..) + set(_tablegen unicode_tablegen) + endif() add_custom_command( OUTPUT ${_LIBUNICODE_GENERATED_FILES} - COMMAND unicode_tablegen + COMMAND ${_tablegen} "${LIBUNICODE_UCD_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}" "unicode::precompiled" - DEPENDS unicode_tablegen + DEPENDS ${_tablegen} COMMENT "Generating all UCD tables from ${LIBUNICODE_UCD_DIR}" VERBATIM USES_TERMINAL