blob: aa8305fbc071790129e30ccb7e2b3dc268543684 [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
Vitaly Buka40f881f2017-02-04 11:09:15 -080018enable_language(C)
19enable_language(CXX)
20
Vitaly Bukacc394282017-02-04 00:05:43 -080021option(LIB_PROTO_MUTATOR_WITH_ASAN "Enable address sanitizer" ON)
Vitaly Buka606ea0a2017-05-11 22:30:52 -070022option(LIB_PROTO_MUTATOR_WITH_COVERAGE_FLAGS "Add libFuzzer specific coverage" ON)
Vitaly Bukacc394282017-02-04 00:05:43 -080023set(LIB_PROTO_MUTATOR_FUZZER_LIBRARIES "" CACHE STRING "Fuzzing engine libs")
24
Vitaly Bukac4593402016-10-20 16:17:52 -070025# External dependencies
Vitaly Buka6a21eac2017-01-12 14:40:48 -080026set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/external)
Vitaly Bukac4593402016-10-20 16:17:52 -070027
28# External dependencies
Vitaly Bukac2f0c692017-01-05 18:36:12 -080029include(ProcessorCount)
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080030include(CheckCCompilerFlag)
31include(CheckCXXCompilerFlag)
Vitaly Bukac4593402016-10-20 16:17:52 -070032
Vitaly Buka0b6d2fe2017-02-03 18:27:46 -080033find_package(Threads)
Vitaly Buka4f9e49a2017-01-30 22:12:56 -080034
Vitaly Buka0b6d2fe2017-02-03 18:27:46 -080035find_package(LibLZMA)
Vitaly Buka4f9e49a2017-01-30 22:12:56 -080036include_directories(${LIBLZMA_INCLUDE_DIRS})
37
Vitaly Buka0b6d2fe2017-02-03 18:27:46 -080038find_package(ZLIB)
Vitaly Buka4f9e49a2017-01-30 22:12:56 -080039include_directories(${ZLIB_INCLUDE_DIRS})
Vitaly Bukac4593402016-10-20 16:17:52 -070040
Vitaly Buka5ee534b2016-11-18 10:02:01 -080041set(CMAKE_CXX_STANDARD 11)
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080042
Vitaly Buka9dd2f8e2017-01-13 00:48:31 -080043include_directories(${PROJECT_SOURCE_DIR})
44
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080045set(CMAKE_REQUIRED_FLAGS "-fsanitize=address")
46check_cxx_compiler_flag(-fsanitize=address LIB_PROTO_MUTATOR_HAS_SANITIZE_ADDRESS)
47check_cxx_compiler_flag("-fsanitize=address -fsanitize-address-use-after-scope"
48 LIB_PROTO_MUTATOR_HAS_SANITIZE_SCOPE)
49unset(CMAKE_REQUIRED_FLAGS)
Vitaly Buka77f94142017-01-27 19:03:10 -080050
Vitaly Bukacc394282017-02-04 00:05:43 -080051set(CMAKE_REQUIRED_FLAGS "-fsanitize-coverage=")
52check_cxx_compiler_flag(-fsanitize-coverage= LIB_PROTO_MUTATOR_HAS_COVERAGE)
53unset(CMAKE_REQUIRED_FLAGS)
54
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080055set(CMAKE_REQUIRED_FLAGS "-fsanitize-coverage=trace-pc-guard")
Vitaly Buka77f94142017-01-27 19:03:10 -080056check_cxx_compiler_flag(-fsanitize-coverage=trace-pc-guard LIB_PROTO_MUTATOR_HAS_TRACE_PC)
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080057unset(CMAKE_REQUIRED_FLAGS)
58
Vitaly Buka77f94142017-01-27 19:03:10 -080059set(CMAKE_REQUIRED_FLAGS "-fsanitize-coverage=trace-cmp")
60check_cxx_compiler_flag(-fsanitize-coverage=trace-cmp LIB_PROTO_MUTATOR_HAS_TRACE_CMP)
61unset(CMAKE_REQUIRED_FLAGS)
62
Vitaly Bukaa3f0ab82017-01-30 17:32:06 -080063set(EXTRA_FLAGS "-fno-exceptions -Werror -Wall")
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080064if (LIB_PROTO_MUTATOR_WITH_ASAN)
65 if (LIB_PROTO_MUTATOR_HAS_SANITIZE_ADDRESS)
Vitaly Buka8a038c62017-01-17 13:22:58 -080066 set(EXTRA_FLAGS "${EXTRA_FLAGS} -fsanitize=address")
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080067 if (LIB_PROTO_MUTATOR_HAS_SANITIZE_SCOPE)
Vitaly Buka8a038c62017-01-17 13:22:58 -080068 set(EXTRA_FLAGS "${EXTRA_FLAGS} -fsanitize-address-use-after-scope")
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080069 endif()
70 endif()
Vitaly Bukaaa7be1e2017-01-06 16:29:28 -080071endif()
72
Vitaly Buka40f881f2017-02-04 11:09:15 -080073if (LIB_PROTO_MUTATOR_HAS_TRACE_PC)
74 list(APPEND SANITIZE_COVERAGE_OPTIONS trace-pc-guard)
75endif()
76if (LIB_PROTO_MUTATOR_HAS_TRACE_CMP)
77 list(APPEND SANITIZE_COVERAGE_OPTIONS trace-cmp)
78endif()
79
80if (SANITIZE_COVERAGE_OPTIONS)
Vitaly Buka606ea0a2017-05-11 22:30:52 -070081 if (LIB_PROTO_MUTATOR_WITH_COVERAGE_FLAGS)
82 foreach(OPT ${SANITIZE_COVERAGE_OPTIONS})
83 set(FUZZING_FLAGS "${FUZZING_FLAGS},${OPT}")
84 endforeach()
85 string(SUBSTRING ${FUZZING_FLAGS} 1 -1 FUZZING_FLAGS)
86 set(FUZZING_FLAGS "-fsanitize-coverage=${FUZZING_FLAGS}")
87 endif()
88 set(NO_FUZZING_FLAGS "-fsanitize-coverage=0")
Vitaly Buka40f881f2017-02-04 11:09:15 -080089endif()
90
Vitaly Bukaf5072d22017-01-27 20:39:21 -080091set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_FLAGS}")
92set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_FLAGS}")
Vitaly Buka8a038c62017-01-17 13:22:58 -080093
Vitaly Buka40f881f2017-02-04 11:09:15 -080094set(PROTOBUF_CFLAGS "${CMAKE_C_FLAGS} ${NO_FUZZING_FLAGS} -w")
95set(PROTOBUF_CXXFLAGS "${CMAKE_CXX_FLAGS} ${NO_FUZZING_FLAGS} -w")
Vitaly Buka8a038c62017-01-17 13:22:58 -080096include(protobuf)
Vitaly Bukac4593402016-10-20 16:17:52 -070097
Vitaly Buka1109c002016-10-20 17:25:19 -070098enable_testing()
Vitaly Buka5b1a0032017-02-17 00:06:06 -080099
Vitaly Buka40f881f2017-02-04 11:09:15 -0800100include(googletest)
Vitaly Buka1109c002016-10-20 17:25:19 -0700101
Vitaly Bukac2f0c692017-01-05 18:36:12 -0800102ProcessorCount(CPU_COUNT)
Vitaly Bukac2f0c692017-01-05 18:36:12 -0800103add_custom_target(check
Vitaly Buka5b1a0032017-02-17 00:06:06 -0800104 COMMAND ${CMAKE_CTEST_COMMAND} -j${CPU_COUNT} --output-on-failure)
Vitaly Buka7c99c8b2017-01-11 13:56:09 -0800105
Vitaly Buka5b1a0032017-02-17 00:06:06 -0800106add_subdirectory(src)
107
Vitaly Buka40f881f2017-02-04 11:09:15 -0800108if ("${LIB_PROTO_MUTATOR_FUZZER_LIBRARIES}" STREQUAL "" AND
109 NOT "${FUZZING_FLAGS}" STREQUAL "")
110 include(libfuzzer)
Vitaly Bukacc394282017-02-04 00:05:43 -0800111endif()
112
113if (NOT "${LIB_PROTO_MUTATOR_FUZZER_LIBRARIES}" STREQUAL "")
Vitaly Buka5b1a0032017-02-17 00:06:06 -0800114 add_subdirectory(examples)
Vitaly Buka7c99c8b2017-01-11 13:56:09 -0800115endif()
Vitaly Buka5b1a0032017-02-17 00:06:06 -0800116