Vitaly Buka | c459340 | 2016-10-20 16:17:52 -0700 | [diff] [blame] | 1 | # 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 Buka | 1109c00 | 2016-10-20 17:25:19 -0700 | [diff] [blame] | 15 | cmake_minimum_required(VERSION 3.5) |
Vitaly Buka | c459340 | 2016-10-20 16:17:52 -0700 | [diff] [blame] | 16 | project(LibProtobufMutator CXX) |
| 17 | |
| 18 | # External dependencies |
Vitaly Buka | 6a21eac | 2017-01-12 14:40:48 -0800 | [diff] [blame] | 19 | set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/external) |
Vitaly Buka | c459340 | 2016-10-20 16:17:52 -0700 | [diff] [blame] | 20 | |
| 21 | # External dependencies |
Vitaly Buka | c2f0c69 | 2017-01-05 18:36:12 -0800 | [diff] [blame] | 22 | include(ProcessorCount) |
Vitaly Buka | 7c99c8b | 2017-01-11 13:56:09 -0800 | [diff] [blame] | 23 | include(CheckCCompilerFlag) |
| 24 | include(CheckCXXCompilerFlag) |
Vitaly Buka | c459340 | 2016-10-20 16:17:52 -0700 | [diff] [blame] | 25 | |
| 26 | find_package (Threads) |
| 27 | |
Vitaly Buka | 5ee534b | 2016-11-18 10:02:01 -0800 | [diff] [blame] | 28 | set(CMAKE_CXX_STANDARD 11) |
Vitaly Buka | 7c99c8b | 2017-01-11 13:56:09 -0800 | [diff] [blame] | 29 | |
| 30 | option(LIB_PROTO_MUTATOR_WITH_ASAN "Enable address sanitizer" ON) |
| 31 | |
Vitaly Buka | 9dd2f8e | 2017-01-13 00:48:31 -0800 | [diff] [blame] | 32 | include_directories(${PROJECT_SOURCE_DIR}) |
| 33 | |
Vitaly Buka | 7c99c8b | 2017-01-11 13:56:09 -0800 | [diff] [blame] | 34 | set(CMAKE_REQUIRED_FLAGS "-fsanitize=address") |
| 35 | check_cxx_compiler_flag(-fsanitize=address LIB_PROTO_MUTATOR_HAS_SANITIZE_ADDRESS) |
| 36 | check_cxx_compiler_flag("-fsanitize=address -fsanitize-address-use-after-scope" |
| 37 | LIB_PROTO_MUTATOR_HAS_SANITIZE_SCOPE) |
| 38 | unset(CMAKE_REQUIRED_FLAGS) |
Vitaly Buka | 7c99c8b | 2017-01-11 13:56:09 -0800 | [diff] [blame] | 39 | check_cxx_compiler_flag(-fsanitize=leak LIB_PROTO_MUTATOR_HAS_SANITIZE_LEAK) |
Vitaly Buka | 77f9414 | 2017-01-27 19:03:10 -0800 | [diff] [blame] | 40 | |
Vitaly Buka | 7c99c8b | 2017-01-11 13:56:09 -0800 | [diff] [blame] | 41 | set(CMAKE_REQUIRED_FLAGS "-fsanitize-coverage=trace-pc-guard") |
Vitaly Buka | 77f9414 | 2017-01-27 19:03:10 -0800 | [diff] [blame] | 42 | check_cxx_compiler_flag(-fsanitize-coverage=trace-pc-guard LIB_PROTO_MUTATOR_HAS_TRACE_PC) |
Vitaly Buka | 7c99c8b | 2017-01-11 13:56:09 -0800 | [diff] [blame] | 43 | unset(CMAKE_REQUIRED_FLAGS) |
| 44 | |
Vitaly Buka | 77f9414 | 2017-01-27 19:03:10 -0800 | [diff] [blame] | 45 | set(CMAKE_REQUIRED_FLAGS "-fsanitize-coverage=trace-cmp") |
| 46 | check_cxx_compiler_flag(-fsanitize-coverage=trace-cmp LIB_PROTO_MUTATOR_HAS_TRACE_CMP) |
| 47 | unset(CMAKE_REQUIRED_FLAGS) |
| 48 | |
| 49 | if (LIB_PROTO_MUTATOR_HAS_TRACE_PC) |
| 50 | list(APPEND SANITIZE_COVERAGE_OPTIONS trace-pc-guard) |
| 51 | endif() |
| 52 | if (LIB_PROTO_MUTATOR_HAS_TRACE_CMP) |
| 53 | list(APPEND SANITIZE_COVERAGE_OPTIONS trace-cmp) |
| 54 | endif() |
| 55 | |
| 56 | if (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}") |
| 62 | endif() |
| 63 | |
Vitaly Buka | a3f0ab8 | 2017-01-30 17:32:06 -0800 | [diff] [blame^] | 64 | set(EXTRA_FLAGS "-fno-exceptions -Werror -Wall") |
Vitaly Buka | 7c99c8b | 2017-01-11 13:56:09 -0800 | [diff] [blame] | 65 | if (LIB_PROTO_MUTATOR_WITH_ASAN) |
| 66 | if (LIB_PROTO_MUTATOR_HAS_SANITIZE_ADDRESS) |
Vitaly Buka | 8a038c6 | 2017-01-17 13:22:58 -0800 | [diff] [blame] | 67 | set(EXTRA_FLAGS "${EXTRA_FLAGS} -fsanitize=address") |
Vitaly Buka | 7c99c8b | 2017-01-11 13:56:09 -0800 | [diff] [blame] | 68 | if (LIB_PROTO_MUTATOR_HAS_SANITIZE_SCOPE) |
Vitaly Buka | 8a038c6 | 2017-01-17 13:22:58 -0800 | [diff] [blame] | 69 | set(EXTRA_FLAGS "${EXTRA_FLAGS} -fsanitize-address-use-after-scope") |
Vitaly Buka | 7c99c8b | 2017-01-11 13:56:09 -0800 | [diff] [blame] | 70 | endif() |
| 71 | endif() |
Vitaly Buka | 7c99c8b | 2017-01-11 13:56:09 -0800 | [diff] [blame] | 72 | if (LIB_PROTO_MUTATOR_HAS_SANITIZE_LEAK) |
Vitaly Buka | 8a038c6 | 2017-01-17 13:22:58 -0800 | [diff] [blame] | 73 | set(EXTRA_FLAGS "${EXTRA_FLAGS} -fsanitize=leak") |
Vitaly Buka | 7c99c8b | 2017-01-11 13:56:09 -0800 | [diff] [blame] | 74 | endif() |
Vitaly Buka | aa7be1e | 2017-01-06 16:29:28 -0800 | [diff] [blame] | 75 | endif() |
| 76 | |
Vitaly Buka | f5072d2 | 2017-01-27 20:39:21 -0800 | [diff] [blame] | 77 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_FLAGS}") |
| 78 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_FLAGS}") |
Vitaly Buka | 8a038c6 | 2017-01-17 13:22:58 -0800 | [diff] [blame] | 79 | |
Vitaly Buka | 8a038c6 | 2017-01-17 13:22:58 -0800 | [diff] [blame] | 80 | include(googletest) |
| 81 | include(protobuf) |
| 82 | include(zlib) |
Vitaly Buka | c459340 | 2016-10-20 16:17:52 -0700 | [diff] [blame] | 83 | |
Vitaly Buka | b93a146 | 2017-01-06 17:52:58 -0800 | [diff] [blame] | 84 | # Libraries |
Vitaly Buka | 8c64f9b | 2017-01-12 11:14:02 -0800 | [diff] [blame] | 85 | add_library(protobuf-mutator |
| 86 | src/libfuzzer_protobuf_mutator.cc |
| 87 | src/protobuf_mutator.cc) |
Vitaly Buka | 5ee534b | 2016-11-18 10:02:01 -0800 | [diff] [blame] | 88 | target_link_libraries(protobuf-mutator |
| 89 | ${PROTOBUF_LIBRARY}) |
Vitaly Buka | c459340 | 2016-10-20 16:17:52 -0700 | [diff] [blame] | 90 | |
Vitaly Buka | b93a146 | 2017-01-06 17:52:58 -0800 | [diff] [blame] | 91 | # Tests |
Vitaly Buka | 1109c00 | 2016-10-20 17:25:19 -0700 | [diff] [blame] | 92 | enable_testing() |
Vitaly Buka | 6a21eac | 2017-01-12 14:40:48 -0800 | [diff] [blame] | 93 | protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS src/protobuf_mutator.proto) |
Vitaly Buka | 4af611d | 2016-12-03 18:57:32 -0800 | [diff] [blame] | 94 | add_executable(protobuf_mutator_test |
Vitaly Buka | b37b31a | 2017-01-13 00:48:31 -0800 | [diff] [blame] | 95 | src/protobuf_mutator_test.cc |
| 96 | src/weighted_reservoir_sampler_test.cc |
Vitaly Buka | b93a146 | 2017-01-06 17:52:58 -0800 | [diff] [blame] | 97 | ${PROTO_SRCS}) |
Vitaly Buka | 1109c00 | 2016-10-20 17:25:19 -0700 | [diff] [blame] | 98 | target_link_libraries(protobuf_mutator_test |
Vitaly Buka | 5ee534b | 2016-11-18 10:02:01 -0800 | [diff] [blame] | 99 | protobuf-mutator |
Vitaly Buka | 1109c00 | 2016-10-20 17:25:19 -0700 | [diff] [blame] | 100 | ${ZLIB_LIBRARIES} |
| 101 | ${PROTOBUF_LIBRARY} |
| 102 | ${GTEST_BOTH_LIBRARIES} |
| 103 | ${CMAKE_THREAD_LIBS_INIT}) |
| 104 | |
Vitaly Buka | c2f0c69 | 2017-01-05 18:36:12 -0800 | [diff] [blame] | 105 | ProcessorCount(CPU_COUNT) |
| 106 | math(EXPR TEST_SHARDS_COUNT 2*${CPU_COUNT}) |
| 107 | math(EXPR TEST_SHARDS_MAX ${TEST_SHARDS_COUNT}-1) |
| 108 | foreach(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}) |
| 115 | endforeach(SHARD) |
| 116 | |
| 117 | add_custom_target(check |
Vitaly Buka | 7c99c8b | 2017-01-11 13:56:09 -0800 | [diff] [blame] | 118 | COMMAND ${CMAKE_CTEST_COMMAND} -j${CPU_COUNT} --output-on-failure |
| 119 | DEPENDS protobuf_mutator_test) |
| 120 | |
| 121 | # Examples |
Vitaly Buka | 77f9414 | 2017-01-27 19:03:10 -0800 | [diff] [blame] | 122 | if (NOT ${FUZZING_FLAGS} STREQUAL "") |
Vitaly Buka | 7c99c8b | 2017-01-11 13:56:09 -0800 | [diff] [blame] | 123 | include(libfuzzer) |
Vitaly Buka | 8cd4655 | 2017-01-30 17:29:21 -0800 | [diff] [blame] | 124 | |
Vitaly Buka | 8da5281 | 2017-01-20 15:14:44 -0800 | [diff] [blame] | 125 | protobuf_generate_cpp(LIB_FUZZER_EXAMPLE_PROTO_SRCS |
| 126 | LIB_FUZZER_EXAMPLE_PROTO_HDRS |
| 127 | examples/libfuzzer/libfuzzer_example.proto) |
Vitaly Buka | 7c99c8b | 2017-01-11 13:56:09 -0800 | [diff] [blame] | 128 | add_executable(libfuzzer_example |
Vitaly Buka | 8da5281 | 2017-01-20 15:14:44 -0800 | [diff] [blame] | 129 | examples/libfuzzer/libfuzzer_example.cc |
| 130 | ${LIB_FUZZER_EXAMPLE_PROTO_SRCS}) |
Vitaly Buka | 7c99c8b | 2017-01-11 13:56:09 -0800 | [diff] [blame] | 131 | target_link_libraries(libfuzzer_example |
Vitaly Buka | 8c64f9b | 2017-01-12 11:14:02 -0800 | [diff] [blame] | 132 | protobuf-mutator |
Vitaly Buka | 8a038c6 | 2017-01-17 13:22:58 -0800 | [diff] [blame] | 133 | ${LIBFUZZER_LIBRARIES} ${LIBXML2_LIBRARIES}) |
Vitaly Buka | 1ab1c02 | 2017-01-20 18:45:33 -0800 | [diff] [blame] | 134 | set_property(TARGET libfuzzer_example |
Vitaly Buka | 77f9414 | 2017-01-27 19:03:10 -0800 | [diff] [blame] | 135 | PROPERTY COMPILE_FLAGS ${FUZZING_FLAGS}) |
Vitaly Buka | 8da5281 | 2017-01-20 15:14:44 -0800 | [diff] [blame] | 136 | target_sources(protobuf_mutator_test PRIVATE examples/libfuzzer/libfuzzer_example_test.cc) |
Vitaly Buka | 7c99c8b | 2017-01-11 13:56:09 -0800 | [diff] [blame] | 137 | add_dependencies(protobuf_mutator_test libfuzzer_example) |
Vitaly Buka | b2a2e8e | 2017-01-13 19:52:54 -0800 | [diff] [blame] | 138 | |
Vitaly Buka | 77f9414 | 2017-01-27 19:03:10 -0800 | [diff] [blame] | 139 | set(LIBXML2_FLAGS "${EXTRA_FLAGS} ${FUZZING_FLAGS} -w") |
Vitaly Buka | b2a2e8e | 2017-01-13 19:52:54 -0800 | [diff] [blame] | 140 | include(libxml2) |
Vitaly Buka | 77f9414 | 2017-01-27 19:03:10 -0800 | [diff] [blame] | 141 | |
Vitaly Buka | b2a2e8e | 2017-01-13 19:52:54 -0800 | [diff] [blame] | 142 | # Unused dependency, just to make sure it compiles. |
| 143 | target_link_libraries(libfuzzer_example ${LIBXML2_LIBRARIES}) |
Vitaly Buka | 7c99c8b | 2017-01-11 13:56:09 -0800 | [diff] [blame] | 144 | endif() |
| 145 | |
Vitaly Buka | b93a146 | 2017-01-06 17:52:58 -0800 | [diff] [blame] | 146 | |