blob: 22c9d4b85e98d118e733b22a492a4e2eee968db4 [file] [log] [blame]
Vitaly Bukac4593402016-10-20 16:17:52 -07001# Copyright 2016 Google Inc. All rights reserved.
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
Vitaly Buka1109c002016-10-20 17:25:19 -070015cmake_minimum_required(VERSION 3.5)
Vitaly Bukac4593402016-10-20 16:17:52 -070016project(LibProtobufMutator CXX)
17
18# External dependencies
Vitaly Buka6a21eac2017-01-12 14:40:48 -080019set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/external)
Vitaly Bukac4593402016-10-20 16:17:52 -070020
21# External dependencies
Vitaly Bukac2f0c692017-01-05 18:36:12 -080022include(ProcessorCount)
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080023include(CheckCCompilerFlag)
24include(CheckCXXCompilerFlag)
Vitaly Bukac4593402016-10-20 16:17:52 -070025
26find_package (Threads)
27
Vitaly Buka5ee534b2016-11-18 10:02:01 -080028set(CMAKE_CXX_STANDARD 11)
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080029
30option(LIB_PROTO_MUTATOR_WITH_ASAN "Enable address sanitizer" ON)
31
Vitaly Buka9dd2f8e2017-01-13 00:48:31 -080032include_directories(${PROJECT_SOURCE_DIR})
33
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080034set(CMAKE_REQUIRED_FLAGS "-fsanitize=address")
35check_cxx_compiler_flag(-fsanitize=address LIB_PROTO_MUTATOR_HAS_SANITIZE_ADDRESS)
36check_cxx_compiler_flag("-fsanitize=address -fsanitize-address-use-after-scope"
37 LIB_PROTO_MUTATOR_HAS_SANITIZE_SCOPE)
38unset(CMAKE_REQUIRED_FLAGS)
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080039check_cxx_compiler_flag(-fsanitize=leak LIB_PROTO_MUTATOR_HAS_SANITIZE_LEAK)
Vitaly Buka77f94142017-01-27 19:03:10 -080040
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080041set(CMAKE_REQUIRED_FLAGS "-fsanitize-coverage=trace-pc-guard")
Vitaly Buka77f94142017-01-27 19:03:10 -080042check_cxx_compiler_flag(-fsanitize-coverage=trace-pc-guard LIB_PROTO_MUTATOR_HAS_TRACE_PC)
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080043unset(CMAKE_REQUIRED_FLAGS)
44
Vitaly Buka77f94142017-01-27 19:03:10 -080045set(CMAKE_REQUIRED_FLAGS "-fsanitize-coverage=trace-cmp")
46check_cxx_compiler_flag(-fsanitize-coverage=trace-cmp LIB_PROTO_MUTATOR_HAS_TRACE_CMP)
47unset(CMAKE_REQUIRED_FLAGS)
48
49if (LIB_PROTO_MUTATOR_HAS_TRACE_PC)
50 list(APPEND SANITIZE_COVERAGE_OPTIONS trace-pc-guard)
51endif()
52if (LIB_PROTO_MUTATOR_HAS_TRACE_CMP)
53 list(APPEND SANITIZE_COVERAGE_OPTIONS trace-cmp)
54endif()
55
56if (SANITIZE_COVERAGE_OPTIONS)
57 foreach(OPT ${SANITIZE_COVERAGE_OPTIONS})
58 set(FUZZING_FLAGS "${FUZZING_FLAGS},${OPT}")
59 endforeach()
60 string(SUBSTRING ${FUZZING_FLAGS} 1 -1 FUZZING_FLAGS)
61 set(FUZZING_FLAGS "-fsanitize-coverage=${FUZZING_FLAGS}")
62endif()
63
Vitaly Bukaa3f0ab82017-01-30 17:32:06 -080064set(EXTRA_FLAGS "-fno-exceptions -Werror -Wall")
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080065if (LIB_PROTO_MUTATOR_WITH_ASAN)
66 if (LIB_PROTO_MUTATOR_HAS_SANITIZE_ADDRESS)
Vitaly Buka8a038c62017-01-17 13:22:58 -080067 set(EXTRA_FLAGS "${EXTRA_FLAGS} -fsanitize=address")
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080068 if (LIB_PROTO_MUTATOR_HAS_SANITIZE_SCOPE)
Vitaly Buka8a038c62017-01-17 13:22:58 -080069 set(EXTRA_FLAGS "${EXTRA_FLAGS} -fsanitize-address-use-after-scope")
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080070 endif()
71 endif()
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080072 if (LIB_PROTO_MUTATOR_HAS_SANITIZE_LEAK)
Vitaly Buka8a038c62017-01-17 13:22:58 -080073 set(EXTRA_FLAGS "${EXTRA_FLAGS} -fsanitize=leak")
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080074 endif()
Vitaly Bukaaa7be1e2017-01-06 16:29:28 -080075endif()
76
Vitaly Bukaf5072d22017-01-27 20:39:21 -080077set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_FLAGS}")
78set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_FLAGS}")
Vitaly Buka8a038c62017-01-17 13:22:58 -080079
Vitaly Buka8a038c62017-01-17 13:22:58 -080080include(googletest)
81include(protobuf)
82include(zlib)
Vitaly Bukac4593402016-10-20 16:17:52 -070083
Vitaly Bukab93a1462017-01-06 17:52:58 -080084# Libraries
Vitaly Buka8c64f9b2017-01-12 11:14:02 -080085add_library(protobuf-mutator
86 src/libfuzzer_protobuf_mutator.cc
87 src/protobuf_mutator.cc)
Vitaly Buka5ee534b2016-11-18 10:02:01 -080088target_link_libraries(protobuf-mutator
89 ${PROTOBUF_LIBRARY})
Vitaly Bukac4593402016-10-20 16:17:52 -070090
Vitaly Bukab93a1462017-01-06 17:52:58 -080091# Tests
Vitaly Buka1109c002016-10-20 17:25:19 -070092enable_testing()
Vitaly Buka6a21eac2017-01-12 14:40:48 -080093protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS src/protobuf_mutator.proto)
Vitaly Buka4af611d2016-12-03 18:57:32 -080094add_executable(protobuf_mutator_test
Vitaly Bukab37b31a2017-01-13 00:48:31 -080095 src/protobuf_mutator_test.cc
96 src/weighted_reservoir_sampler_test.cc
Vitaly Bukab93a1462017-01-06 17:52:58 -080097 ${PROTO_SRCS})
Vitaly Buka1109c002016-10-20 17:25:19 -070098target_link_libraries(protobuf_mutator_test
Vitaly Buka5ee534b2016-11-18 10:02:01 -080099 protobuf-mutator
Vitaly Buka1109c002016-10-20 17:25:19 -0700100 ${ZLIB_LIBRARIES}
101 ${PROTOBUF_LIBRARY}
102 ${GTEST_BOTH_LIBRARIES}
103 ${CMAKE_THREAD_LIBS_INIT})
104
Vitaly Bukac2f0c692017-01-05 18:36:12 -0800105ProcessorCount(CPU_COUNT)
106math(EXPR TEST_SHARDS_COUNT 2*${CPU_COUNT})
107math(EXPR TEST_SHARDS_MAX ${TEST_SHARDS_COUNT}-1)
108foreach(SHARD RANGE ${TEST_SHARDS_MAX})
109 add_test(test.protobuf_mutator_test_${SHARD} protobuf_mutator_test --gtest_color=yes AUTO)
110 set_property(
111 TEST test.protobuf_mutator_test_${SHARD}
112 APPEND PROPERTY ENVIRONMENT
113 GTEST_SHARD_INDEX=${SHARD}
114 GTEST_TOTAL_SHARDS=${TEST_SHARDS_COUNT})
115endforeach(SHARD)
116
117add_custom_target(check
Vitaly Buka7c99c8b2017-01-11 13:56:09 -0800118 COMMAND ${CMAKE_CTEST_COMMAND} -j${CPU_COUNT} --output-on-failure
119 DEPENDS protobuf_mutator_test)
120
121# Examples
Vitaly Buka77f94142017-01-27 19:03:10 -0800122if (NOT ${FUZZING_FLAGS} STREQUAL "")
Vitaly Buka7c99c8b2017-01-11 13:56:09 -0800123 include(libfuzzer)
Vitaly Buka8cd46552017-01-30 17:29:21 -0800124
Vitaly Buka8da52812017-01-20 15:14:44 -0800125 protobuf_generate_cpp(LIB_FUZZER_EXAMPLE_PROTO_SRCS
126 LIB_FUZZER_EXAMPLE_PROTO_HDRS
127 examples/libfuzzer/libfuzzer_example.proto)
Vitaly Buka7c99c8b2017-01-11 13:56:09 -0800128 add_executable(libfuzzer_example
Vitaly Buka8da52812017-01-20 15:14:44 -0800129 examples/libfuzzer/libfuzzer_example.cc
130 ${LIB_FUZZER_EXAMPLE_PROTO_SRCS})
Vitaly Buka7c99c8b2017-01-11 13:56:09 -0800131 target_link_libraries(libfuzzer_example
Vitaly Buka8c64f9b2017-01-12 11:14:02 -0800132 protobuf-mutator
Vitaly Buka8a038c62017-01-17 13:22:58 -0800133 ${LIBFUZZER_LIBRARIES} ${LIBXML2_LIBRARIES})
Vitaly Buka1ab1c022017-01-20 18:45:33 -0800134 set_property(TARGET libfuzzer_example
Vitaly Buka77f94142017-01-27 19:03:10 -0800135 PROPERTY COMPILE_FLAGS ${FUZZING_FLAGS})
Vitaly Buka8da52812017-01-20 15:14:44 -0800136 target_sources(protobuf_mutator_test PRIVATE examples/libfuzzer/libfuzzer_example_test.cc)
Vitaly Buka7c99c8b2017-01-11 13:56:09 -0800137 add_dependencies(protobuf_mutator_test libfuzzer_example)
Vitaly Bukab2a2e8e2017-01-13 19:52:54 -0800138
Vitaly Buka77f94142017-01-27 19:03:10 -0800139 set(LIBXML2_FLAGS "${EXTRA_FLAGS} ${FUZZING_FLAGS} -w")
Vitaly Bukab2a2e8e2017-01-13 19:52:54 -0800140 include(libxml2)
Vitaly Buka77f94142017-01-27 19:03:10 -0800141
Vitaly Bukab2a2e8e2017-01-13 19:52:54 -0800142 # Unused dependency, just to make sure it compiles.
143 target_link_libraries(libfuzzer_example ${LIBXML2_LIBRARIES})
Vitaly Buka7c99c8b2017-01-11 13:56:09 -0800144endif()
145
Vitaly Bukab93a1462017-01-06 17:52:58 -0800146