CMakeLists.txt 39 KB

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