1 # This file is copyrighted under the BSD-license for buildsystem files of KDE
2 # copyright 2010, Patrick Spendrin <ps_ml@gmx.de>
4 cmake_minimum_required(VERSION 3.1.3)
13 set(PACKAGE_BUGREPORT "expat-bugs@libexpat.org")
14 set(PACKAGE_NAME "expat")
15 set(PACKAGE_VERSION "${PROJECT_VERSION}")
16 set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
17 set(PACKAGE_TARNAME "${PACKAGE_NAME}")
19 include(CMakePackageConfigHelpers)
20 include(GNUInstallDirs)
23 # Configuration defaults
26 set(_EXPAT_BUILD_TOOLS_DEFAULT OFF)
28 set(_EXPAT_BUILD_TOOLS_DEFAULT ON)
30 if(MSVC OR NOT _EXPAT_BUILD_TOOLS_DEFAULT)
31 set(_EXPAT_BUILD_DOCS_DEFAULT OFF)
33 find_program(DOCBOOK_TO_MAN NAMES docbook2x-man db2x_docbook2man docbook2man docbook-to-man)
35 set(_EXPAT_BUILD_DOCS_DEFAULT ON)
37 set(_EXPAT_BUILD_DOCS_DEFAULT OFF)
44 option(EXPAT_BUILD_TOOLS "build the xmlwf tool for expat library" ${_EXPAT_BUILD_TOOLS_DEFAULT})
45 option(EXPAT_BUILD_EXAMPLES "build the examples for expat library" ON)
46 option(EXPAT_BUILD_TESTS "build the tests for expat library" ON)
47 option(EXPAT_SHARED_LIBS "build a shared expat library" ON)
48 option(EXPAT_BUILD_DOCS "build man page for xmlwf" ${_EXPAT_BUILD_DOCS_DEFAULT})
49 option(EXPAT_BUILD_FUZZERS "build fuzzers for the expat library" OFF)
50 option(EXPAT_WITH_LIBBSD "utilize libbsd (for arc4random_buf)" OFF)
51 option(EXPAT_ENABLE_INSTALL "install expat files in cmake install target" ON)
52 set(EXPAT_CONTEXT_BYTES 1024 CACHE STRING "Define to specify how much context to retain around the current parse point")
53 mark_as_advanced(EXPAT_CONTEXT_BYTES)
54 option(EXPAT_DTD "Define to make parameter entity parsing functionality available" ON)
55 mark_as_advanced(EXPAT_DTD)
56 option(EXPAT_NS "Define to make XML Namespaces functionality available" ON)
57 mark_as_advanced(EXPAT_NS)
58 option(EXPAT_WARNINGS_AS_ERRORS "Treat all compiler warnings as errors" OFF)
59 if(NOT WIN32 OR _EXPAT_HELP)
60 option(EXPAT_DEV_URANDOM "Define to include code reading entropy from `/dev/urandom'." ON)
61 set(EXPAT_WITH_GETRANDOM "AUTO" CACHE STRING
62 "Make use of getrandom function (ON|OFF|AUTO) [default=AUTO]")
63 set(EXPAT_WITH_SYS_GETRANDOM "AUTO" CACHE STRING
64 "Make use of syscall SYS_getrandom (ON|OFF|AUTO) [default=AUTO]")
65 mark_as_advanced(EXPAT_DEV_URANDOM)
67 option(EXPAT_UNICODE "Use UTF-16 encoded chars (two bytes) instead of UTF-8" OFF)
68 option(EXPAT_UNICODE_WCHAR_T "Use wchar_t to represent UTF-16 instead of unsigned short" OFF)
69 option(EXPAT_ATTR_INFO "Define to allow retrieving the byte offsets for attribute names and values" OFF)
70 mark_as_advanced(EXPAT_ATTR_INFO)
71 option(EXPAT_LARGE_SIZE "Make XML_GetCurrent* functions return <(unsigned) long long> rather than <(unsigned) long>" OFF)
72 mark_as_advanced(EXPAT_LARGE_SIZE)
73 option(EXPAT_MIN_SIZE "Get a smaller (but slower) parser (in particular avoid multiple copies of the tokenizer)" OFF)
74 mark_as_advanced(EXPAT_MIN_SIZE)
75 if(MSVC OR _EXPAT_HELP)
76 set(EXPAT_MSVC_STATIC_CRT OFF CACHE BOOL "Use /MT flag (static CRT) when compiling in MSVC")
83 find_library(LIB_BSD NAMES bsd)
85 message(SEND_ERROR "EXPAT_WITH_LIBBSD option is enabled, but libbsd was not found")
91 macro(_expat_copy_bool_int source_ref dest_ref)
100 add_definitions(-DXML_LARGE_SIZE)
104 add_definitions(-DXML_MIN_SIZE)
107 if(EXPAT_UNICODE_WCHAR_T AND NOT EXPAT_UNICODE)
108 message(SEND_ERROR "Option EXPAT_UNICODE_WCHAR_T=ON may not be used without EXPAT_UNICODE=ON.")
109 set(EXPAT_UNICODE ON)
110 endif(EXPAT_UNICODE_WCHAR_T AND NOT EXPAT_UNICODE)
112 if(EXPAT_BUILD_TOOLS AND (EXPAT_UNICODE AND NOT EXPAT_UNICODE_WCHAR_T))
113 message(SEND_ERROR "The xmlwf tool can not be built with option EXPAT_UNICODE_WCHAR_T=OFF and EXPAT_UNICODE=ON. Either set EXPAT_UNICODE_WCHAR_T=ON or EXPAT_BUILD_TOOLS=OFF.")
116 include(${CMAKE_CURRENT_LIST_DIR}/ConfigureChecks.cmake)
118 macro(evaluate_detection_results use_ref have_ref thing_lower thing_title)
119 if(${use_ref} AND NOT (${use_ref} STREQUAL "AUTO") AND NOT ${have_ref})
121 "Use of ${thing_lower} was enforced by ${use_ref}=ON but it could not be found.")
122 elseif(NOT ${use_ref} AND ${have_ref})
123 message("${thing_title} was found but it will not be used due to ${use_ref}=OFF.")
129 evaluate_detection_results(EXPAT_WITH_GETRANDOM HAVE_GETRANDOM "function getrandom" "Function getrandom")
130 evaluate_detection_results(EXPAT_WITH_SYS_GETRANDOM HAVE_SYSCALL_GETRANDOM "syscall SYS_getrandom" "Syscall SYS_getrandom")
133 _expat_copy_bool_int(EXPAT_ATTR_INFO XML_ATTR_INFO)
134 _expat_copy_bool_int(EXPAT_DTD XML_DTD)
135 _expat_copy_bool_int(EXPAT_LARGE_SIZE XML_LARGE_SIZE)
136 _expat_copy_bool_int(EXPAT_MIN_SIZE XML_MIN_SIZE)
137 _expat_copy_bool_int(EXPAT_NS XML_NS)
138 _expat_copy_bool_int(EXPAT_UNICODE XML_UNICODE)
139 _expat_copy_bool_int(EXPAT_UNICODE_WCHAR_T XML_UNICODE_WCHAR_T)
141 _expat_copy_bool_int(EXPAT_DEV_URANDOM XML_DEV_URANDOM)
143 set(XML_CONTEXT_BYTES ${EXPAT_CONTEXT_BYTES})
146 if(EXPAT_ENABLE_INSTALL)
151 configure_file(expat_config.h.cmake "${CMAKE_CURRENT_BINARY_DIR}/expat_config.h")
152 add_definitions(-DHAVE_EXPAT_CONFIG_H)
153 expat_install(FILES "${CMAKE_CURRENT_BINARY_DIR}/expat_config.h" DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
156 set(EXTRA_COMPILE_FLAGS)
157 if(FLAG_NO_STRICT_ALIASING)
158 set(EXTRA_COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS} -fno-strict-aliasing")
161 add_definitions(-DXML_ENABLE_VISIBILITY=1)
162 set(EXTRA_COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS} -fvisibility=hidden")
163 endif(FLAG_VISIBILITY)
164 if (EXPAT_WARNINGS_AS_ERRORS)
168 set(EXTRA_COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS} -Werror")
170 endif(EXPAT_WARNINGS_AS_ERRORS)
171 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_COMPILE_FLAGS}")
172 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_COMPILE_FLAGS}")
175 if (EXPAT_MSVC_STATIC_CRT)
176 message("-- Using static CRT ${EXPAT_MSVC_STATIC_CRT}")
178 CMAKE_CXX_FLAGS_DEBUG
179 CMAKE_CXX_FLAGS_RELEASE
180 CMAKE_CXX_FLAGS_MINSIZEREL
181 CMAKE_CXX_FLAGS_RELWITHDEBINFO
183 CMAKE_C_FLAGS_RELEASE
184 CMAKE_C_FLAGS_MINSIZEREL
185 CMAKE_C_FLAGS_RELWITHDEBINFO
187 string(REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
192 include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/lib)
194 add_definitions(-D_CRT_SECURE_NO_WARNINGS -wd4996)
197 if(EXPAT_UNICODE_WCHAR_T)
198 set(_POSTFIX_WIDE "w")
201 if(NOT EXPAT_SHARED_LIBS)
202 if(EXPAT_MSVC_STATIC_CRT)
203 set(_POSTFIX_CRT "MT")
205 set(_POSTFIX_CRT "MD")
211 CMAKE_RELEASE_POSTFIX
212 CMAKE_MINSIZEREL_POSTFIX
213 CMAKE_RELWITHDEBINFO_POSTFIX
215 if(postfix_var STREQUAL "CMAKE_DEBUG_POSTFIX")
216 set(_POSTFIX_DEBUG "d")
218 set(_POSTFIX_DEBUG "")
221 set(${postfix_var} "${_POSTFIX_WIDE}${_POSTFIX_DEBUG}${_POSTFIX_CRT}" CACHE STRING "Windows binary postfix, e.g. expat<postfix=[w][d][MD|MT]>.lib")
232 # NOTE: ISO C forbids an empty translation unit
237 if(EXPAT_SHARED_LIBS)
240 set(expat_SRCS ${expat_SRCS} lib/libexpat.def)
242 else(EXPAT_SHARED_LIBS)
245 add_definitions(-DXML_STATIC)
247 endif(EXPAT_SHARED_LIBS)
249 add_library(expat ${_SHARED} ${expat_SRCS})
250 if(EXPAT_WITH_LIBBSD)
251 target_link_libraries(expat ${LIB_BSD})
254 set(LIBCURRENT 7) # sync
255 set(LIBREVISION 9) # with
256 set(LIBAGE 6) # configure.ac!
257 math(EXPR LIBCURRENT_MINUS_AGE "${LIBCURRENT} - ${LIBAGE}")
260 set_property(TARGET expat PROPERTY VERSION ${LIBCURRENT_MINUS_AGE}.${LIBAGE}.${LIBREVISION})
261 set_property(TARGET expat PROPERTY SOVERSION ${LIBCURRENT_MINUS_AGE})
262 set_property(TARGET expat PROPERTY NO_SONAME ${NO_SONAME})
265 expat_install(TARGETS expat EXPORT expat
266 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
267 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
268 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
270 expat_install(FILES lib/expat.h lib/expat_external.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
276 set(prefix ${CMAKE_INSTALL_PREFIX})
277 set(exec_prefix "\${prefix}")
278 set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
279 set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
280 configure_file(expat.pc.in ${CMAKE_CURRENT_BINARY_DIR}/expat.pc @ONLY)
281 expat_install(FILES ${CMAKE_CURRENT_BINARY_DIR}/expat.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
285 # C command line tool xmlwf
287 if(EXPAT_BUILD_TOOLS)
295 add_executable(xmlwf ${xmlwf_SRCS})
296 set_property(TARGET xmlwf PROPERTY RUNTIME_OUTPUT_DIRECTORY xmlwf)
297 target_link_libraries(xmlwf expat)
298 expat_install(TARGETS xmlwf DESTINATION ${CMAKE_INSTALL_BINDIR})
300 file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/doc)
301 add_custom_command(TARGET expat PRE_BUILD COMMAND "${DOCBOOK_TO_MAN}" "${PROJECT_SOURCE_DIR}/doc/xmlwf.xml" && mv "XMLWF.1" "${PROJECT_BINARY_DIR}/doc/xmlwf.1")
302 expat_install(FILES "${PROJECT_BINARY_DIR}/doc/xmlwf.1" DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
309 if(EXPAT_BUILD_EXAMPLES)
310 add_executable(elements examples/elements.c)
311 set_property(TARGET elements PROPERTY RUNTIME_OUTPUT_DIRECTORY examples)
312 target_link_libraries(elements expat)
314 add_executable(outline examples/outline.c)
315 set_property(TARGET outline PROPERTY RUNTIME_OUTPUT_DIRECTORY examples)
316 target_link_libraries(outline expat)
317 endif(EXPAT_BUILD_EXAMPLES)
322 if(EXPAT_BUILD_TESTS)
323 ## these are unittests that can be run on any platform
336 set(host whatever-mingw32) # for nothing but run.sh
338 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/run.sh.in run.sh @ONLY)
341 function(expat_add_test _name _file)
343 add_test(NAME ${_name} COMMAND ${_file})
345 add_test(NAME ${_name} COMMAND bash run.sh ${_file})
349 add_executable(runtests tests/runtests.c ${test_SRCS})
350 set_property(TARGET runtests PROPERTY RUNTIME_OUTPUT_DIRECTORY tests)
351 target_link_libraries(runtests expat)
352 expat_add_test(runtests $<TARGET_FILE:runtests>)
354 add_executable(runtestspp tests/runtestspp.cpp ${test_SRCS})
355 set_property(TARGET runtestspp PROPERTY RUNTIME_OUTPUT_DIRECTORY tests)
356 target_link_libraries(runtestspp expat)
357 expat_add_test(runtestspp $<TARGET_FILE:runtestspp>)
358 endif(EXPAT_BUILD_TESTS)
360 if(EXPAT_BUILD_FUZZERS)
361 if(NOT "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
363 "Building fuzz targets without Clang (but ${CMAKE_C_COMPILER_ID}) "
364 "is not supported. Please set "
365 "-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++.")
368 string(FIND "${CMAKE_EXE_LINKER_FLAGS}" "-fsanitize" sanitizer_present)
369 if(${sanitizer_present} EQUAL "-1")
371 "There was no sanitizer present when building the fuzz targets. "
372 "This is likely in error - consider adding "
373 "-DCMAKE_C_FLAGS='-fsanitize=<sanitizer>' and "
374 "-DCMAKE_CXX_FLAGS='-fsanitize=<sanitizer>' and "
375 "-DCMAKE_EXE_LINKER_FLAGS='-fsanitize=<sanitizer>' to your cmake "
379 set(encoding_types UTF-16 UTF-8 ISO-8859-1 US-ASCII UTF-16BE UTF-16LE)
380 set(fuzz_targets xml_parse_fuzzer xml_parsebuffer_fuzzer)
382 foreach(fuzz_target ${fuzz_targets})
383 foreach(encoding_type ${encoding_types})
384 set(target_name ${fuzz_target}_${encoding_type})
385 add_executable(${target_name} fuzz/${fuzz_target}.c ${expat_SRCS})
386 target_compile_definitions(${target_name}
387 PRIVATE ENCODING_FOR_FUZZING=${encoding_type})
388 target_compile_options(${target_name} PRIVATE -fsanitize=fuzzer-no-link)
389 # NOTE: Avoiding target_link_options here only because it needs CMake >=3.13
390 set_target_properties(${target_name} PROPERTIES LINK_FLAGS -fsanitize=fuzzer)
392 TARGET ${target_name} PROPERTY RUNTIME_OUTPUT_DIRECTORY fuzz)
395 endif(EXPAT_BUILD_FUZZERS)
398 # Custom target "run-xmltest"
400 if(EXPAT_BUILD_TOOLS AND NOT MSVC)
404 sh -c 'test -f xmlts.zip || wget --output-document=xmlts.zip https://www.w3.org/XML/Test/xmlts20080827.zip'
413 sh -c 'test -d xmlconf || unzip -q xmlts.zip'
418 add_dependencies(xmlts-zip-extracted xmlts-zip-downloaded)
423 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'
426 add_dependencies(xmltest-sh-been-run xmlts-zip-extracted xmlwf)
431 ${CMAKE_CURRENT_SOURCE_DIR}/fix-xmltest-log.sh tests/xmltest.log
434 add_dependencies(xmltest-log-fixed xmltest-sh-been-run)
439 diff -u ${CMAKE_CURRENT_SOURCE_DIR}/tests/xmltest.log.expected tests/xmltest.log)
440 add_dependencies(xmltest-log-verified xmltest-log-fixed)
442 add_custom_target(run-xmltest)
443 add_dependencies(run-xmltest xmltest-log-verified)
449 configure_file(Changes changelog COPYONLY)
453 ${CMAKE_CURRENT_BINARY_DIR}/changelog
455 ${CMAKE_INSTALL_DOCDIR})
458 # CMake files for find_package(expat [..] CONFIG [..])
460 configure_package_config_file(
461 cmake/expat-config.cmake.in
462 cmake/expat-config.cmake
464 ${CMAKE_INSTALL_LIBDIR}/cmake/expat-${PROJECT_VERSION}/
466 write_basic_package_version_file(
467 cmake/expat-config-version.cmake
468 COMPATIBILITY SameMajorVersion # i.e. semver
474 cmake/expat-targets.cmake # not going to be installed
478 ${CMAKE_CURRENT_BINARY_DIR}/cmake/expat-config.cmake
479 ${CMAKE_CURRENT_BINARY_DIR}/cmake/expat-config-version.cmake
481 ${CMAKE_INSTALL_LIBDIR}/cmake/expat-${PROJECT_VERSION}/
487 ${CMAKE_INSTALL_LIBDIR}/cmake/expat-${PROJECT_VERSION}/
496 if(EXPAT_UNICODE_WCHAR_T)
497 set(_EXPAT_CHAR_TYPE "wchar_t")
499 set(_EXPAT_CHAR_TYPE "unsigned short")
502 set(_EXPAT_CHAR_TYPE "char")
504 string(TOUPPER "${CMAKE_BUILD_TYPE}" _EXPAT_BUILD_TYPE_UPPER)
506 message(STATUS "===========================================================================")
508 message(STATUS "Configuration")
509 message(STATUS " Prefix ..................... ${CMAKE_INSTALL_PREFIX}")
510 message(STATUS " Build type ................. ${CMAKE_BUILD_TYPE}")
511 message(STATUS " Shared libraries ........... ${EXPAT_SHARED_LIBS}")
513 message(STATUS " Static CRT ................. ${EXPAT_MSVC_STATIC_CRT}")
515 message(STATUS " Character type ............. ${_EXPAT_CHAR_TYPE}")
517 message(STATUS " Binary postfix ............. ${CMAKE_${_EXPAT_BUILD_TYPE_UPPER}_POSTFIX}")
520 message(STATUS " Build documentation ........ ${EXPAT_BUILD_DOCS}")
521 message(STATUS " Build examples ............. ${EXPAT_BUILD_EXAMPLES}")
522 message(STATUS " Build fuzzers .............. ${EXPAT_BUILD_FUZZERS}")
523 message(STATUS " Build tests ................ ${EXPAT_BUILD_TESTS}")
524 message(STATUS " Build tools (xmlwf) ........ ${EXPAT_BUILD_TOOLS}")
525 message(STATUS " Install files .............. ${EXPAT_ENABLE_INSTALL}")
527 message(STATUS " Features")
528 message(STATUS " // Advanced options, changes not advised")
529 message(STATUS " Attributes info .......... ${EXPAT_ATTR_INFO}")
530 message(STATUS " Context bytes ............ ${EXPAT_CONTEXT_BYTES}")
531 message(STATUS " DTD support .............. ${EXPAT_DTD}")
532 message(STATUS " Large size ............... ${EXPAT_LARGE_SIZE}")
533 message(STATUS " Minimum size ............. ${EXPAT_MIN_SIZE}")
534 message(STATUS " Namespace support ........ ${EXPAT_NS}")
536 message(STATUS " Entropy sources")
538 message(STATUS " rand_s ................... ON")
540 message(STATUS " getrandom ................ ${HAVE_GETRANDOM}")
541 message(STATUS " syscall SYS_getrandom .... ${HAVE_SYSCALL_GETRANDOM}")
542 message(STATUS " libbsd ................... ${EXPAT_WITH_LIBBSD}")
543 message(STATUS " /dev/random .............. ${EXPAT_DEV_URANDOM}")
546 if(CMAKE_GENERATOR STREQUAL "Unix Makefiles")
547 message(STATUS "Continue with")
548 message(STATUS " make")
549 if(EXPAT_BUILD_TESTS)
550 message(STATUS " make test")
552 if(EXPAT_ENABLE_INSTALL)
553 message(STATUS " sudo make install")
557 message(STATUS "===========================================================================")