Upgrade expat to R_2_2_10
(Keeping the `#if defined(__BIONIC__)` around the HAVE_SYSCALL_GETRANDOM
define, which got dropped somehow.)
Test: make
Change-Id: I3a26a4ff32a2e6b53eb519f1ae09839f24b826d7
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2084424..dfbd0c5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -3,9 +3,37 @@
cmake_minimum_required(VERSION 3.1.3)
+# This allows controlling documented build time switches
+# when Expat is pulled in using the add_subdirectory function, e.g.
+#
+# set(EXPAT_BUILD_DOCS OFF)
+# set(EXPAT_BUILD_TOOLS OFF)
+# add_subdirectory(${expat_SOURCE_DIR}/expat ${expat_BINARY_DIR})
+#
+# would disable compilation of the xmlwf CLI and its man page.
+# Without activating behaviour NEW for policy CMP0077 here,
+# a user with -Wdev enabled would see warning
+#
+# Policy CMP0077 is not set: option() honors normal variables. Run "cmake
+# --help-policy CMP0077" for policy details. Use the cmake_policy command to
+# set the policy and suppress this warning.
+#
+# For compatibility with older versions of CMake, option is clearing the
+# normal variable 'EXPAT_BUILD_DOCS'.
+#
+# and effectively not be able to adjust option EXPAT_BUILD_DOCS.
+#
+# For more details please see:
+# - https://cmake.org/cmake/help/latest/policy/CMP0077.html
+# - https://github.com/libexpat/libexpat/pull/419
+#
+if(POLICY CMP0077)
+ cmake_policy(SET CMP0077 NEW)
+endif()
+
project(expat
VERSION
- 2.2.9
+ 2.2.10
LANGUAGES
C
)
@@ -20,6 +48,11 @@
include(GNUInstallDirs)
#
+# Detect use by means of add_subdirectory
+#
+get_directory_property(_EXPAT_PARENT_DIRECTORY PARENT_DIRECTORY)
+
+#
# Configuration defaults
#
if(WINCE)
@@ -37,6 +70,11 @@
set(_EXPAT_BUILD_DOCS_DEFAULT OFF)
endif()
endif()
+if(MSVC)
+ set(_EXPAT_BUILD_PKGCONFIG_DEFAULT OFF)
+else()
+ set(_EXPAT_BUILD_PKGCONFIG_DEFAULT ON)
+endif()
#
# Configuration
@@ -47,7 +85,11 @@
option(EXPAT_SHARED_LIBS "build a shared expat library" ON)
option(EXPAT_BUILD_DOCS "build man page for xmlwf" ${_EXPAT_BUILD_DOCS_DEFAULT})
option(EXPAT_BUILD_FUZZERS "build fuzzers for the expat library" OFF)
-option(EXPAT_WITH_LIBBSD "utilize libbsd (for arc4random_buf)" OFF)
+option(EXPAT_BUILD_PKGCONFIG "build pkg-config file" ${_EXPAT_BUILD_PKGCONFIG_DEFAULT})
+option(EXPAT_OSSFUZZ_BUILD "build fuzzers via ossfuzz for the expat library" OFF)
+if(UNIX OR _EXPAT_HELP)
+ option(EXPAT_WITH_LIBBSD "utilize libbsd (for arc4random_buf)" OFF)
+endif()
option(EXPAT_ENABLE_INSTALL "install expat files in cmake install target" ON)
set(EXPAT_CONTEXT_BYTES 1024 CACHE STRING "Define to specify how much context to retain around the current parse point")
mark_as_advanced(EXPAT_CONTEXT_BYTES)
@@ -56,7 +98,7 @@
option(EXPAT_NS "Define to make XML Namespaces functionality available" ON)
mark_as_advanced(EXPAT_NS)
option(EXPAT_WARNINGS_AS_ERRORS "Treat all compiler warnings as errors" OFF)
-if(NOT WIN32 OR _EXPAT_HELP)
+if(UNIX OR _EXPAT_HELP)
option(EXPAT_DEV_URANDOM "Define to include code reading entropy from `/dev/urandom'." ON)
set(EXPAT_WITH_GETRANDOM "AUTO" CACHE STRING
"Make use of getrandom function (ON|OFF|AUTO) [default=AUTO]")
@@ -109,12 +151,27 @@
elseif(EXPAT_CHAR_TYPE STREQUAL "ushort")
set(_EXPAT_UNICODE ON)
set(_EXPAT_UNICODE_WCHAR_T OFF)
+ if(EXPAT_BUILD_EXAMPLES)
+ 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.")
+ endif()
+ if(EXPAT_BUILD_TESTS)
+ 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.")
+ endif()
if(EXPAT_BUILD_TOOLS)
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.")
endif()
elseif(EXPAT_CHAR_TYPE STREQUAL "wchar_t")
set(_EXPAT_UNICODE ON)
set(_EXPAT_UNICODE_WCHAR_T ON)
+ if(NOT WIN32)
+ string(FIND "${CMAKE_C_FLAGS}" "-fshort-wchar" _expat_short_wchar_found)
+ if(${_expat_short_wchar_found} EQUAL "-1")
+ 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.")
+ endif()
+ if (EXPAT_BUILD_TOOLS)
+ 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.")
+ endif()
+ endif()
else()
message(SEND_ERROR "Option -DEXPAT_CHAR_TYPE=(char|ushort|wchar_t) cannot be \"${EXPAT_CHAR_TYPE}\".")
endif()
@@ -171,14 +228,14 @@
if(FLAG_VISIBILITY)
add_definitions(-DXML_ENABLE_VISIBILITY=1)
set(EXTRA_COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS} -fvisibility=hidden")
-endif(FLAG_VISIBILITY)
+endif()
if (EXPAT_WARNINGS_AS_ERRORS)
if(MSVC)
add_definitions(/WX)
- else(MSVC)
+ else()
set(EXTRA_COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS} -Werror")
- endif(MSVC)
-endif(EXPAT_WARNINGS_AS_ERRORS)
+ endif()
+endif()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_COMPILE_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_COMPILE_FLAGS}")
@@ -203,7 +260,7 @@
include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/lib)
if(MSVC)
add_definitions(-D_CRT_SECURE_NO_WARNINGS -wd4996)
-endif(MSVC)
+endif()
if(WIN32)
if(_EXPAT_UNICODE_WCHAR_T)
set(_POSTFIX_WIDE "w")
@@ -231,7 +288,7 @@
set(${postfix_var} "${_POSTFIX_WIDE}${_POSTFIX_DEBUG}${_POSTFIX_CRT}" CACHE STRING "Windows binary postfix, e.g. libexpat<postfix=[w][d][MD|MT]>.lib")
endforeach()
-endif(WIN32)
+endif()
#
# C library
@@ -249,38 +306,51 @@
set(_SHARED SHARED)
if(MSVC)
set(expat_SRCS ${expat_SRCS} lib/libexpat.def)
- endif(MSVC)
-else(EXPAT_SHARED_LIBS)
+ endif()
+else()
set(_SHARED STATIC)
- if(WIN32)
- add_definitions(-DXML_STATIC)
- endif(WIN32)
-endif(EXPAT_SHARED_LIBS)
+endif()
# Avoid colliding with Expat.dll of Perl's XML::Parser::Expat
if(WIN32 AND NOT MINGW)
- set(_EXPAT_TARGET libexpat)
+ set(_EXPAT_OUTPUT_NAME libexpat) # CMAKE_*_POSTFIX applies, see above
else()
- set(_EXPAT_TARGET expat)
+ if(_EXPAT_UNICODE)
+ set(_EXPAT_OUTPUT_NAME expatw)
+ else()
+ set(_EXPAT_OUTPUT_NAME expat)
+ endif()
endif()
-add_library(${_EXPAT_TARGET} ${_SHARED} ${expat_SRCS})
+add_library(expat ${_SHARED} ${expat_SRCS})
if(EXPAT_WITH_LIBBSD)
- target_link_libraries(${_EXPAT_TARGET} ${LIB_BSD})
+ target_link_libraries(expat ${LIB_BSD})
endif()
set(LIBCURRENT 7) # sync
-set(LIBREVISION 11) # with
+set(LIBREVISION 12) # with
set(LIBAGE 6) # configure.ac!
math(EXPR LIBCURRENT_MINUS_AGE "${LIBCURRENT} - ${LIBAGE}")
+set_property(TARGET expat PROPERTY OUTPUT_NAME "${_EXPAT_OUTPUT_NAME}")
if(NOT WIN32)
- set_property(TARGET ${_EXPAT_TARGET} PROPERTY VERSION ${LIBCURRENT_MINUS_AGE}.${LIBAGE}.${LIBREVISION})
- set_property(TARGET ${_EXPAT_TARGET} PROPERTY SOVERSION ${LIBCURRENT_MINUS_AGE})
- set_property(TARGET ${_EXPAT_TARGET} PROPERTY NO_SONAME ${NO_SONAME})
-endif(NOT WIN32)
+ set_property(TARGET expat PROPERTY VERSION ${LIBCURRENT_MINUS_AGE}.${LIBAGE}.${LIBREVISION})
+ set_property(TARGET expat PROPERTY SOVERSION ${LIBCURRENT_MINUS_AGE})
+ set_property(TARGET expat PROPERTY NO_SONAME ${NO_SONAME})
+endif()
-expat_install(TARGETS ${_EXPAT_TARGET} EXPORT expat
+target_include_directories(expat
+ INTERFACE
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/lib>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
+)
+
+if(NOT EXPAT_SHARED_LIBS AND WIN32)
+ target_compile_definitions(expat PUBLIC -DXML_STATIC)
+endif()
+
+expat_install(TARGETS expat EXPORT expat
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
@@ -290,7 +360,7 @@
#
# pkg-config file
#
-if(NOT MSVC)
+if(EXPAT_BUILD_PKGCONFIG)
set(prefix ${CMAKE_INSTALL_PREFIX})
set(exec_prefix "\${prefix}")
set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
@@ -312,7 +382,7 @@
add_executable(xmlwf ${xmlwf_SRCS})
set_property(TARGET xmlwf PROPERTY RUNTIME_OUTPUT_DIRECTORY xmlwf)
- target_link_libraries(xmlwf ${_EXPAT_TARGET})
+ target_link_libraries(xmlwf expat)
expat_install(TARGETS xmlwf DESTINATION ${CMAKE_INSTALL_BINDIR})
if(MINGW AND _EXPAT_UNICODE_WCHAR_T)
@@ -322,8 +392,16 @@
if(EXPAT_BUILD_DOCS)
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/doc)
- add_custom_command(TARGET ${_EXPAT_TARGET} PRE_BUILD COMMAND "${DOCBOOK_TO_MAN}" "${PROJECT_SOURCE_DIR}/doc/xmlwf.xml" && mv "XMLWF.1" "${PROJECT_BINARY_DIR}/doc/xmlwf.1")
+ add_custom_target(
+ xmlwf-manpage
+ COMMAND
+ "${DOCBOOK_TO_MAN}" "${PROJECT_SOURCE_DIR}/doc/xmlwf.xml" && mv "XMLWF.1" "${PROJECT_BINARY_DIR}/doc/xmlwf.1"
+ BYPRODUCTS
+ doc/xmlwf.1)
+ add_dependencies(expat xmlwf-manpage)
expat_install(FILES "${PROJECT_BINARY_DIR}/doc/xmlwf.1" DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
+ elseif(EXISTS ${PROJECT_SOURCE_DIR}/doc/xmlwf.1)
+ expat_install(FILES "${PROJECT_SOURCE_DIR}/doc/xmlwf.1" DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
endif()
endif()
@@ -333,12 +411,12 @@
if(EXPAT_BUILD_EXAMPLES)
add_executable(elements examples/elements.c)
set_property(TARGET elements PROPERTY RUNTIME_OUTPUT_DIRECTORY examples)
- target_link_libraries(elements ${_EXPAT_TARGET})
+ target_link_libraries(elements expat)
add_executable(outline examples/outline.c)
set_property(TARGET outline PROPERTY RUNTIME_OUTPUT_DIRECTORY examples)
- target_link_libraries(outline ${_EXPAT_TARGET})
-endif(EXPAT_BUILD_EXAMPLES)
+ target_link_libraries(outline expat)
+endif()
#
# C/C++ test runners
@@ -372,14 +450,14 @@
add_executable(runtests tests/runtests.c ${test_SRCS})
set_property(TARGET runtests PROPERTY RUNTIME_OUTPUT_DIRECTORY tests)
- target_link_libraries(runtests ${_EXPAT_TARGET})
+ target_link_libraries(runtests expat)
expat_add_test(runtests $<TARGET_FILE:runtests>)
add_executable(runtestspp tests/runtestspp.cpp ${test_SRCS})
set_property(TARGET runtestspp PROPERTY RUNTIME_OUTPUT_DIRECTORY tests)
- target_link_libraries(runtestspp ${_EXPAT_TARGET})
+ target_link_libraries(runtestspp expat)
expat_add_test(runtestspp $<TARGET_FILE:runtestspp>)
-endif(EXPAT_BUILD_TESTS)
+endif()
if(EXPAT_BUILD_FUZZERS)
if(NOT "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
@@ -389,23 +467,34 @@
"-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++.")
endif()
- string(FIND "${CMAKE_EXE_LINKER_FLAGS}" "-fsanitize" sanitizer_present)
+ string(FIND "${CMAKE_C_FLAGS}" "-fsanitize" sanitizer_present)
if(${sanitizer_present} EQUAL "-1")
message(WARNING
"There was no sanitizer present when building the fuzz targets. "
"This is likely in error - consider adding "
"-DCMAKE_C_FLAGS='-fsanitize=<sanitizer>' and "
"-DCMAKE_CXX_FLAGS='-fsanitize=<sanitizer>' and "
- "-DCMAKE_STATIC_LINKER_FLAGS='-fsanitize=<sanitizer>' and "
- "-DCMAKE_EXE_LINKER_FLAGS='-fsanitize=<sanitizer>' to your cmake "
+ "-DCMAKE_EXE_LINKER_FLAGS='-fsanitize=<sanitizer>' and "
+ "-DCMAKE_MODULE_LINKER_FLAGS='-fsanitize=<sanitizer>' and "
+ "-DCMAKE_SHARED_LINKER_FLAGS='-fsanitize=<sanitizer>' to your cmake "
"execution.")
endif()
+ if(EXPAT_OSSFUZZ_BUILD AND NOT DEFINED ENV{LIB_FUZZING_ENGINE})
+ message(SEND_ERROR
+ "OSS-Fuzz builds require the environment variable "
+ "LIB_FUZZING_ENGINE to be set. If you are seeing this "
+ "warning, it points to a deeper problem in the ossfuzz "
+ "build setup.")
+ endif()
+
set(encoding_types UTF-16 UTF-8 ISO-8859-1 US-ASCII UTF-16BE UTF-16LE)
set(fuzz_targets xml_parse_fuzzer xml_parsebuffer_fuzzer)
add_library(fuzzpat STATIC ${expat_SRCS})
- target_compile_options(fuzzpat PRIVATE -fsanitize=fuzzer-no-link)
+ if(NOT EXPAT_OSSFUZZ_BUILD)
+ target_compile_options(fuzzpat PRIVATE -fsanitize=fuzzer-no-link)
+ endif()
foreach(fuzz_target ${fuzz_targets})
foreach(encoding_type ${encoding_types})
@@ -414,14 +503,28 @@
target_link_libraries(${target_name} fuzzpat)
target_compile_definitions(${target_name}
PRIVATE ENCODING_FOR_FUZZING=${encoding_type})
- target_compile_options(${target_name} PRIVATE -fsanitize=fuzzer-no-link)
+ if(NOT EXPAT_OSSFUZZ_BUILD)
+ target_compile_options(${target_name} PRIVATE -fsanitize=fuzzer-no-link)
+ endif()
# NOTE: Avoiding target_link_options here only because it needs CMake >=3.13
- set_target_properties(${target_name} PROPERTIES LINK_FLAGS -fsanitize=fuzzer)
+ if(EXPAT_OSSFUZZ_BUILD)
+ set_target_properties(${target_name} PROPERTIES LINK_FLAGS $ENV{LIB_FUZZING_ENGINE})
+ set_target_properties(${target_name} PROPERTIES LINKER_LANGUAGE "CXX")
+ else()
+ set_target_properties(${target_name} PROPERTIES LINK_FLAGS -fsanitize=fuzzer)
+ endif()
set_property(
TARGET ${target_name} PROPERTY RUNTIME_OUTPUT_DIRECTORY fuzz)
endforeach()
endforeach()
-endif(EXPAT_BUILD_FUZZERS)
+else()
+ if(EXPAT_OSSFUZZ_BUILD)
+ message(SEND_ERROR
+ "Attempting to perform an ossfuzz build without turning on the fuzzer build. "
+ "This is likely in error - consider adding "
+ "-DEXPAT_BUILD_FUZZERS=ON to your cmake execution.")
+ endif()
+endif()
#
# Custom target "run-xmltest"
@@ -498,7 +601,7 @@
)
export(
TARGETS
- ${_EXPAT_TARGET}
+ expat
FILE
cmake/expat-targets.cmake # not going to be installed
)
@@ -519,6 +622,25 @@
)
#
+# CPack
+#
+
+# This effectively disables target "package_source".
+# That is done due to CPack's unfortunate choice of an exclusion list
+# rather than inclusion list. An exclusion list does not protect against
+# unwanted files ending up in the resulting archive in a way that's
+# safe to run from an Expat developer's machine.
+set(CPACK_SOURCE_GENERATOR '')
+
+if(WIN32)
+ set(CPACK_GENERATOR ZIP)
+else()
+ set(CPACK_GENERATOR TGZ)
+endif()
+
+include(CPack)
+
+#
# Summary
#
if(EXPAT_CHAR_TYPE STREQUAL "char")
@@ -555,6 +677,7 @@
message(STATUS " Build fuzzers .............. ${EXPAT_BUILD_FUZZERS}")
message(STATUS " Build tests ................ ${EXPAT_BUILD_TESTS}")
message(STATUS " Build tools (xmlwf) ........ ${EXPAT_BUILD_TOOLS}")
+message(STATUS " Build pkg-config file ...... ${EXPAT_BUILD_PKGCONFIG}")
message(STATUS " Install files .............. ${EXPAT_ENABLE_INSTALL}")
message(STATUS "")
message(STATUS " Features")