CMakeLists.txt 39 KB

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