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