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