1# __ __ _ 2# ___\ \/ /_ __ __ _| |_ 3# / _ \\ /| '_ \ / _` | __| 4# | __// \| |_) | (_| | |_ 5# \___/_/\_\ .__/ \__,_|\__| 6# |_| XML parser 7# 8# Copyright (c) 2010 Patrick Spendrin <[email protected]> 9# Copyright (c) 2012 Karl Waclawek <[email protected]> 10# Copyright (c) 2016-2024 Sebastian Pipping <[email protected]> 11# Copyright (c) 2016 Sergei Nikulov <[email protected]> 12# Copyright (c) 2016 Björn Lindahl <[email protected]> 13# Copyright (c) 2016 Tobias Taschner <[email protected]> 14# Copyright (c) 2016 Ben Boeckel <[email protected]> 15# Copyright (c) 2017-2022 Rhodri James <[email protected]> 16# Copyright (c) 2017 Rolf Eike Beer <[email protected]> 17# Copyright (c) 2017 Stephen Groat <[email protected]> 18# Copyright (c) 2017 Franek Korta <[email protected]> 19# Copyright (c) 2018 pedro-vicente <[email protected]> 20# Copyright (c) 2018 Frank Rast <[email protected]> 21# Copyright (c) 2018 userwithuid <[email protected]> 22# Copyright (c) 2018 Yury Gribov <[email protected]> 23# Copyright (c) 2019 Kishore Kunche <[email protected]> 24# Copyright (c) 2019 xantares <[email protected]> 25# Copyright (c) 2019 Mohammed Khajapasha <[email protected]> 26# Copyright (c) 2019 David Loffredo <[email protected]> 27# Copyright (c) 2019 Bhargava Shastry <[email protected]> 28# Copyright (c) 2020 Maciej Sroczyński <[email protected]> 29# Copyright (c) 2020 Gulliver <[email protected]> 30# Copyright (c) 2020 Thomas Beutlich <[email protected]> 31# Copyright (c) 2021 Alex Richardson <[email protected]> 32# Copyright (c) 2022 Johnny Jazeix <[email protected]> 33# Copyright (c) 2022 David Faure <[email protected]> 34# Unlike most of Expat, 35# this file is copyrighted under the BSD-license for buildsystem files of KDE. 36 37cmake_minimum_required(VERSION 3.5.0) 38 39project(expat 40 VERSION 41 2.6.3 42 LANGUAGES 43 C 44) 45set(CMAKE_C_STANDARD 99) 46set(CMAKE_C_STANDARD_REQUIRED ON) 47set(CMAKE_C_EXTENSIONS OFF) # i.e. -std=c99 rather than default -std=gnu99 48 49set(PACKAGE_BUGREPORT "https://github.com/libexpat/libexpat/issues") 50set(PACKAGE_NAME "expat") 51set(PACKAGE_VERSION "${PROJECT_VERSION}") 52set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}") 53set(PACKAGE_TARNAME "${PACKAGE_NAME}") 54 55include(CMakePackageConfigHelpers) 56include(GNUInstallDirs) 57 58# 59# Configuration defaults 60# 61if(WINCE) 62 set(_EXPAT_BUILD_TOOLS_DEFAULT OFF) 63else() 64 set(_EXPAT_BUILD_TOOLS_DEFAULT ON) 65endif() 66if(MSVC OR NOT _EXPAT_BUILD_TOOLS_DEFAULT) 67 set(_EXPAT_BUILD_DOCS_DEFAULT OFF) 68else() 69 find_program(DOCBOOK_TO_MAN NAMES docbook2x-man db2x_docbook2man docbook2man docbook-to-man) 70 if(DOCBOOK_TO_MAN) 71 set(_EXPAT_BUILD_DOCS_DEFAULT ON) 72 else() 73 set(_EXPAT_BUILD_DOCS_DEFAULT OFF) 74 endif() 75endif() 76if(MSVC) 77 set(_EXPAT_BUILD_PKGCONFIG_DEFAULT OFF) 78else() 79 set(_EXPAT_BUILD_PKGCONFIG_DEFAULT ON) 80endif() 81if(DEFINED BUILD_SHARED_LIBS) 82 set(_EXPAT_SHARED_LIBS_DEFAULT ${BUILD_SHARED_LIBS}) 83else() 84 set(_EXPAT_SHARED_LIBS_DEFAULT ON) 85endif() 86if(NOT CMAKE_BUILD_TYPE) 87 set(CMAKE_BUILD_TYPE NoConfig) # so that accessing EXPAT_*_POSTFIX will be waterproof 88endif() 89string(TOUPPER "${CMAKE_BUILD_TYPE}" _EXPAT_BUILD_TYPE_UPPER) 90 91# 92# Configuration 93# 94 95macro(expat_shy_set var default cache type desc) 96 # Macro expat_shy_set came into life because: 97 # - Expat was previously using an inconsistent mix of CMake's native set() 98 # and option() to define public build time options. 99 # - option() is more friendly than set() with regard to configuring an 100 # external project that is pulled in by means of add_subdirectory() -- 101 # see comments in issue #597 -- so we wanted to get away from set(). 102 # - option() auto-converts non-bool values to bool when writing to the CMake 103 # cache, so we needed something that supports non-bool better and hence 104 # wanted to get away from plain option(), too. 105 # 106 # As a result, this function serves as a hybrid between CMake's regular set() 107 # and option(): from set() it takes support for non-bool types and the function 108 # name and signature whereas from option() (with policy CMP0077 mode NEW) it 109 # takes being shy when a value has previously been defined for that variable. 110 # 111 # So that resolves all need for set(.. FORCE) when pulling in Expat by means of 112 # add_subdirectory(). 113 # 114 if(NOT ${cache} STREQUAL "CACHE") 115 message(SEND_ERROR "Macro usage is: expat_shy_set(var default CACHE type desc)") 116 endif() 117 118 if(DEFINED ${var}) 119 # NOTE: The idea is to (ideally) only add to the cache if 120 # there is no cache entry, yet. "if(DEFINED CACHE{var})" 121 # requires CMake >=3.14. 122 if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.14" AND NOT DEFINED "CACHE{${var}}") 123 set("${var}" "${${var}}" CACHE "${type}" "${desc}") 124 endif() 125 else() 126 set("${var}" "${default}" CACHE "${type}" "${desc}") 127 endif() 128endmacro() 129 130expat_shy_set(EXPAT_BUILD_TOOLS ${_EXPAT_BUILD_TOOLS_DEFAULT} CACHE BOOL "Build the xmlwf tool for expat library") 131expat_shy_set(EXPAT_BUILD_EXAMPLES ON CACHE BOOL "Build the examples for expat library") 132expat_shy_set(EXPAT_BUILD_TESTS ON CACHE BOOL "Build the tests for expat library") 133expat_shy_set(EXPAT_SHARED_LIBS ${_EXPAT_SHARED_LIBS_DEFAULT} CACHE BOOL "Build a shared expat library") 134expat_shy_set(EXPAT_BUILD_DOCS ${_EXPAT_BUILD_DOCS_DEFAULT} CACHE BOOL "Build man page for xmlwf") 135expat_shy_set(EXPAT_BUILD_FUZZERS OFF CACHE BOOL "Build fuzzers for the expat library") 136expat_shy_set(EXPAT_BUILD_PKGCONFIG ${_EXPAT_BUILD_PKGCONFIG_DEFAULT} CACHE BOOL "Build pkg-config file") 137expat_shy_set(EXPAT_OSSFUZZ_BUILD OFF CACHE BOOL "Build fuzzers via ossfuzz for the expat library") 138if(UNIX OR _EXPAT_HELP) 139 expat_shy_set(EXPAT_WITH_LIBBSD OFF CACHE BOOL "Utilize libbsd (for arc4random_buf)") 140endif() 141expat_shy_set(EXPAT_ENABLE_INSTALL ON CACHE BOOL "Install expat files in cmake install target") 142expat_shy_set(EXPAT_CONTEXT_BYTES 1024 CACHE STRING "Define to specify how much context to retain around the current parse point, 0 to disable") 143mark_as_advanced(EXPAT_CONTEXT_BYTES) 144expat_shy_set(EXPAT_DTD ON CACHE BOOL "Define to make parameter entity parsing functionality available") 145mark_as_advanced(EXPAT_DTD) 146expat_shy_set(EXPAT_GE ON CACHE BOOL "Define to make general entity parsing functionality available") 147mark_as_advanced(EXPAT_GE) 148expat_shy_set(EXPAT_NS ON CACHE BOOL "Define to make XML Namespaces functionality available") 149mark_as_advanced(EXPAT_NS) 150expat_shy_set(EXPAT_WARNINGS_AS_ERRORS OFF CACHE BOOL "Treat all compiler warnings as errors") 151if(UNIX OR _EXPAT_HELP) 152 expat_shy_set(EXPAT_DEV_URANDOM ON CACHE BOOL "Define to include code reading entropy from `/dev/urandom'.") 153 expat_shy_set(EXPAT_WITH_GETRANDOM "AUTO" CACHE STRING "Make use of getrandom function (ON|OFF|AUTO) [default=AUTO]") 154 expat_shy_set(EXPAT_WITH_SYS_GETRANDOM "AUTO" CACHE STRING "Make use of syscall SYS_getrandom (ON|OFF|AUTO) [default=AUTO]") 155 mark_as_advanced(EXPAT_DEV_URANDOM) 156endif() 157expat_shy_set(EXPAT_CHAR_TYPE "char" CACHE STRING "Character type to use (char|ushort|wchar_t) [default=char]") 158expat_shy_set(EXPAT_ATTR_INFO OFF CACHE BOOL "Define to allow retrieving the byte offsets for attribute names and values") 159mark_as_advanced(EXPAT_ATTR_INFO) 160expat_shy_set(EXPAT_LARGE_SIZE OFF CACHE BOOL "Make XML_GetCurrent* functions return <(unsigned) long long> rather than <(unsigned) long>") 161mark_as_advanced(EXPAT_LARGE_SIZE) 162expat_shy_set(EXPAT_MIN_SIZE OFF CACHE BOOL "Get a smaller (but slower) parser (in particular avoid multiple copies of the tokenizer)") 163mark_as_advanced(EXPAT_MIN_SIZE) 164if(MSVC OR _EXPAT_HELP) 165 expat_shy_set(EXPAT_MSVC_STATIC_CRT OFF CACHE BOOL "Use /MT flag (static CRT) when compiling in MSVC") 166endif() 167if(NOT _EXPAT_HELP) 168 expat_shy_set(_EXPAT_M32 OFF CACHE BOOL "(Unofficial!) Produce 32bit code with -m32") 169 mark_as_advanced(_EXPAT_M32) 170endif() 171 172if(EXPAT_BUILD_TESTS) 173 # We have to call enable_language() before modifying any CMAKE_CXX_* variables 174 enable_language(CXX) 175 176 set(CMAKE_CXX_STANDARD 11) 177 set(CMAKE_CXX_STANDARD_REQUIRED ON) 178 set(CMAKE_CXX_EXTENSIONS OFF) # i.e. -std=c++11 rather than default -std=gnu++11 179endif() 180 181# 182# Environment checks 183# 184if(EXPAT_DTD AND NOT EXPAT_GE) 185 message(SEND_ERROR "Option EXPAT_DTD requires that EXPAT_GE is also enabled.") 186 message(SEND_ERROR "Please either enable option EXPAT_GE (recommended) or disable EXPAT_DTD also.") 187endif() 188 189if(EXPAT_WITH_LIBBSD) 190 find_library(LIB_BSD NAMES bsd) 191 if(NOT LIB_BSD) 192 message(SEND_ERROR "EXPAT_WITH_LIBBSD option is enabled, but libbsd was not found") 193 else() 194 set(HAVE_LIBBSD TRUE) 195 endif() 196endif() 197 198if(MSVC) 199 # For the three types of MSVC version values, please see: 200 # - https://cmake.org/cmake/help/latest/variable/MSVC_VERSION.html 201 # - https://sourceforge.net/p/predef/wiki/Compilers/ 202 # - https://en.wikipedia.org/wiki/Microsoft_Visual_Studio#History 203 set(_EXPAT_MSVC_REQUIRED_INT 1800) # i.e. 12.0/2013/1800; see PR #426 204 set(_EXPAT_MSVC_SUPPORTED_INT 1920) 205 set(_EXPAT_MSVC_SUPPORTED_DISPLAY "Visual Studio 16.0/2019/${_EXPAT_MSVC_SUPPORTED_INT}") 206 207 if(MSVC_VERSION VERSION_LESS ${_EXPAT_MSVC_SUPPORTED_INT}) 208 if(MSVC_VERSION VERSION_LESS ${_EXPAT_MSVC_REQUIRED_INT}) 209 message(SEND_ERROR "MSVC_VERSION ${MSVC_VERSION} is TOO OLD to compile Expat without errors.") 210 message(SEND_ERROR "Please use officially supported ${_EXPAT_MSVC_SUPPORTED_DISPLAY} or later. Thank you!") 211 else() 212 message(WARNING "MSVC_VERSION ${MSVC_VERSION} is NOT OFFICIALLY SUPPORTED by Expat.") 213 message(WARNING "Please use ${_EXPAT_MSVC_SUPPORTED_DISPLAY} or later. Thank you!") 214 endif() 215 endif() 216endif() 217 218macro(_expat_copy_bool_int source_ref dest_ref) 219 if(${source_ref}) 220 set(${dest_ref} 1) 221 else() 222 set(${dest_ref} 0) 223 endif() 224endmacro() 225 226if(EXPAT_LARGE_SIZE) 227 add_definitions(-DXML_LARGE_SIZE) 228endif() 229 230if(EXPAT_MIN_SIZE) 231 add_definitions(-DXML_MIN_SIZE) 232endif() 233 234if(EXPAT_CHAR_TYPE STREQUAL "char") 235 set(_EXPAT_UNICODE OFF) 236 set(_EXPAT_UNICODE_WCHAR_T OFF) 237elseif(EXPAT_CHAR_TYPE STREQUAL "ushort") 238 set(_EXPAT_UNICODE ON) 239 set(_EXPAT_UNICODE_WCHAR_T OFF) 240 if(EXPAT_BUILD_EXAMPLES) 241 message(SEND_ERROR "Examples can not be built with option -DEXPAT_CHAR_TYPE=ushort. Please pass -DEXPAT_CHAR_TYPE=(char|wchar_t) or -DEXPAT_BUILD_EXAMPLES=OFF.") 242 endif() 243 if(EXPAT_BUILD_TESTS) 244 message(SEND_ERROR "The testsuite can not be built with option -DEXPAT_CHAR_TYPE=ushort. Please pass -DEXPAT_CHAR_TYPE=(char|wchar_t) or -DEXPAT_BUILD_TESTS=OFF.") 245 endif() 246 if(EXPAT_BUILD_TOOLS) 247 message(SEND_ERROR "The xmlwf tool can not be built with option -DEXPAT_CHAR_TYPE=ushort. Please pass -DEXPAT_CHAR_TYPE=(char|wchar_t) or -DEXPAT_BUILD_TOOLS=OFF.") 248 endif() 249elseif(EXPAT_CHAR_TYPE STREQUAL "wchar_t") 250 set(_EXPAT_UNICODE ON) 251 set(_EXPAT_UNICODE_WCHAR_T ON) 252 if(NOT WIN32) 253 string(FIND "${CMAKE_C_FLAGS}" "-fshort-wchar" _expat_short_wchar_found) 254 if(${_expat_short_wchar_found} EQUAL "-1") 255 message(SEND_ERROR "Configuration -DEXPAT_CHAR_TYPE=wchar_t requires -DCMAKE_{C,CXX}_FLAGS=-fshort-wchar (which was not found) and libc compiled with -fshort-wchar, too.") 256 endif() 257 if (EXPAT_BUILD_TOOLS) 258 message(SEND_ERROR "The xmlwf tool can not be built with option -DEXPAT_CHAR_TYPE=wchar_t outside of Windows. Please pass -DEXPAT_CHAR_TYPE=char or -DEXPAT_BUILD_TOOLS=OFF.") 259 endif() 260 endif() 261else() 262 message(SEND_ERROR "Option -DEXPAT_CHAR_TYPE=(char|ushort|wchar_t) cannot be \"${EXPAT_CHAR_TYPE}\".") 263endif() 264 265if(_EXPAT_UNICODE) 266 add_definitions(-DXML_UNICODE) # for unsigned short 267 if(_EXPAT_UNICODE_WCHAR_T) 268 add_definitions(-DXML_UNICODE_WCHAR_T) # for wchar_t 269 endif() 270endif() 271 272include(${CMAKE_CURRENT_LIST_DIR}/ConfigureChecks.cmake) 273 274macro(evaluate_detection_results use_ref have_ref thing_lower thing_title) 275 if(${use_ref} AND NOT (${use_ref} STREQUAL "AUTO") AND NOT ${have_ref}) 276 message(SEND_ERROR 277 "Use of ${thing_lower} was enforced by ${use_ref}=ON but it could not be found.") 278 elseif(NOT ${use_ref} AND ${have_ref}) 279 message("${thing_title} was found but it will not be used due to ${use_ref}=OFF.") 280 set(${have_ref} 0) 281 endif() 282endmacro() 283 284if(NOT WIN32) 285 evaluate_detection_results(EXPAT_WITH_GETRANDOM HAVE_GETRANDOM "function getrandom" "Function getrandom") 286 evaluate_detection_results(EXPAT_WITH_SYS_GETRANDOM HAVE_SYSCALL_GETRANDOM "syscall SYS_getrandom" "Syscall SYS_getrandom") 287endif() 288 289_expat_copy_bool_int(EXPAT_ATTR_INFO XML_ATTR_INFO) 290_expat_copy_bool_int(EXPAT_DTD XML_DTD) 291_expat_copy_bool_int(EXPAT_GE XML_GE) 292_expat_copy_bool_int(EXPAT_LARGE_SIZE XML_LARGE_SIZE) 293_expat_copy_bool_int(EXPAT_MIN_SIZE XML_MIN_SIZE) 294_expat_copy_bool_int(EXPAT_NS XML_NS) 295if(NOT WIN32) 296 _expat_copy_bool_int(EXPAT_DEV_URANDOM XML_DEV_URANDOM) 297endif() 298if(NOT EXPAT_CONTEXT_BYTES GREATER 0) # in particular with -DEXPAT_CONTEXT_BYTES=OFF 299 set(EXPAT_CONTEXT_BYTES 0) 300endif() 301set(XML_CONTEXT_BYTES ${EXPAT_CONTEXT_BYTES}) 302 303macro(expat_install) 304 if(EXPAT_ENABLE_INSTALL) 305 install(${ARGN}) 306 endif() 307endmacro() 308 309configure_file(expat_config.h.cmake "${CMAKE_CURRENT_BINARY_DIR}/expat_config.h") 310expat_install(FILES "${CMAKE_CURRENT_BINARY_DIR}/expat_config.h" DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) 311 312 313set(EXTRA_COMPILE_FLAGS) 314if(FLAG_NO_STRICT_ALIASING) 315 set(EXTRA_COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS} -fno-strict-aliasing") 316endif() 317if(FLAG_VISIBILITY) 318 if(EXPAT_SHARED_LIBS) 319 add_definitions(-DXML_ENABLE_VISIBILITY=1) 320 endif() 321 set(EXTRA_COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS} -fvisibility=hidden") 322endif() 323if(MINGW) 324 # Without __USE_MINGW_ANSI_STDIO the compiler produces a false positive 325 set(EXTRA_COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS} -Wno-pedantic-ms-format") 326endif() 327if (EXPAT_WARNINGS_AS_ERRORS) 328 if(MSVC) 329 add_definitions(/WX) 330 else() 331 set(EXTRA_COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS} -Werror") 332 if(MINGW) 333 # To avoid "error: unknown conversion type character ‘l’ in format [-Werror=format=]" 334 set(EXTRA_COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS} -Wno-format") 335 endif() 336 endif() 337endif() 338set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_COMPILE_FLAGS}") 339set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_COMPILE_FLAGS}") 340 341if (MSVC) 342 if (EXPAT_MSVC_STATIC_CRT) 343 message("-- Using static CRT ${EXPAT_MSVC_STATIC_CRT}") 344 foreach(flag_var 345 CMAKE_CXX_FLAGS_${_EXPAT_BUILD_TYPE_UPPER} 346 CMAKE_CXX_FLAGS_DEBUG 347 CMAKE_CXX_FLAGS_RELEASE 348 CMAKE_CXX_FLAGS_MINSIZEREL 349 CMAKE_CXX_FLAGS_RELWITHDEBINFO 350 CMAKE_C_FLAGS_${_EXPAT_BUILD_TYPE_UPPER} 351 CMAKE_C_FLAGS_DEBUG 352 CMAKE_C_FLAGS_RELEASE 353 CMAKE_C_FLAGS_MINSIZEREL 354 CMAKE_C_FLAGS_RELWITHDEBINFO 355 ) 356 string(REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") 357 endforeach() 358 endif() 359endif() 360 361if(_EXPAT_M32 AND NOT MSVC) 362 foreach(flag_var 363 CMAKE_CXX_FLAGS_${_EXPAT_BUILD_TYPE_UPPER} 364 CMAKE_CXX_FLAGS_DEBUG 365 CMAKE_CXX_FLAGS_RELEASE 366 CMAKE_CXX_FLAGS_MINSIZEREL 367 CMAKE_CXX_FLAGS_RELWITHDEBINFO 368 CMAKE_C_FLAGS_${_EXPAT_BUILD_TYPE_UPPER} 369 CMAKE_C_FLAGS_DEBUG 370 CMAKE_C_FLAGS_RELEASE 371 CMAKE_C_FLAGS_MINSIZEREL 372 CMAKE_C_FLAGS_RELWITHDEBINFO 373 ) 374 set(${flag_var} "${${flag_var}} -m32") 375 endforeach() 376endif() 377 378include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/lib) 379if(MSVC) 380 add_definitions(-D_CRT_SECURE_NO_WARNINGS -wd4996) 381endif() 382 383# 384# C library 385# 386set(_EXPAT_C_SOURCES 387 lib/xmlparse.c 388 lib/xmlrole.c 389 lib/xmltok.c 390# NOTE: ISO C forbids an empty translation unit 391# lib/xmltok_impl.c 392# lib/xmltok_ns.c 393) 394 395if(EXPAT_SHARED_LIBS) 396 set(_SHARED SHARED) 397 if(WIN32) 398 macro(_expat_def_file_toggle source_var target_var) 399 if(${source_var}) 400 set(${target_var} " ") # i.e. not commented out, a single space 401 else() 402 set(${target_var} ";") # i.e. commented out 403 endif() 404 endmacro() 405 406 if(EXPAT_DTD OR EXPAT_GE) 407 set(_EXPAT_DTD_OR_GE TRUE) 408 else() 409 set(_EXPAT_DTD_OR_GE FALSE) 410 endif() 411 412 _expat_def_file_toggle(_EXPAT_DTD_OR_GE _EXPAT_COMMENT_DTD_OR_GE) 413 _expat_def_file_toggle(EXPAT_ATTR_INFO _EXPAT_COMMENT_ATTR_INFO) 414 415 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/lib/libexpat.def.cmake" "${CMAKE_CURRENT_BINARY_DIR}/lib/libexpat.def") 416 set(_EXPAT_EXTRA_SOURCES ${_EXPAT_EXTRA_SOURCES} "${CMAKE_CURRENT_BINARY_DIR}/lib/libexpat.def") 417 418 # Add DLL version 419 string(REPLACE "." "," _EXPAT_DLL_VERSION ${PROJECT_VERSION}.0) 420 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/win32/version.rc.cmake" "${CMAKE_CURRENT_BINARY_DIR}/win32/version.rc") 421 set(_EXPAT_EXTRA_SOURCES ${_EXPAT_EXTRA_SOURCES} "${CMAKE_CURRENT_BINARY_DIR}/win32/version.rc") 422 endif() 423else() 424 set(_SHARED STATIC) 425endif() 426 427add_library(expat ${_SHARED} ${_EXPAT_C_SOURCES} ${_EXPAT_EXTRA_SOURCES}) 428if(_EXPAT_LIBM_FOUND) 429 target_link_libraries(expat m) 430endif() 431if(EXPAT_WITH_LIBBSD) 432 target_link_libraries(expat ${LIB_BSD}) 433endif() 434 435# 436# Library filename postfix 437# 438if(_EXPAT_UNICODE) 439 set(_POSTFIX_WIDE "w") 440endif() 441 442if(MSVC AND NOT EXPAT_SHARED_LIBS) 443 if(EXPAT_MSVC_STATIC_CRT) 444 set(_POSTFIX_CRT "MT") 445 else() 446 set(_POSTFIX_CRT "MD") 447 endif() 448endif() 449 450foreach(build_type_upper 451 ${_EXPAT_BUILD_TYPE_UPPER} 452 DEBUG 453 RELEASE 454 MINSIZEREL 455 RELWITHDEBINFO 456 ) 457 if(WIN32 AND build_type_upper STREQUAL "DEBUG") 458 set(_POSTFIX_DEBUG "d") 459 else() 460 set(_POSTFIX_DEBUG "") # needs a reset because of being looped 461 endif() 462 463 expat_shy_set(EXPAT_${build_type_upper}_POSTFIX "${_POSTFIX_WIDE}${_POSTFIX_DEBUG}${_POSTFIX_CRT}" CACHE STRING "Library filename postfix for build type ${build_type_upper}; yields filenames libexpat<postfix=[w][d][MD|MT]>.(dll|dylib|lib|so)") 464 mark_as_advanced(EXPAT_${build_type_upper}_POSTFIX) 465 set_property(TARGET expat PROPERTY ${build_type_upper}_POSTFIX ${EXPAT_${build_type_upper}_POSTFIX}) 466endforeach() 467 468set(LIBCURRENT 10) # sync 469set(LIBREVISION 3) # with 470set(LIBAGE 9) # configure.ac! 471math(EXPR LIBCURRENT_MINUS_AGE "${LIBCURRENT} - ${LIBAGE}") 472 473if(NOT WIN32) 474 set_property(TARGET expat PROPERTY VERSION ${LIBCURRENT_MINUS_AGE}.${LIBAGE}.${LIBREVISION}) 475 set_property(TARGET expat PROPERTY SOVERSION ${LIBCURRENT_MINUS_AGE}) 476 set_property(TARGET expat PROPERTY NO_SONAME ${NO_SONAME}) 477 478 if(APPLE) 479 if(NOT CMAKE_VERSION VERSION_GREATER_EQUAL 3.17) 480 message(FATAL_ERROR "Expat requires CMake >=3.17 on platform \"APPLE\".") 481 endif() 482 483 # NOTE: This intends to talk CMake into compatibility with GNU Libtool 484 math(EXPR _EXPAT_MACHO_COMPATIBILITY_VERSION "${LIBCURRENT} + 1") 485 set(_EXPAT_MACHO_CURRENT_VERSION "${_EXPAT_MACHO_COMPATIBILITY_VERSION}.${LIBREVISION}") 486 set_property(TARGET expat PROPERTY MACHO_COMPATIBILITY_VERSION ${_EXPAT_MACHO_COMPATIBILITY_VERSION}) 487 set_property(TARGET expat PROPERTY MACHO_CURRENT_VERSION ${_EXPAT_MACHO_CURRENT_VERSION}) 488 endif() 489endif() 490 491if(MINGW AND EXPAT_SHARED_LIBS) 492 set_target_properties(expat PROPERTIES SUFFIX "-${LIBCURRENT_MINUS_AGE}.dll") 493endif() 494 495if(WIN32 AND NOT MINGW) 496 # NOTE: This avoids a name collision with Expat.dll of Perl's XML::Parser::Expat 497 # on Windows by resorting to filename libexpat.dll since Expat 1.95.3. 498 # Everything but MSVC is already adding prefix "lib", automatically. 499 # NOTE: "set_property(TARGET expat PROPERTY PREFIX lib)" would only affect *.dll 500 # files but not *.lib files, so we have to rely on property OUTPUT_NAME, instead. 501 # Target property <CONFIG>_POSTFIX still applies. 502 set(_EXPAT_OUTPUT_NAME libexpat) 503 set_property(TARGET expat PROPERTY OUTPUT_NAME ${_EXPAT_OUTPUT_NAME}) 504else() 505 set(_EXPAT_OUTPUT_NAME expat) 506endif() 507 508target_include_directories(expat 509 INTERFACE 510 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/lib> 511 $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}> 512 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> 513) 514 515if(WIN32 AND EXPAT_SHARED_LIBS) 516 target_compile_definitions(expat PRIVATE VER_FILEVERSION=${_EXPAT_DLL_VERSION}) 517endif() 518 519expat_install(TARGETS expat EXPORT expat 520 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} 521 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 522 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) 523 524expat_install(FILES lib/expat.h lib/expat_external.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) 525 526# 527# pkg-config file 528# 529if(EXPAT_BUILD_PKGCONFIG) 530 if(CMAKE_INSTALL_LIBDIR MATCHES "^/") 531 set(_expat_pkgconfig_libdir "${CMAKE_INSTALL_LIBDIR}") 532 else() 533 set(_expat_pkgconfig_libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}") 534 endif() 535 536 if(CMAKE_INSTALL_INCLUDEDIR MATCHES "^/") 537 set(_expat_pkgconfig_includedir "${CMAKE_INSTALL_INCLUDEDIR}") 538 else() 539 set(_expat_pkgconfig_includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}") 540 endif() 541 542 set_target_properties(expat PROPERTIES 543 pkgconfig_prefix "${CMAKE_INSTALL_PREFIX}" 544 pkgconfig_exec_prefix "\${prefix}" 545 pkgconfig_libdir "${_expat_pkgconfig_libdir}" 546 pkgconfig_includedir "${_expat_pkgconfig_includedir}" 547 pkgconfig_version "${PACKAGE_VERSION}") 548 549 foreach(_build_type ${CMAKE_BUILD_TYPE} Debug Release RelWithDebInfo MinSizeRel) 550 string(TOLOWER "${_build_type}" _build_type_lower) 551 string(TOUPPER "${_build_type}" _build_type_upper) 552 set_property(TARGET expat PROPERTY "pkgconfig_${_build_type_lower}_name" "expat${EXPAT_${_build_type_upper}_POSTFIX}") 553 set_property(TARGET expat PROPERTY "pkgconfig_${_build_type_lower}_output_name" "${_EXPAT_OUTPUT_NAME}${EXPAT_${_build_type_upper}_POSTFIX}") 554 if(_EXPAT_LIBM_FOUND) 555 set_property(TARGET expat PROPERTY "pkgconfig_libm" "-lm") 556 else() 557 set_property(TARGET expat PROPERTY "pkgconfig_libm" "") 558 endif() 559 endforeach() 560 561 file(GENERATE 562 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/expat.pc 563 INPUT ${PROJECT_SOURCE_DIR}/expat.pc.cmake) 564 565 expat_install(FILES ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/expat.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) 566endif() 567 568# 569# C command line tool xmlwf 570# 571if(EXPAT_BUILD_TOOLS) 572 set(xmlwf_SRCS 573 xmlwf/codepage.c 574 xmlwf/readfilemap.c 575 xmlwf/xmlfile.c 576 xmlwf/xmlwf.c 577 ) 578 579 add_executable(xmlwf ${xmlwf_SRCS}) 580 set_property(TARGET xmlwf PROPERTY RUNTIME_OUTPUT_DIRECTORY xmlwf) 581 target_link_libraries(xmlwf expat) 582 if(_EXPAT_LIBM_FOUND) 583 target_link_libraries(xmlwf m) 584 endif() 585 expat_install(TARGETS xmlwf DESTINATION ${CMAKE_INSTALL_BINDIR}) 586 587 if(MINGW AND _EXPAT_UNICODE_WCHAR_T) 588 # https://gcc.gnu.org/onlinedocs/gcc/x86-Windows-Options.html 589 set_target_properties(xmlwf PROPERTIES LINK_FLAGS -municode) 590 endif() 591 592 if(EXPAT_BUILD_DOCS) 593 file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/doc) 594 add_custom_target( 595 xmlwf-manpage 596 COMMAND 597 "${DOCBOOK_TO_MAN}" "${PROJECT_SOURCE_DIR}/doc/xmlwf.xml" && mv "XMLWF.1" "${PROJECT_BINARY_DIR}/doc/xmlwf.1" 598 BYPRODUCTS 599 doc/xmlwf.1) 600 add_dependencies(expat xmlwf-manpage) 601 expat_install(FILES "${PROJECT_BINARY_DIR}/doc/xmlwf.1" DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) 602 elseif(EXISTS ${PROJECT_SOURCE_DIR}/doc/xmlwf.1) 603 expat_install(FILES "${PROJECT_SOURCE_DIR}/doc/xmlwf.1" DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) 604 endif() 605endif() 606 607# 608# C code examples 609# 610if(EXPAT_BUILD_EXAMPLES) 611 foreach(_target element_declarations elements outline) 612 add_executable(${_target} examples/${_target}.c) 613 set_property(TARGET ${_target} PROPERTY RUNTIME_OUTPUT_DIRECTORY examples) 614 target_link_libraries(${_target} expat) 615 endforeach() 616endif() 617 618# 619# C/C++ test runners 620# 621if(EXPAT_BUILD_TESTS) 622 ## these are unittests that can be run on any platform 623 enable_testing() 624 625 if(NOT MSVC) 626 if(MINGW) 627 set(host whatever-mingw32) # for nothing but run.sh 628 endif() 629 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/run.sh.in run.sh @ONLY) 630 endif() 631 632 function(expat_add_test _name _file) 633 if(MSVC) 634 add_test(NAME ${_name} COMMAND ${_file}) 635 else() 636 add_test(NAME ${_name} COMMAND bash run.sh ${_file}) 637 endif() 638 endfunction() 639 640 set(_EXPAT_TEST_TARGETS runtests runtests_cxx) 641 642 add_executable(runtests 643 tests/acc_tests.c 644 tests/alloc_tests.c 645 tests/basic_tests.c 646 tests/chardata.c 647 tests/common.c 648 tests/dummy.c 649 tests/handlers.c 650 tests/memcheck.c 651 tests/minicheck.c 652 tests/misc_tests.c 653 tests/ns_tests.c 654 tests/nsalloc_tests.c 655 tests/runtests.c 656 tests/structdata.c 657 ${_EXPAT_C_SOURCES} 658 ) 659 660 add_executable(runtests_cxx 661 tests/acc_tests_cxx.cpp 662 tests/alloc_tests_cxx.cpp 663 tests/basic_tests_cxx.cpp 664 tests/chardata_cxx.cpp 665 tests/common_cxx.cpp 666 tests/dummy_cxx.cpp 667 tests/handlers_cxx.cpp 668 tests/memcheck_cxx.cpp 669 tests/minicheck_cxx.cpp 670 tests/misc_tests_cxx.cpp 671 tests/ns_tests_cxx.cpp 672 tests/nsalloc_tests_cxx.cpp 673 tests/runtests_cxx.cpp 674 tests/structdata_cxx.cpp 675 ${_EXPAT_C_SOURCES} 676 ) 677 678 foreach(_target ${_EXPAT_TEST_TARGETS}) 679 target_compile_definitions(${_target} PRIVATE -DXML_TESTING) 680 681 set_property(TARGET ${_target} PROPERTY RUNTIME_OUTPUT_DIRECTORY tests) 682 expat_add_test(${_target} $<TARGET_FILE:${_target}>) 683 684 if(_EXPAT_LIBM_FOUND) 685 target_link_libraries(${_target} m) 686 endif() 687 688 if(EXPAT_WITH_LIBBSD) 689 target_link_libraries(${_target} ${LIB_BSD}) 690 endif() 691 endforeach() 692 693 add_executable(benchmark tests/benchmark/benchmark.c) 694 set_property(TARGET benchmark PROPERTY RUNTIME_OUTPUT_DIRECTORY tests/benchmark) 695 target_link_libraries(benchmark expat) 696endif() 697 698# 699# Fuzzers 700# 701if(EXPAT_BUILD_FUZZERS) 702 if(NOT "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang") 703 message(SEND_ERROR 704 "Building fuzz targets without Clang (but ${CMAKE_C_COMPILER_ID}) " 705 "is not supported. Please set " 706 "-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++.") 707 endif() 708 709 string(FIND "${CMAKE_C_FLAGS}" "-fsanitize" sanitizer_present) 710 if(${sanitizer_present} EQUAL "-1") 711 message(WARNING 712 "There was no sanitizer present when building the fuzz targets. " 713 "This is likely in error - consider adding " 714 "-DCMAKE_C_FLAGS='-fsanitize=<sanitizer>' and " 715 "-DCMAKE_CXX_FLAGS='-fsanitize=<sanitizer>' and " 716 "-DCMAKE_EXE_LINKER_FLAGS='-fsanitize=<sanitizer>' and " 717 "-DCMAKE_MODULE_LINKER_FLAGS='-fsanitize=<sanitizer>' and " 718 "-DCMAKE_SHARED_LINKER_FLAGS='-fsanitize=<sanitizer>' to your cmake " 719 "execution.") 720 endif() 721 722 if(EXPAT_OSSFUZZ_BUILD AND NOT DEFINED ENV{LIB_FUZZING_ENGINE}) 723 message(SEND_ERROR 724 "OSS-Fuzz builds require the environment variable " 725 "LIB_FUZZING_ENGINE to be set. If you are seeing this " 726 "warning, it points to a deeper problem in the ossfuzz " 727 "build setup.") 728 endif() 729 730 set(encoding_types UTF-16 UTF-8 ISO-8859-1 US-ASCII UTF-16BE UTF-16LE) 731 set(fuzz_targets xml_parse_fuzzer xml_parsebuffer_fuzzer) 732 733 add_library(fuzzpat STATIC ${_EXPAT_C_SOURCES}) 734 if(NOT EXPAT_OSSFUZZ_BUILD) 735 target_compile_options(fuzzpat PRIVATE -fsanitize=fuzzer-no-link) 736 endif() 737 738 foreach(fuzz_target ${fuzz_targets}) 739 foreach(encoding_type ${encoding_types}) 740 set(target_name ${fuzz_target}_${encoding_type}) 741 add_executable(${target_name} fuzz/${fuzz_target}.c) 742 target_link_libraries(${target_name} fuzzpat) 743 target_compile_definitions(${target_name} 744 PRIVATE ENCODING_FOR_FUZZING=${encoding_type}) 745 if(NOT EXPAT_OSSFUZZ_BUILD) 746 target_compile_options(${target_name} PRIVATE -fsanitize=fuzzer-no-link) 747 endif() 748 # NOTE: Avoiding target_link_options here only because it needs CMake >=3.13 749 if(EXPAT_OSSFUZZ_BUILD) 750 set_target_properties(${target_name} PROPERTIES LINK_FLAGS $ENV{LIB_FUZZING_ENGINE}) 751 set_target_properties(${target_name} PROPERTIES LINKER_LANGUAGE "CXX") 752 else() 753 set_target_properties(${target_name} PROPERTIES LINK_FLAGS -fsanitize=fuzzer) 754 endif() 755 set_property( 756 TARGET ${target_name} PROPERTY RUNTIME_OUTPUT_DIRECTORY fuzz) 757 endforeach() 758 endforeach() 759else() 760 if(EXPAT_OSSFUZZ_BUILD) 761 message(SEND_ERROR 762 "Attempting to perform an ossfuzz build without turning on the fuzzer build. " 763 "This is likely in error - consider adding " 764 "-DEXPAT_BUILD_FUZZERS=ON to your cmake execution.") 765 endif() 766endif() 767 768# 769# C/C++ config affecting multiple targets 770# 771if(WIN32) 772 set(_EXPAT_STATIC_TARGETS ${_EXPAT_TEST_TARGETS}) 773 if(NOT EXPAT_SHARED_LIBS) 774 list(APPEND _EXPAT_STATIC_TARGETS expat) 775 endif() 776 if(EXPAT_BUILD_FUZZERS) 777 list(APPEND _EXPAT_STATIC_TARGETS fuzzpat) 778 endif() 779 780 foreach(_target ${_EXPAT_STATIC_TARGETS}) 781 target_compile_definitions(${_target} PUBLIC -DXML_STATIC) 782 endforeach() 783endif() 784 785# 786# Custom target "run-xmltest" 787# 788if(EXPAT_BUILD_TOOLS AND NOT MSVC) 789 add_custom_target( 790 xmlts-zip-downloaded 791 COMMAND 792 sh -c 'test -f xmlts.zip || wget --output-document=xmlts.zip https://www.w3.org/XML/Test/xmlts20080827.zip' 793 BYPRODUCTS 794 tests/xmlts.zip 795 WORKING_DIRECTORY 796 tests/) 797 798 add_custom_target( 799 xmlts-zip-extracted 800 COMMAND 801 sh -c 'test -d xmlconf || unzip -q xmlts.zip' 802 BYPRODUCTS 803 tests/xmlconf 804 WORKING_DIRECTORY 805 tests/) 806 add_dependencies(xmlts-zip-extracted xmlts-zip-downloaded) 807 808 add_custom_target( 809 xmltest-sh-been-run 810 COMMAND 811 sh -c '${CMAKE_CURRENT_SOURCE_DIR}/tests/xmltest.sh "bash ${CMAKE_CURRENT_BINARY_DIR}/run.sh $<TARGET_FILE:xmlwf>" 2>&1 | tee tests/xmltest.log' 812 BYPRODUCTS 813 tests/xmltest.log) 814 add_dependencies(xmltest-sh-been-run xmlts-zip-extracted xmlwf) 815 816 add_custom_target( 817 xmltest-log-fixed 818 COMMAND 819 ${CMAKE_CURRENT_SOURCE_DIR}/fix-xmltest-log.sh tests/xmltest.log 820 DEPENDS 821 tests/xmltest.log) 822 add_dependencies(xmltest-log-fixed xmltest-sh-been-run) 823 824 add_custom_target( 825 xmltest-log-verified 826 COMMAND 827 diff -u ${CMAKE_CURRENT_SOURCE_DIR}/tests/xmltest.log.expected tests/xmltest.log) 828 add_dependencies(xmltest-log-verified xmltest-log-fixed) 829 830 add_custom_target(run-xmltest) 831 add_dependencies(run-xmltest xmltest-log-verified) 832endif() 833 834# 835# Documentation 836# 837configure_file(Changes changelog COPYONLY) 838expat_install( 839 FILES 840 AUTHORS 841 ${CMAKE_CURRENT_BINARY_DIR}/changelog 842 DESTINATION 843 ${CMAKE_INSTALL_DOCDIR}) 844 845# 846# CMake files for find_package(expat [..] CONFIG [..]) 847# 848configure_package_config_file( 849 cmake/expat-config.cmake.in 850 cmake/expat-config.cmake 851 INSTALL_DESTINATION 852 ${CMAKE_INSTALL_LIBDIR}/cmake/expat-${PROJECT_VERSION}/ 853) 854write_basic_package_version_file( 855 cmake/expat-config-version.cmake 856 COMPATIBILITY SameMajorVersion # i.e. semver 857) 858export( 859 TARGETS 860 expat 861 FILE 862 cmake/expat-targets.cmake # not going to be installed 863) 864expat_install( 865 FILES 866 ${CMAKE_CURRENT_BINARY_DIR}/cmake/expat-config.cmake 867 ${CMAKE_CURRENT_BINARY_DIR}/cmake/expat-config-version.cmake 868 DESTINATION 869 ${CMAKE_INSTALL_LIBDIR}/cmake/expat-${PROJECT_VERSION}/ 870) 871expat_install( 872 EXPORT 873 expat 874 DESTINATION 875 ${CMAKE_INSTALL_LIBDIR}/cmake/expat-${PROJECT_VERSION}/ 876 NAMESPACE 877 expat:: 878) 879 880# 881# CPack 882# 883 884# This effectively disables target "package_source". 885# That is done due to CPack's unfortunate choice of an exclusion list 886# rather than inclusion list. An exclusion list does not protect against 887# unwanted files ending up in the resulting archive in a way that's 888# safe to run from an Expat developer's machine. 889set(CPACK_SOURCE_GENERATOR '') 890 891if(WIN32) 892 set(CPACK_GENERATOR ZIP) 893else() 894 set(CPACK_GENERATOR TGZ) 895endif() 896 897include(CPack) 898 899# 900# Summary 901# 902if(EXPAT_CHAR_TYPE STREQUAL "char") 903 set(_EXPAT_CHAR_TYPE_SUMMARY "char (UTF-8)") 904elseif(EXPAT_CHAR_TYPE STREQUAL "ushort") 905 set(_EXPAT_CHAR_TYPE_SUMMARY "ushort (unsigned short, UTF-16)") 906elseif(EXPAT_CHAR_TYPE STREQUAL "wchar_t") 907 if(WIN32) 908 set(_EXPAT_CHAR_TYPE_SUMMARY "wchar_t (UTF-16)") 909 else() 910 set(_EXPAT_CHAR_TYPE_SUMMARY "wchar_t (UTF-32) // not implemented") 911 endif() 912else() 913 set(_EXPAT_CHAR_TYPE_SUMMARY "ERROR") 914endif() 915# NOTE: We're not accessing global property GENERATOR_IS_MULTI_CONFIG 916# because that would require CMake >=3.9 917if(CMAKE_CONFIGURATION_TYPES) 918 set(_EXPAT_GENERATOR_IS_MULTI_CONFIG TRUE) 919else() 920 set(_EXPAT_GENERATOR_IS_MULTI_CONFIG FALSE) 921endif() 922 923message(STATUS "===========================================================================") 924message(STATUS "") 925message(STATUS "Configuration") 926message(STATUS " Generator .................. ${CMAKE_GENERATOR}") 927if(_EXPAT_GENERATOR_IS_MULTI_CONFIG) 928 message(STATUS " Build types ................ ${CMAKE_CONFIGURATION_TYPES}") 929else() 930 message(STATUS " Build type ................. ${CMAKE_BUILD_TYPE}") 931endif() 932message(STATUS " Prefix ..................... ${CMAKE_INSTALL_PREFIX}") 933message(STATUS " Shared libraries ........... ${EXPAT_SHARED_LIBS}") 934if(MSVC) 935 message(STATUS " Static CRT ................. ${EXPAT_MSVC_STATIC_CRT}") 936endif() 937message(STATUS " Character type ............. ${_EXPAT_CHAR_TYPE_SUMMARY}") 938if(NOT _EXPAT_GENERATOR_IS_MULTI_CONFIG) 939 message(STATUS " Library name postfix ....... ${EXPAT_${_EXPAT_BUILD_TYPE_UPPER}_POSTFIX}") 940endif() 941message(STATUS "") 942message(STATUS " Build documentation ........ ${EXPAT_BUILD_DOCS}") 943message(STATUS " Build examples ............. ${EXPAT_BUILD_EXAMPLES}") 944message(STATUS " Build fuzzers .............. ${EXPAT_BUILD_FUZZERS}") 945message(STATUS " Build tests ................ ${EXPAT_BUILD_TESTS}") 946message(STATUS " Build tools (xmlwf) ........ ${EXPAT_BUILD_TOOLS}") 947message(STATUS " Build pkg-config file ...... ${EXPAT_BUILD_PKGCONFIG}") 948message(STATUS " Install files .............. ${EXPAT_ENABLE_INSTALL}") 949message(STATUS "") 950message(STATUS " Features") 951message(STATUS " // Advanced options, changes not advised") 952message(STATUS " Attributes info .......... ${EXPAT_ATTR_INFO}") 953message(STATUS " Context bytes ............ ${EXPAT_CONTEXT_BYTES}") 954message(STATUS " DTD support .............. ${EXPAT_DTD}") 955message(STATUS " General entities ......... ${EXPAT_GE}") 956message(STATUS " Large size ............... ${EXPAT_LARGE_SIZE}") 957message(STATUS " Minimum size ............. ${EXPAT_MIN_SIZE}") 958message(STATUS " Namespace support ........ ${EXPAT_NS}") 959message(STATUS "") 960message(STATUS " Entropy sources") 961if(WIN32) 962 message(STATUS " rand_s ................... ON") 963else() 964 message(STATUS " getrandom ................ ${HAVE_GETRANDOM}") 965 message(STATUS " syscall SYS_getrandom .... ${HAVE_SYSCALL_GETRANDOM}") 966 message(STATUS " libbsd ................... ${EXPAT_WITH_LIBBSD}") 967 message(STATUS " /dev/random .............. ${EXPAT_DEV_URANDOM}") 968endif() 969message(STATUS "") 970if(CMAKE_GENERATOR STREQUAL "Unix Makefiles") 971 message(STATUS "Continue with") 972 message(STATUS " make") 973 if(EXPAT_BUILD_TESTS) 974 message(STATUS " make test") 975 endif() 976 if(EXPAT_ENABLE_INSTALL) 977 message(STATUS " sudo make install") 978 endif() 979 message(STATUS "") 980endif() 981message(STATUS "===========================================================================") 982