CMakeLists.txt 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713
  1. # This file is copyrighted under the BSD-license for buildsystem files of KDE
  2. # copyright 2010, Patrick Spendrin <[email protected]>
  3. cmake_minimum_required(VERSION 3.1.3)
  4. # This allows controlling documented build time switches
  5. # when Expat is pulled in using the add_subdirectory function, e.g.
  6. #
  7. # set(EXPAT_BUILD_DOCS OFF)
  8. # set(EXPAT_BUILD_TOOLS OFF)
  9. # add_subdirectory(${expat_SOURCE_DIR}/expat ${expat_BINARY_DIR})
  10. #
  11. # would disable compilation of the xmlwf CLI and its man page.
  12. # Without activating behaviour NEW for policy CMP0077 here,
  13. # a user with -Wdev enabled would see warning
  14. #
  15. # Policy CMP0077 is not set: option() honors normal variables. Run "cmake
  16. # --help-policy CMP0077" for policy details. Use the cmake_policy command to
  17. # set the policy and suppress this warning.
  18. #
  19. # For compatibility with older versions of CMake, option is clearing the
  20. # normal variable 'EXPAT_BUILD_DOCS'.
  21. #
  22. # and effectively not be able to adjust option EXPAT_BUILD_DOCS.
  23. #
  24. # For more details please see:
  25. # - https://cmake.org/cmake/help/latest/policy/CMP0077.html
  26. # - https://github.com/libexpat/libexpat/pull/419
  27. #
  28. if(POLICY CMP0077)
  29. cmake_policy(SET CMP0077 NEW)
  30. endif()
  31. project(expat
  32. VERSION
  33. 2.2.10
  34. LANGUAGES
  35. C
  36. )
  37. set(PACKAGE_BUGREPORT "[email protected]")
  38. set(PACKAGE_NAME "expat")
  39. set(PACKAGE_VERSION "${PROJECT_VERSION}")
  40. set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
  41. set(PACKAGE_TARNAME "${PACKAGE_NAME}")
  42. include(CMakePackageConfigHelpers)
  43. include(GNUInstallDirs)
  44. #
  45. # Detect use by means of add_subdirectory
  46. #
  47. get_directory_property(_EXPAT_PARENT_DIRECTORY PARENT_DIRECTORY)
  48. #
  49. # Configuration defaults
  50. #
  51. if(WINCE)
  52. set(_EXPAT_BUILD_TOOLS_DEFAULT OFF)
  53. else()
  54. set(_EXPAT_BUILD_TOOLS_DEFAULT ON)
  55. endif()
  56. if(MSVC OR NOT _EXPAT_BUILD_TOOLS_DEFAULT)
  57. set(_EXPAT_BUILD_DOCS_DEFAULT OFF)
  58. else()
  59. find_program(DOCBOOK_TO_MAN NAMES docbook2x-man db2x_docbook2man docbook2man docbook-to-man)
  60. if(DOCBOOK_TO_MAN)
  61. set(_EXPAT_BUILD_DOCS_DEFAULT ON)
  62. else()
  63. set(_EXPAT_BUILD_DOCS_DEFAULT OFF)
  64. endif()
  65. endif()
  66. if(MSVC)
  67. set(_EXPAT_BUILD_PKGCONFIG_DEFAULT OFF)
  68. else()
  69. set(_EXPAT_BUILD_PKGCONFIG_DEFAULT ON)
  70. endif()
  71. #
  72. # Configuration
  73. #
  74. option(EXPAT_BUILD_TOOLS "build the xmlwf tool for expat library" ${_EXPAT_BUILD_TOOLS_DEFAULT})
  75. option(EXPAT_BUILD_EXAMPLES "build the examples for expat library" ON)
  76. option(EXPAT_BUILD_TESTS "build the tests for expat library" ON)
  77. option(EXPAT_SHARED_LIBS "build a shared expat library" ON)
  78. option(EXPAT_BUILD_DOCS "build man page for xmlwf" ${_EXPAT_BUILD_DOCS_DEFAULT})
  79. option(EXPAT_BUILD_FUZZERS "build fuzzers for the expat library" OFF)
  80. option(EXPAT_BUILD_PKGCONFIG "build pkg-config file" ${_EXPAT_BUILD_PKGCONFIG_DEFAULT})
  81. option(EXPAT_OSSFUZZ_BUILD "build fuzzers via ossfuzz for the expat library" OFF)
  82. if(UNIX OR _EXPAT_HELP)
  83. option(EXPAT_WITH_LIBBSD "utilize libbsd (for arc4random_buf)" OFF)
  84. endif()
  85. option(EXPAT_ENABLE_INSTALL "install expat files in cmake install target" ON)
  86. set(EXPAT_CONTEXT_BYTES 1024 CACHE STRING "Define to specify how much context to retain around the current parse point")
  87. mark_as_advanced(EXPAT_CONTEXT_BYTES)
  88. option(EXPAT_DTD "Define to make parameter entity parsing functionality available" ON)
  89. mark_as_advanced(EXPAT_DTD)
  90. option(EXPAT_NS "Define to make XML Namespaces functionality available" ON)
  91. mark_as_advanced(EXPAT_NS)
  92. option(EXPAT_WARNINGS_AS_ERRORS "Treat all compiler warnings as errors" OFF)
  93. if(UNIX OR _EXPAT_HELP)
  94. option(EXPAT_DEV_URANDOM "Define to include code reading entropy from `/dev/urandom'." ON)
  95. set(EXPAT_WITH_GETRANDOM "AUTO" CACHE STRING
  96. "Make use of getrandom function (ON|OFF|AUTO) [default=AUTO]")
  97. set(EXPAT_WITH_SYS_GETRANDOM "AUTO" CACHE STRING
  98. "Make use of syscall SYS_getrandom (ON|OFF|AUTO) [default=AUTO]")
  99. mark_as_advanced(EXPAT_DEV_URANDOM)
  100. endif()
  101. set(EXPAT_CHAR_TYPE "char" CACHE STRING "Character type to use (char|ushort|wchar_t) [default=char]")
  102. option(EXPAT_ATTR_INFO "Define to allow retrieving the byte offsets for attribute names and values" OFF)
  103. mark_as_advanced(EXPAT_ATTR_INFO)
  104. option(EXPAT_LARGE_SIZE "Make XML_GetCurrent* functions return <(unsigned) long long> rather than <(unsigned) long>" OFF)
  105. mark_as_advanced(EXPAT_LARGE_SIZE)
  106. option(EXPAT_MIN_SIZE "Get a smaller (but slower) parser (in particular avoid multiple copies of the tokenizer)" OFF)
  107. mark_as_advanced(EXPAT_MIN_SIZE)
  108. if(MSVC OR _EXPAT_HELP)
  109. set(EXPAT_MSVC_STATIC_CRT OFF CACHE BOOL "Use /MT flag (static CRT) when compiling in MSVC")
  110. endif()
  111. #
  112. # Environment checks
  113. #
  114. if(EXPAT_WITH_LIBBSD)
  115. find_library(LIB_BSD NAMES bsd)
  116. if(NOT LIB_BSD)
  117. message(SEND_ERROR "EXPAT_WITH_LIBBSD option is enabled, but libbsd was not found")
  118. else()
  119. set(HAVE_LIBBSD TRUE)
  120. endif()
  121. endif()
  122. macro(_expat_copy_bool_int source_ref dest_ref)
  123. if(${source_ref})
  124. set(${dest_ref} 1)
  125. else()
  126. set(${dest_ref} 0)
  127. endif()
  128. endmacro()
  129. if(EXPAT_LARGE_SIZE)
  130. add_definitions(-DXML_LARGE_SIZE)
  131. endif()
  132. if(EXPAT_MIN_SIZE)
  133. add_definitions(-DXML_MIN_SIZE)
  134. endif()
  135. if(EXPAT_CHAR_TYPE STREQUAL "char")
  136. set(_EXPAT_UNICODE OFF)
  137. set(_EXPAT_UNICODE_WCHAR_T OFF)
  138. elseif(EXPAT_CHAR_TYPE STREQUAL "ushort")
  139. set(_EXPAT_UNICODE ON)
  140. set(_EXPAT_UNICODE_WCHAR_T OFF)
  141. if(EXPAT_BUILD_EXAMPLES)
  142. 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.")
  143. endif()
  144. if(EXPAT_BUILD_TESTS)
  145. 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.")
  146. endif()
  147. if(EXPAT_BUILD_TOOLS)
  148. 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.")
  149. endif()
  150. elseif(EXPAT_CHAR_TYPE STREQUAL "wchar_t")
  151. set(_EXPAT_UNICODE ON)
  152. set(_EXPAT_UNICODE_WCHAR_T ON)
  153. if(NOT WIN32)
  154. string(FIND "${CMAKE_C_FLAGS}" "-fshort-wchar" _expat_short_wchar_found)
  155. if(${_expat_short_wchar_found} EQUAL "-1")
  156. 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.")
  157. endif()
  158. if (EXPAT_BUILD_TOOLS)
  159. 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.")
  160. endif()
  161. endif()
  162. else()
  163. message(SEND_ERROR "Option -DEXPAT_CHAR_TYPE=(char|ushort|wchar_t) cannot be \"${EXPAT_CHAR_TYPE}\".")
  164. endif()
  165. if(_EXPAT_UNICODE)
  166. add_definitions(-DXML_UNICODE) # for unsigned short
  167. if(_EXPAT_UNICODE_WCHAR_T)
  168. add_definitions(-DXML_UNICODE_WCHAR_T) # for wchar_t
  169. endif()
  170. endif()
  171. include(${CMAKE_CURRENT_LIST_DIR}/ConfigureChecks.cmake)
  172. macro(evaluate_detection_results use_ref have_ref thing_lower thing_title)
  173. if(${use_ref} AND NOT (${use_ref} STREQUAL "AUTO") AND NOT ${have_ref})
  174. message(SEND_ERROR
  175. "Use of ${thing_lower} was enforced by ${use_ref}=ON but it could not be found.")
  176. elseif(NOT ${use_ref} AND ${have_ref})
  177. message("${thing_title} was found but it will not be used due to ${use_ref}=OFF.")
  178. set(${have_ref} 0)
  179. endif()
  180. endmacro()
  181. if(NOT WIN32)
  182. evaluate_detection_results(EXPAT_WITH_GETRANDOM HAVE_GETRANDOM "function getrandom" "Function getrandom")
  183. evaluate_detection_results(EXPAT_WITH_SYS_GETRANDOM HAVE_SYSCALL_GETRANDOM "syscall SYS_getrandom" "Syscall SYS_getrandom")
  184. endif()
  185. _expat_copy_bool_int(EXPAT_ATTR_INFO XML_ATTR_INFO)
  186. _expat_copy_bool_int(EXPAT_DTD XML_DTD)
  187. _expat_copy_bool_int(EXPAT_LARGE_SIZE XML_LARGE_SIZE)
  188. _expat_copy_bool_int(EXPAT_MIN_SIZE XML_MIN_SIZE)
  189. _expat_copy_bool_int(EXPAT_NS XML_NS)
  190. if(NOT WIN32)
  191. _expat_copy_bool_int(EXPAT_DEV_URANDOM XML_DEV_URANDOM)
  192. endif()
  193. set(XML_CONTEXT_BYTES ${EXPAT_CONTEXT_BYTES})
  194. macro(expat_install)
  195. if(EXPAT_ENABLE_INSTALL)
  196. install(${ARGN})
  197. endif()
  198. endmacro()
  199. configure_file(expat_config.h.cmake "${CMAKE_CURRENT_BINARY_DIR}/expat_config.h")
  200. add_definitions(-DHAVE_EXPAT_CONFIG_H)
  201. expat_install(FILES "${CMAKE_CURRENT_BINARY_DIR}/expat_config.h" DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
  202. set(EXTRA_COMPILE_FLAGS)
  203. if(FLAG_NO_STRICT_ALIASING)
  204. set(EXTRA_COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS} -fno-strict-aliasing")
  205. endif()
  206. if(FLAG_VISIBILITY)
  207. add_definitions(-DXML_ENABLE_VISIBILITY=1)
  208. set(EXTRA_COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS} -fvisibility=hidden")
  209. endif()
  210. if (EXPAT_WARNINGS_AS_ERRORS)
  211. if(MSVC)
  212. add_definitions(/WX)
  213. else()
  214. set(EXTRA_COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS} -Werror")
  215. endif()
  216. endif()
  217. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_COMPILE_FLAGS}")
  218. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_COMPILE_FLAGS}")
  219. if (MSVC)
  220. if (EXPAT_MSVC_STATIC_CRT)
  221. message("-- Using static CRT ${EXPAT_MSVC_STATIC_CRT}")
  222. foreach(flag_var
  223. CMAKE_CXX_FLAGS_DEBUG
  224. CMAKE_CXX_FLAGS_RELEASE
  225. CMAKE_CXX_FLAGS_MINSIZEREL
  226. CMAKE_CXX_FLAGS_RELWITHDEBINFO
  227. CMAKE_C_FLAGS_DEBUG
  228. CMAKE_C_FLAGS_RELEASE
  229. CMAKE_C_FLAGS_MINSIZEREL
  230. CMAKE_C_FLAGS_RELWITHDEBINFO
  231. )
  232. string(REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
  233. endforeach()
  234. endif()
  235. endif()
  236. include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/lib)
  237. if(MSVC)
  238. add_definitions(-D_CRT_SECURE_NO_WARNINGS -wd4996)
  239. endif()
  240. if(WIN32)
  241. if(_EXPAT_UNICODE_WCHAR_T)
  242. set(_POSTFIX_WIDE "w")
  243. endif()
  244. if(MSVC AND NOT EXPAT_SHARED_LIBS)
  245. if(EXPAT_MSVC_STATIC_CRT)
  246. set(_POSTFIX_CRT "MT")
  247. else()
  248. set(_POSTFIX_CRT "MD")
  249. endif()
  250. endif()
  251. foreach(postfix_var
  252. CMAKE_DEBUG_POSTFIX
  253. CMAKE_RELEASE_POSTFIX
  254. CMAKE_MINSIZEREL_POSTFIX
  255. CMAKE_RELWITHDEBINFO_POSTFIX
  256. )
  257. if(postfix_var STREQUAL "CMAKE_DEBUG_POSTFIX")
  258. set(_POSTFIX_DEBUG "d")
  259. else()
  260. set(_POSTFIX_DEBUG "")
  261. endif()
  262. set(${postfix_var} "${_POSTFIX_WIDE}${_POSTFIX_DEBUG}${_POSTFIX_CRT}" CACHE STRING "Windows binary postfix, e.g. libexpat<postfix=[w][d][MD|MT]>.lib")
  263. endforeach()
  264. endif()
  265. #
  266. # C library
  267. #
  268. set(expat_SRCS
  269. lib/xmlparse.c
  270. lib/xmlrole.c
  271. lib/xmltok.c
  272. # NOTE: ISO C forbids an empty translation unit
  273. # lib/xmltok_impl.c
  274. # lib/xmltok_ns.c
  275. )
  276. if(EXPAT_SHARED_LIBS)
  277. set(_SHARED SHARED)
  278. if(MSVC)
  279. set(expat_SRCS ${expat_SRCS} lib/libexpat.def)
  280. endif()
  281. else()
  282. set(_SHARED STATIC)
  283. endif()
  284. # Avoid colliding with Expat.dll of Perl's XML::Parser::Expat
  285. if(WIN32 AND NOT MINGW)
  286. set(_EXPAT_OUTPUT_NAME libexpat) # CMAKE_*_POSTFIX applies, see above
  287. else()
  288. if(_EXPAT_UNICODE)
  289. set(_EXPAT_OUTPUT_NAME expatw)
  290. else()
  291. set(_EXPAT_OUTPUT_NAME expat)
  292. endif()
  293. endif()
  294. add_library(expat ${_SHARED} ${expat_SRCS})
  295. if(EXPAT_WITH_LIBBSD)
  296. target_link_libraries(expat ${LIB_BSD})
  297. endif()
  298. set(LIBCURRENT 7) # sync
  299. set(LIBREVISION 12) # with
  300. set(LIBAGE 6) # configure.ac!
  301. math(EXPR LIBCURRENT_MINUS_AGE "${LIBCURRENT} - ${LIBAGE}")
  302. set_property(TARGET expat PROPERTY OUTPUT_NAME "${_EXPAT_OUTPUT_NAME}")
  303. if(NOT WIN32)
  304. set_property(TARGET expat PROPERTY VERSION ${LIBCURRENT_MINUS_AGE}.${LIBAGE}.${LIBREVISION})
  305. set_property(TARGET expat PROPERTY SOVERSION ${LIBCURRENT_MINUS_AGE})
  306. set_property(TARGET expat PROPERTY NO_SONAME ${NO_SONAME})
  307. endif()
  308. target_include_directories(expat
  309. INTERFACE
  310. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/lib>
  311. $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
  312. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  313. )
  314. if(NOT EXPAT_SHARED_LIBS AND WIN32)
  315. target_compile_definitions(expat PUBLIC -DXML_STATIC)
  316. endif()
  317. expat_install(TARGETS expat EXPORT expat
  318. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  319. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  320. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
  321. expat_install(FILES lib/expat.h lib/expat_external.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
  322. #
  323. # pkg-config file
  324. #
  325. if(EXPAT_BUILD_PKGCONFIG)
  326. set(prefix ${CMAKE_INSTALL_PREFIX})
  327. set(exec_prefix "\${prefix}")
  328. set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
  329. set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
  330. configure_file(expat.pc.in ${CMAKE_CURRENT_BINARY_DIR}/expat.pc @ONLY)
  331. expat_install(FILES ${CMAKE_CURRENT_BINARY_DIR}/expat.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
  332. endif()
  333. #
  334. # C command line tool xmlwf
  335. #
  336. if(EXPAT_BUILD_TOOLS)
  337. set(xmlwf_SRCS
  338. xmlwf/xmlwf.c
  339. xmlwf/xmlfile.c
  340. xmlwf/codepage.c
  341. xmlwf/readfilemap.c
  342. )
  343. add_executable(xmlwf ${xmlwf_SRCS})
  344. set_property(TARGET xmlwf PROPERTY RUNTIME_OUTPUT_DIRECTORY xmlwf)
  345. target_link_libraries(xmlwf expat)
  346. expat_install(TARGETS xmlwf DESTINATION ${CMAKE_INSTALL_BINDIR})
  347. if(MINGW AND _EXPAT_UNICODE_WCHAR_T)
  348. # https://gcc.gnu.org/onlinedocs/gcc/x86-Windows-Options.html
  349. set_target_properties(xmlwf PROPERTIES LINK_FLAGS -municode)
  350. endif()
  351. if(EXPAT_BUILD_DOCS)
  352. file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/doc)
  353. add_custom_target(
  354. xmlwf-manpage
  355. COMMAND
  356. "${DOCBOOK_TO_MAN}" "${PROJECT_SOURCE_DIR}/doc/xmlwf.xml" && mv "XMLWF.1" "${PROJECT_BINARY_DIR}/doc/xmlwf.1"
  357. BYPRODUCTS
  358. doc/xmlwf.1)
  359. add_dependencies(expat xmlwf-manpage)
  360. expat_install(FILES "${PROJECT_BINARY_DIR}/doc/xmlwf.1" DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
  361. elseif(EXISTS ${PROJECT_SOURCE_DIR}/doc/xmlwf.1)
  362. expat_install(FILES "${PROJECT_SOURCE_DIR}/doc/xmlwf.1" DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
  363. endif()
  364. endif()
  365. #
  366. # C code examples
  367. #
  368. if(EXPAT_BUILD_EXAMPLES)
  369. add_executable(elements examples/elements.c)
  370. set_property(TARGET elements PROPERTY RUNTIME_OUTPUT_DIRECTORY examples)
  371. target_link_libraries(elements expat)
  372. add_executable(outline examples/outline.c)
  373. set_property(TARGET outline PROPERTY RUNTIME_OUTPUT_DIRECTORY examples)
  374. target_link_libraries(outline expat)
  375. endif()
  376. #
  377. # C/C++ test runners
  378. #
  379. if(EXPAT_BUILD_TESTS)
  380. ## these are unittests that can be run on any platform
  381. enable_language(CXX)
  382. enable_testing()
  383. set(test_SRCS
  384. tests/chardata.c
  385. tests/memcheck.c
  386. tests/minicheck.c
  387. tests/structdata.c
  388. )
  389. if(NOT MSVC)
  390. if(MINGW)
  391. set(host whatever-mingw32) # for nothing but run.sh
  392. endif()
  393. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/run.sh.in run.sh @ONLY)
  394. endif()
  395. function(expat_add_test _name _file)
  396. if(MSVC)
  397. add_test(NAME ${_name} COMMAND ${_file})
  398. else()
  399. add_test(NAME ${_name} COMMAND bash run.sh ${_file})
  400. endif()
  401. endfunction()
  402. add_executable(runtests tests/runtests.c ${test_SRCS})
  403. set_property(TARGET runtests PROPERTY RUNTIME_OUTPUT_DIRECTORY tests)
  404. target_link_libraries(runtests expat)
  405. expat_add_test(runtests $<TARGET_FILE:runtests>)
  406. add_executable(runtestspp tests/runtestspp.cpp ${test_SRCS})
  407. set_property(TARGET runtestspp PROPERTY RUNTIME_OUTPUT_DIRECTORY tests)
  408. target_link_libraries(runtestspp expat)
  409. expat_add_test(runtestspp $<TARGET_FILE:runtestspp>)
  410. endif()
  411. if(EXPAT_BUILD_FUZZERS)
  412. if(NOT "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
  413. message(SEND_ERROR
  414. "Building fuzz targets without Clang (but ${CMAKE_C_COMPILER_ID}) "
  415. "is not supported. Please set "
  416. "-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++.")
  417. endif()
  418. string(FIND "${CMAKE_C_FLAGS}" "-fsanitize" sanitizer_present)
  419. if(${sanitizer_present} EQUAL "-1")
  420. message(WARNING
  421. "There was no sanitizer present when building the fuzz targets. "
  422. "This is likely in error - consider adding "
  423. "-DCMAKE_C_FLAGS='-fsanitize=<sanitizer>' and "
  424. "-DCMAKE_CXX_FLAGS='-fsanitize=<sanitizer>' and "
  425. "-DCMAKE_EXE_LINKER_FLAGS='-fsanitize=<sanitizer>' and "
  426. "-DCMAKE_MODULE_LINKER_FLAGS='-fsanitize=<sanitizer>' and "
  427. "-DCMAKE_SHARED_LINKER_FLAGS='-fsanitize=<sanitizer>' to your cmake "
  428. "execution.")
  429. endif()
  430. if(EXPAT_OSSFUZZ_BUILD AND NOT DEFINED ENV{LIB_FUZZING_ENGINE})
  431. message(SEND_ERROR
  432. "OSS-Fuzz builds require the environment variable "
  433. "LIB_FUZZING_ENGINE to be set. If you are seeing this "
  434. "warning, it points to a deeper problem in the ossfuzz "
  435. "build setup.")
  436. endif()
  437. set(encoding_types UTF-16 UTF-8 ISO-8859-1 US-ASCII UTF-16BE UTF-16LE)
  438. set(fuzz_targets xml_parse_fuzzer xml_parsebuffer_fuzzer)
  439. add_library(fuzzpat STATIC ${expat_SRCS})
  440. if(NOT EXPAT_OSSFUZZ_BUILD)
  441. target_compile_options(fuzzpat PRIVATE -fsanitize=fuzzer-no-link)
  442. endif()
  443. foreach(fuzz_target ${fuzz_targets})
  444. foreach(encoding_type ${encoding_types})
  445. set(target_name ${fuzz_target}_${encoding_type})
  446. add_executable(${target_name} fuzz/${fuzz_target}.c)
  447. target_link_libraries(${target_name} fuzzpat)
  448. target_compile_definitions(${target_name}
  449. PRIVATE ENCODING_FOR_FUZZING=${encoding_type})
  450. if(NOT EXPAT_OSSFUZZ_BUILD)
  451. target_compile_options(${target_name} PRIVATE -fsanitize=fuzzer-no-link)
  452. endif()
  453. # NOTE: Avoiding target_link_options here only because it needs CMake >=3.13
  454. if(EXPAT_OSSFUZZ_BUILD)
  455. set_target_properties(${target_name} PROPERTIES LINK_FLAGS $ENV{LIB_FUZZING_ENGINE})
  456. set_target_properties(${target_name} PROPERTIES LINKER_LANGUAGE "CXX")
  457. else()
  458. set_target_properties(${target_name} PROPERTIES LINK_FLAGS -fsanitize=fuzzer)
  459. endif()
  460. set_property(
  461. TARGET ${target_name} PROPERTY RUNTIME_OUTPUT_DIRECTORY fuzz)
  462. endforeach()
  463. endforeach()
  464. else()
  465. if(EXPAT_OSSFUZZ_BUILD)
  466. message(SEND_ERROR
  467. "Attempting to perform an ossfuzz build without turning on the fuzzer build. "
  468. "This is likely in error - consider adding "
  469. "-DEXPAT_BUILD_FUZZERS=ON to your cmake execution.")
  470. endif()
  471. endif()
  472. #
  473. # Custom target "run-xmltest"
  474. #
  475. if(EXPAT_BUILD_TOOLS AND NOT MSVC)
  476. add_custom_target(
  477. xmlts-zip-downloaded
  478. COMMAND
  479. sh -c 'test -f xmlts.zip || wget --output-document=xmlts.zip https://www.w3.org/XML/Test/xmlts20080827.zip'
  480. BYPRODUCTS
  481. tests/xmlts.zip
  482. WORKING_DIRECTORY
  483. tests/)
  484. add_custom_target(
  485. xmlts-zip-extracted
  486. COMMAND
  487. sh -c 'test -d xmlconf || unzip -q xmlts.zip'
  488. BYPRODUCTS
  489. tests/xmlconf
  490. WORKING_DIRECTORY
  491. tests/)
  492. add_dependencies(xmlts-zip-extracted xmlts-zip-downloaded)
  493. add_custom_target(
  494. xmltest-sh-been-run
  495. COMMAND
  496. 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'
  497. BYPRODUCTS
  498. tests/xmltest.log)
  499. add_dependencies(xmltest-sh-been-run xmlts-zip-extracted xmlwf)
  500. add_custom_target(
  501. xmltest-log-fixed
  502. COMMAND
  503. ${CMAKE_CURRENT_SOURCE_DIR}/fix-xmltest-log.sh tests/xmltest.log
  504. DEPENDS
  505. tests/xmltest.log)
  506. add_dependencies(xmltest-log-fixed xmltest-sh-been-run)
  507. add_custom_target(
  508. xmltest-log-verified
  509. COMMAND
  510. diff -u ${CMAKE_CURRENT_SOURCE_DIR}/tests/xmltest.log.expected tests/xmltest.log)
  511. add_dependencies(xmltest-log-verified xmltest-log-fixed)
  512. add_custom_target(run-xmltest)
  513. add_dependencies(run-xmltest xmltest-log-verified)
  514. endif()
  515. #
  516. # Documentation
  517. #
  518. configure_file(Changes changelog COPYONLY)
  519. expat_install(
  520. FILES
  521. AUTHORS
  522. ${CMAKE_CURRENT_BINARY_DIR}/changelog
  523. DESTINATION
  524. ${CMAKE_INSTALL_DOCDIR})
  525. #
  526. # CMake files for find_package(expat [..] CONFIG [..])
  527. #
  528. configure_package_config_file(
  529. cmake/expat-config.cmake.in
  530. cmake/expat-config.cmake
  531. INSTALL_DESTINATION
  532. ${CMAKE_INSTALL_LIBDIR}/cmake/expat-${PROJECT_VERSION}/
  533. )
  534. write_basic_package_version_file(
  535. cmake/expat-config-version.cmake
  536. COMPATIBILITY SameMajorVersion # i.e. semver
  537. )
  538. export(
  539. TARGETS
  540. expat
  541. FILE
  542. cmake/expat-targets.cmake # not going to be installed
  543. )
  544. expat_install(
  545. FILES
  546. ${CMAKE_CURRENT_BINARY_DIR}/cmake/expat-config.cmake
  547. ${CMAKE_CURRENT_BINARY_DIR}/cmake/expat-config-version.cmake
  548. DESTINATION
  549. ${CMAKE_INSTALL_LIBDIR}/cmake/expat-${PROJECT_VERSION}/
  550. )
  551. expat_install(
  552. EXPORT
  553. expat
  554. DESTINATION
  555. ${CMAKE_INSTALL_LIBDIR}/cmake/expat-${PROJECT_VERSION}/
  556. NAMESPACE
  557. expat::
  558. )
  559. #
  560. # CPack
  561. #
  562. # This effectively disables target "package_source".
  563. # That is done due to CPack's unfortunate choice of an exclusion list
  564. # rather than inclusion list. An exclusion list does not protect against
  565. # unwanted files ending up in the resulting archive in a way that's
  566. # safe to run from an Expat developer's machine.
  567. set(CPACK_SOURCE_GENERATOR '')
  568. if(WIN32)
  569. set(CPACK_GENERATOR ZIP)
  570. else()
  571. set(CPACK_GENERATOR TGZ)
  572. endif()
  573. include(CPack)
  574. #
  575. # Summary
  576. #
  577. if(EXPAT_CHAR_TYPE STREQUAL "char")
  578. set(_EXPAT_CHAR_TYPE_SUMMARY "char (UTF-8)")
  579. elseif(EXPAT_CHAR_TYPE STREQUAL "ushort")
  580. set(_EXPAT_CHAR_TYPE_SUMMARY "ushort (unsigned short, UTF-16)")
  581. elseif(EXPAT_CHAR_TYPE STREQUAL "wchar_t")
  582. if(WIN32)
  583. set(_EXPAT_CHAR_TYPE_SUMMARY "wchar_t (UTF-16)")
  584. else()
  585. set(_EXPAT_CHAR_TYPE_SUMMARY "wchar_t (UTF-32) // not implemented")
  586. endif()
  587. else()
  588. set(_EXPAT_CHAR_TYPE_SUMMARY "ERROR")
  589. endif()
  590. string(TOUPPER "${CMAKE_BUILD_TYPE}" _EXPAT_BUILD_TYPE_UPPER)
  591. message(STATUS "===========================================================================")
  592. message(STATUS "")
  593. message(STATUS "Configuration")
  594. message(STATUS " Prefix ..................... ${CMAKE_INSTALL_PREFIX}")
  595. message(STATUS " Build type ................. ${CMAKE_BUILD_TYPE}")
  596. message(STATUS " Shared libraries ........... ${EXPAT_SHARED_LIBS}")
  597. if(MSVC)
  598. message(STATUS " Static CRT ................. ${EXPAT_MSVC_STATIC_CRT}")
  599. endif()
  600. message(STATUS " Character type ............. ${_EXPAT_CHAR_TYPE_SUMMARY}")
  601. if(WIN32)
  602. message(STATUS " Binary postfix ............. ${CMAKE_${_EXPAT_BUILD_TYPE_UPPER}_POSTFIX}")
  603. endif()
  604. message(STATUS "")
  605. message(STATUS " Build documentation ........ ${EXPAT_BUILD_DOCS}")
  606. message(STATUS " Build examples ............. ${EXPAT_BUILD_EXAMPLES}")
  607. message(STATUS " Build fuzzers .............. ${EXPAT_BUILD_FUZZERS}")
  608. message(STATUS " Build tests ................ ${EXPAT_BUILD_TESTS}")
  609. message(STATUS " Build tools (xmlwf) ........ ${EXPAT_BUILD_TOOLS}")
  610. message(STATUS " Build pkg-config file ...... ${EXPAT_BUILD_PKGCONFIG}")
  611. message(STATUS " Install files .............. ${EXPAT_ENABLE_INSTALL}")
  612. message(STATUS "")
  613. message(STATUS " Features")
  614. message(STATUS " // Advanced options, changes not advised")
  615. message(STATUS " Attributes info .......... ${EXPAT_ATTR_INFO}")
  616. message(STATUS " Context bytes ............ ${EXPAT_CONTEXT_BYTES}")
  617. message(STATUS " DTD support .............. ${EXPAT_DTD}")
  618. message(STATUS " Large size ............... ${EXPAT_LARGE_SIZE}")
  619. message(STATUS " Minimum size ............. ${EXPAT_MIN_SIZE}")
  620. message(STATUS " Namespace support ........ ${EXPAT_NS}")
  621. message(STATUS "")
  622. message(STATUS " Entropy sources")
  623. if(WIN32)
  624. message(STATUS " rand_s ................... ON")
  625. else()
  626. message(STATUS " getrandom ................ ${HAVE_GETRANDOM}")
  627. message(STATUS " syscall SYS_getrandom .... ${HAVE_SYSCALL_GETRANDOM}")
  628. message(STATUS " libbsd ................... ${EXPAT_WITH_LIBBSD}")
  629. message(STATUS " /dev/random .............. ${EXPAT_DEV_URANDOM}")
  630. endif()
  631. message(STATUS "")
  632. if(CMAKE_GENERATOR STREQUAL "Unix Makefiles")
  633. message(STATUS "Continue with")
  634. message(STATUS " make")
  635. if(EXPAT_BUILD_TESTS)
  636. message(STATUS " make test")
  637. endif()
  638. if(EXPAT_ENABLE_INSTALL)
  639. message(STATUS " sudo make install")
  640. endif()
  641. message(STATUS "")
  642. endif()
  643. message(STATUS "===========================================================================")