77#
88# Copyright (c) 2010 Patrick Spendrin <ps_ml@gmx.de>
99# Copyright (c) 2012 Karl Waclawek <karl@waclawek.net>
10- # Copyright (c) 2016-2024 Sebastian Pipping <sebastian@pipping.org>
10+ # Copyright (c) 2016-2025 Sebastian Pipping <sebastian@pipping.org>
1111# Copyright (c) 2016 Sergei Nikulov <sergey.nikulov@gmail.com>
1212# Copyright (c) 2016 Björn Lindahl <bjorn.lindahl@foi.se>
1313# Copyright (c) 2016 Tobias Taschner <github@tc84.de>
3030# Copyright (c) 2020 Thomas Beutlich <tc@tbeu.de>
3131# Copyright (c) 2021 Alex Richardson <Alexander.Richardson@cl.cam.ac.uk>
3232# Copyright (c) 2022 Johnny Jazeix <jazeix@gmail.com>
33+ # Copyright (c) 2022 Mark Brand <markbrand@google.com>
3334# Copyright (c) 2022 David Faure <david.faure@kdab.com>
3435# Unlike most of Expat,
3536# this file is copyrighted under the BSD-license for buildsystem files of KDE.
3637
37- cmake_minimum_required (VERSION 3.5 .0)
38+ cmake_minimum_required (VERSION 3.13 .0)
3839
3940project (expat
4041 VERSION
41- 2.6.3
42+ 2.7.1
4243 LANGUAGES
4344 C
4445)
@@ -134,7 +135,7 @@ expat_shy_set(EXPAT_SHARED_LIBS ${_EXPAT_SHARED_LIBS_DEFAULT} CACHE BOOL "Build
134135expat_shy_set(EXPAT_BUILD_DOCS ${_EXPAT_BUILD_DOCS_DEFAULT} CACHE BOOL "Build man page for xmlwf" )
135136expat_shy_set(EXPAT_BUILD_FUZZERS OFF CACHE BOOL "Build fuzzers for the expat library" )
136137expat_shy_set(EXPAT_BUILD_PKGCONFIG ${_EXPAT_BUILD_PKGCONFIG_DEFAULT} CACHE BOOL "Build pkg-config file" )
137- expat_shy_set(EXPAT_OSSFUZZ_BUILD OFF CACHE BOOL "Build fuzzers via ossfuzz for the expat library" )
138+ expat_shy_set(EXPAT_OSSFUZZ_BUILD OFF CACHE BOOL "Build fuzzers via OSS-Fuzz for the expat library" )
138139if (UNIX OR _EXPAT_HELP)
139140 expat_shy_set(EXPAT_WITH_LIBBSD OFF CACHE BOOL "Utilize libbsd (for arc4random_buf)" )
140141endif ()
@@ -169,11 +170,15 @@ if(NOT _EXPAT_HELP)
169170 mark_as_advanced (_EXPAT_M32)
170171endif ()
171172
172- if (EXPAT_BUILD_TESTS)
173+ if (EXPAT_BUILD_TESTS OR EXPAT_BUILD_FUZZERS )
173174 # We have to call enable_language() before modifying any CMAKE_CXX_* variables
174175 enable_language (CXX)
175176
176- set (CMAKE_CXX_STANDARD 11)
177+ if (EXPAT_BUILD_FUZZERS)
178+ set (CMAKE_CXX_STANDARD 17) # for std::string_view for Abseil for libprotobuf-mutator
179+ else ()
180+ set (CMAKE_CXX_STANDARD 11)
181+ endif ()
177182 set (CMAKE_CXX_STANDARD_REQUIRED ON )
178183 set (CMAKE_CXX_EXTENSIONS OFF ) # i.e. -std=c++11 rather than default -std=gnu++11
179184endif ()
@@ -320,7 +325,7 @@ if(FLAG_VISIBILITY)
320325 endif ()
321326 set (EXTRA_COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS} -fvisibility=hidden" )
322327endif ()
323- if (MINGW)
328+ if (MINGW AND ( " ${CMAKE_C_COMPILER_ID} " STREQUAL "GNU" ) )
324329 # Without __USE_MINGW_ANSI_STDIO the compiler produces a false positive
325330 set (EXTRA_COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS} -Wno-pedantic-ms-format" )
326331endif ()
@@ -425,6 +430,7 @@ else()
425430endif ()
426431
427432add_library (expat ${_SHARED} ${_EXPAT_C_SOURCES} ${_EXPAT_EXTRA_SOURCES} )
433+ add_library (expat::expat ALIAS expat)
428434if (_EXPAT_LIBM_FOUND)
429435 target_link_libraries (expat m)
430436endif ()
@@ -465,9 +471,9 @@ foreach(build_type_upper
465471 set_property (TARGET expat PROPERTY ${build_type_upper} _POSTFIX ${EXPAT_${build_type_upper} _POSTFIX})
466472endforeach ()
467473
468- set (LIBCURRENT 10 ) # sync
469- set (LIBREVISION 3 ) # with
470- set (LIBAGE 9) # configure.ac!
474+ set (LIBCURRENT 11 ) # sync
475+ set (LIBREVISION 2 ) # with
476+ set (LIBAGE 10) # configure.ac!
471477math (EXPR LIBCURRENT_MINUS_AGE "${LIBCURRENT} - ${LIBAGE} " )
472478
473479if (NOT WIN32 )
@@ -586,7 +592,7 @@ if(EXPAT_BUILD_TOOLS)
586592
587593 if (MINGW AND _EXPAT_UNICODE_WCHAR_T)
588594 # https://gcc.gnu.org/onlinedocs/gcc/x86-Windows-Options.html
589- set_target_properties (xmlwf PROPERTIES LINK_FLAGS -municode)
595+ target_link_options (xmlwf PRIVATE -municode)
590596 endif ()
591597
592598 if (EXPAT_BUILD_DOCS)
@@ -723,7 +729,7 @@ if(EXPAT_BUILD_FUZZERS)
723729 message (SEND_ERROR
724730 "OSS-Fuzz builds require the environment variable "
725731 "LIB_FUZZING_ENGINE to be set. If you are seeing this "
726- "warning, it points to a deeper problem in the ossfuzz "
732+ "warning, it points to a deeper problem in the OSS-Fuzz "
727733 "build setup." )
728734 endif ()
729735
@@ -742,24 +748,78 @@ if(EXPAT_BUILD_FUZZERS)
742748 target_link_libraries (${target_name} fuzzpat)
743749 target_compile_definitions (${target_name}
744750 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
749751 if (EXPAT_OSSFUZZ_BUILD)
750- set_target_properties (${target_name} PROPERTIES LINK_FLAGS $ENV{LIB_FUZZING_ENGINE} )
752+ target_link_options (${target_name} PRIVATE $ENV{LIB_FUZZING_ENGINE} )
751753 set_target_properties (${target_name} PROPERTIES LINKER_LANGUAGE "CXX" )
752754 else ()
753- set_target_properties (${target_name} PROPERTIES LINK_FLAGS -fsanitize=fuzzer)
755+ target_compile_options (${target_name} PRIVATE -fsanitize=fuzzer)
756+ target_link_options (${target_name} PRIVATE -fsanitize=fuzzer)
754757 endif ()
755758 set_property (
756759 TARGET ${target_name} PROPERTY RUNTIME_OUTPUT_DIRECTORY fuzz)
757760 endforeach ()
758761 endforeach ()
762+
763+ find_package (Protobuf REQUIRED)
764+
765+ # Only include libprotobuf-mutator here so we don't build it in non-fuzz
766+ # configurations.
767+ include (ExternalProject)
768+
769+ set (ProtobufMutator_PREFIX libprotobuf-mutator)
770+ set (ProtobufMutator_PATH ${CMAKE_CURRENT_BINARY_DIR} /${ProtobufMutator_PREFIX} /src/${ProtobufMutator_PREFIX} )
771+ set (ProtobufMutator_BUILD_PATH ${ProtobufMutator_PATH} -build )
772+ set (ProtobufMutator_INCLUDE_DIR ${ProtobufMutator_PATH} )
773+ set (ProtobufMutator_LIBRARIES ${ProtobufMutator_BUILD_PATH} /src/libfuzzer/libprotobuf-mutator-libfuzzer.a ${ProtobufMutator_BUILD_PATH} /src/libprotobuf-mutator.a)
774+
775+ ExternalProject_Add(
776+ ${ProtobufMutator_PREFIX}
777+ PREFIX ${ProtobufMutator_PREFIX}
778+ GIT_REPOSITORY https://github.com/google/libprotobuf-mutator.git
779+ GIT_TAG 57928f41ae52bb27666aa15b310130d086dac245 # v1.4-16-g57928f4
780+ CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
781+ CMAKE_CACHE_ARGS
782+ -DCMAKE_C_COMPILER:FILEPATH =${CMAKE_C_COMPILER}
783+ -DCMAKE_CXX_COMPILER:FILEPATH =${CMAKE_CXX_COMPILER}
784+ -DLIB_PROTO_MUTATOR_EXAMPLES:BOOL =OFF
785+ -DLIB_PROTO_MUTATOR_TESTING:BOOL =OFF
786+ BUILD_BYPRODUCTS ${ProtobufMutator_LIBRARIES}
787+ UPDATE_COMMAND true
788+ INSTALL_COMMAND true )
789+
790+ # Check for availability of protobuf compiler to avoid hard-to-understand
791+ # errors from make(1) down the line as seen with CMake 3.25.1 on Debian
792+ if (NOT Protobuf_PROTOC_EXECUTABLE)
793+ message (SEND_ERROR
794+ "The protobuf compiler (protoc) could not be found. "
795+ "Is it installed and working properly?" )
796+ endif ()
797+
798+ protobuf_generate_cpp(XML_LPM_FUZZER_PROTO_SRCS
799+ XML_LPM_FUZZER_PROTO_HDRS
800+ fuzz/xml_lpm_fuzzer.proto)
801+
802+ add_executable (xml_lpm_fuzzer
803+ fuzz/xml_lpm_fuzzer.cpp
804+ ${XML_LPM_FUZZER_PROTO_SRCS} )
805+ target_include_directories (xml_lpm_fuzzer PUBLIC ${ProtobufMutator_INCLUDE_DIR} )
806+ target_link_libraries (xml_lpm_fuzzer
807+ fuzzpat
808+ ${ProtobufMutator_LIBRARIES}
809+ ${Protobuf_LIBRARIES} )
810+ add_dependencies (xml_lpm_fuzzer ${ProtobufMutator_PREFIX} )
811+
812+ if (EXPAT_OSSFUZZ_BUILD)
813+ target_link_options (xml_lpm_fuzzer PRIVATE $ENV{LIB_FUZZING_ENGINE} )
814+ else ()
815+ target_compile_options (xml_lpm_fuzzer PRIVATE -fsanitize=fuzzer)
816+ target_link_options (xml_lpm_fuzzer PRIVATE -fsanitize=fuzzer)
817+ endif ()
818+ set_property (TARGET xml_lpm_fuzzer PROPERTY RUNTIME_OUTPUT_DIRECTORY fuzz)
759819else ()
760820 if (EXPAT_OSSFUZZ_BUILD)
761821 message (SEND_ERROR
762- "Attempting to perform an ossfuzz build without turning on the fuzzer build. "
822+ "Attempting to perform an OSS-Fuzz build without turning on the fuzzer build. "
763823 "This is likely in error - consider adding "
764824 "-DEXPAT_BUILD_FUZZERS=ON to your cmake execution." )
765825 endif ()
@@ -912,13 +972,7 @@ elseif(EXPAT_CHAR_TYPE STREQUAL "wchar_t")
912972else ()
913973 set (_EXPAT_CHAR_TYPE_SUMMARY "ERROR" )
914974endif ()
915- # NOTE: We're not accessing global property GENERATOR_IS_MULTI_CONFIG
916- # because that would require CMake >=3.9
917- if (CMAKE_CONFIGURATION_TYPES )
918- set (_EXPAT_GENERATOR_IS_MULTI_CONFIG TRUE )
919- else ()
920- set (_EXPAT_GENERATOR_IS_MULTI_CONFIG FALSE )
921- endif ()
975+ get_property (_EXPAT_GENERATOR_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
922976
923977message (STATUS "===========================================================================" )
924978message (STATUS "" )
0 commit comments