summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt220
1 files changed, 175 insertions, 45 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2084424a..e3564691 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.3.0
LANGUAGES
C
)
@@ -37,6 +65,11 @@ else()
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 +80,11 @@ option(EXPAT_BUILD_TESTS "build the tests for expat library" ON)
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 +93,7 @@ mark_as_advanced(EXPAT_DTD)
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]")
@@ -75,6 +112,11 @@ if(MSVC OR _EXPAT_HELP)
set(EXPAT_MSVC_STATIC_CRT OFF CACHE BOOL "Use /MT flag (static CRT) when compiling in MSVC")
endif()
+if(EXPAT_BUILD_TESTS)
+ # We have to call enable_language() before modifying any CMAKE_CXX_* variables
+ enable_language(CXX)
+endif()
+
#
# Environment checks
#
@@ -87,6 +129,14 @@ if(EXPAT_WITH_LIBBSD)
endif()
endif()
+if(MSVC)
+ # Minimum supported MSVC version is 1910 = Visual Studio 15.0/2017
+ # See also https://cmake.org/cmake/help/latest/variable/MSVC_VERSION.html
+ if(MSVC_VERSION VERSION_LESS 1910)
+ message(SEND_ERROR "MSVC_VERSION ${MSVC_VERSION} is not a supported Visual Studio compiler version. Please use Visual Studio 15.0/2017 or any later version.")
+ endif()
+endif()
+
macro(_expat_copy_bool_int source_ref dest_ref)
if(${source_ref})
set(${dest_ref} 1)
@@ -109,12 +159,27 @@ if(EXPAT_CHAR_TYPE STREQUAL "char")
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 +236,14 @@ endif()
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 +268,7 @@ endif()
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 +296,7 @@ if(WIN32)
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 +314,51 @@ if(EXPAT_SHARED_LIBS)
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(LIBAGE 6) # configure.ac!
+set(LIBCURRENT 8) # sync
+set(LIBREVISION 0) # with
+set(LIBAGE 7) # 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()
+
+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_TARGET} EXPORT expat
+expat_install(TARGETS expat EXPORT expat
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
@@ -290,7 +368,7 @@ expat_install(FILES lib/expat.h lib/expat_external.h DESTINATION ${CMAKE_INSTALL
#
# 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 +390,7 @@ if(EXPAT_BUILD_TOOLS)
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 +400,16 @@ if(EXPAT_BUILD_TOOLS)
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,19 +419,18 @@ endif()
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
#
if(EXPAT_BUILD_TESTS)
## these are unittests that can be run on any platform
- enable_language(CXX)
enable_testing()
set(test_SRCS
@@ -372,14 +457,14 @@ if(EXPAT_BUILD_TESTS)
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 +474,34 @@ if(EXPAT_BUILD_FUZZERS)
"-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 +510,28 @@ if(EXPAT_BUILD_FUZZERS)
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 +608,7 @@ write_basic_package_version_file(
)
export(
TARGETS
- ${_EXPAT_TARGET}
+ expat
FILE
cmake/expat-targets.cmake # not going to be installed
)
@@ -519,6 +629,25 @@ expat_install(
)
#
+# 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 +684,7 @@ message(STATUS " Build examples ............. ${EXPAT_BUILD_EXAMPLES}")
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")