CMakeLists.txt 36 KB

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