diff options
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r-- | CMakeLists.txt | 220 |
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") |