blob: c69611e10bdf6d32c1de2953187196b7c67c955a [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
Matt Morehouseddd2e482017-08-02 15:04:27 -070021option(LIB_PROTO_MUTATOR_DOWNLOAD_PROTOBUF
22 "Automatically download working protobuf" OFF)
Vitaly Buka19669022017-05-12 21:00:19 -070023option(LIB_PROTO_MUTATOR_WITH_ASAN "Enable address sanitizer" OFF)
Vitaly Bukacc394282017-02-04 00:05:43 -080024set(LIB_PROTO_MUTATOR_FUZZER_LIBRARIES "" CACHE STRING "Fuzzing engine libs")
25
Vitaly Bukac4593402016-10-20 16:17:52 -070026# External dependencies
Vitaly Buka6a21eac2017-01-12 14:40:48 -080027set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/external)
Vitaly Bukac4593402016-10-20 16:17:52 -070028
29# External dependencies
Vitaly Bukac2f0c692017-01-05 18:36:12 -080030include(ProcessorCount)
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080031include(CheckCCompilerFlag)
32include(CheckCXXCompilerFlag)
Vitaly Bukac4593402016-10-20 16:17:52 -070033
Vitaly Bukad8ad9652017-05-12 22:00:56 -070034set(THREADS_PREFER_PTHREAD_FLAG ON)
Vitaly Buka0b6d2fe2017-02-03 18:27:46 -080035find_package(Threads)
Vitaly Buka4f9e49a2017-01-30 22:12:56 -080036
Vitaly Buka0b6d2fe2017-02-03 18:27:46 -080037find_package(LibLZMA)
Vitaly Buka4f9e49a2017-01-30 22:12:56 -080038include_directories(${LIBLZMA_INCLUDE_DIRS})
39
Vitaly Buka0b6d2fe2017-02-03 18:27:46 -080040find_package(ZLIB)
Vitaly Buka4f9e49a2017-01-30 22:12:56 -080041include_directories(${ZLIB_INCLUDE_DIRS})
Vitaly Bukac4593402016-10-20 16:17:52 -070042
Vitaly Buka5ee534b2016-11-18 10:02:01 -080043set(CMAKE_CXX_STANDARD 11)
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080044
Vitaly Buka9dd2f8e2017-01-13 00:48:31 -080045include_directories(${PROJECT_SOURCE_DIR})
46
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080047set(CMAKE_REQUIRED_FLAGS "-fsanitize=address")
48check_cxx_compiler_flag(-fsanitize=address LIB_PROTO_MUTATOR_HAS_SANITIZE_ADDRESS)
49check_cxx_compiler_flag("-fsanitize=address -fsanitize-address-use-after-scope"
50 LIB_PROTO_MUTATOR_HAS_SANITIZE_SCOPE)
51unset(CMAKE_REQUIRED_FLAGS)
Vitaly Buka77f94142017-01-27 19:03:10 -080052
Vitaly Buka19669022017-05-12 21:00:19 -070053set(CMAKE_REQUIRED_FLAGS "-fsanitize-coverage=0")
54check_cxx_compiler_flag(-fsanitize-coverage= LIB_PROTO_MUTATOR_HAS_NO_COVERAGE)
Vitaly Bukacc394282017-02-04 00:05:43 -080055unset(CMAKE_REQUIRED_FLAGS)
56
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080057set(CMAKE_REQUIRED_FLAGS "-fsanitize-coverage=trace-pc-guard")
Vitaly Buka77f94142017-01-27 19:03:10 -080058check_cxx_compiler_flag(-fsanitize-coverage=trace-pc-guard LIB_PROTO_MUTATOR_HAS_TRACE_PC)
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080059unset(CMAKE_REQUIRED_FLAGS)
60
Vitaly Buka77f94142017-01-27 19:03:10 -080061set(CMAKE_REQUIRED_FLAGS "-fsanitize-coverage=trace-cmp")
62check_cxx_compiler_flag(-fsanitize-coverage=trace-cmp LIB_PROTO_MUTATOR_HAS_TRACE_CMP)
63unset(CMAKE_REQUIRED_FLAGS)
64
Vitaly Bukac1a194b2017-09-13 15:19:30 -070065check_cxx_compiler_flag(-Wstring-conversion LIB_PROTO_MUTATOR_HAS_WSTRING_CONVERSION)
66
67set(EXTRA_FLAGS "-fno-exceptions -Werror -Wall")
68if (LIB_PROTO_MUTATOR_HAS_WSTRING_CONVERSION)
69 set(EXTRA_FLAGS "${EXTRA_FLAGS} -Wstring-conversion")
70endif
Vitaly Buka19669022017-05-12 21:00:19 -070071
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080072if (LIB_PROTO_MUTATOR_WITH_ASAN)
73 if (LIB_PROTO_MUTATOR_HAS_SANITIZE_ADDRESS)
Vitaly Buka8a038c62017-01-17 13:22:58 -080074 set(EXTRA_FLAGS "${EXTRA_FLAGS} -fsanitize=address")
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080075 if (LIB_PROTO_MUTATOR_HAS_SANITIZE_SCOPE)
Vitaly Buka8a038c62017-01-17 13:22:58 -080076 set(EXTRA_FLAGS "${EXTRA_FLAGS} -fsanitize-address-use-after-scope")
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080077 endif()
78 endif()
Vitaly Bukaaa7be1e2017-01-06 16:29:28 -080079endif()
80
Vitaly Buka40f881f2017-02-04 11:09:15 -080081if (LIB_PROTO_MUTATOR_HAS_TRACE_PC)
82 list(APPEND SANITIZE_COVERAGE_OPTIONS trace-pc-guard)
83endif()
84if (LIB_PROTO_MUTATOR_HAS_TRACE_CMP)
85 list(APPEND SANITIZE_COVERAGE_OPTIONS trace-cmp)
86endif()
87
88if (SANITIZE_COVERAGE_OPTIONS)
Vitaly Buka84aa25e2017-05-12 21:34:01 -070089 foreach(OPT ${SANITIZE_COVERAGE_OPTIONS})
90 set(FUZZING_FLAGS "${FUZZING_FLAGS},${OPT}")
91 endforeach()
92 string(SUBSTRING ${FUZZING_FLAGS} 1 -1 FUZZING_FLAGS)
93 set(FUZZING_FLAGS "-fsanitize-coverage=${FUZZING_FLAGS}")
Vitaly Buka606ea0a2017-05-11 22:30:52 -070094 set(NO_FUZZING_FLAGS "-fsanitize-coverage=0")
Vitaly Buka40f881f2017-02-04 11:09:15 -080095endif()
96
Vitaly Buka19669022017-05-12 21:00:19 -070097if (LIB_PROTO_MUTATOR_HAS_NO_COVERAGE)
98 set(NO_FUZZING_FLAGS "-fsanitize-coverage=0")
99endif()
100
Vitaly Bukaf5072d22017-01-27 20:39:21 -0800101set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_FLAGS}")
102set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_FLAGS}")
Vitaly Buka8a038c62017-01-17 13:22:58 -0800103
Vitaly Buka40f881f2017-02-04 11:09:15 -0800104set(PROTOBUF_CFLAGS "${CMAKE_C_FLAGS} ${NO_FUZZING_FLAGS} -w")
105set(PROTOBUF_CXXFLAGS "${CMAKE_CXX_FLAGS} ${NO_FUZZING_FLAGS} -w")
Vitaly Bukad09fb102017-05-12 22:20:40 -0700106if(CMAKE_USE_PTHREADS_INIT)
Vitaly Bukad8ad9652017-05-12 22:00:56 -0700107 set(PROTOBUF_CFLAGS "${PROTOBUF_CFLAGS} -pthread")
108 set(PROTOBUF_CXXFLAGS "${PROTOBUF_CXXFLAGS} -pthread")
109endif()
Matt Morehouse12a53ca2017-08-02 14:16:26 -0700110
Matt Morehouseddd2e482017-08-02 15:04:27 -0700111if (LIB_PROTO_MUTATOR_DOWNLOAD_PROTOBUF)
Matt Morehouse12a53ca2017-08-02 14:16:26 -0700112 include(protobuf)
113else()
114 find_package(Protobuf REQUIRED)
115 include_directories(${PROTOBUF_INCLUDE_DIRS})
116 include_directories(${CMAKE_CURRENT_BINARY_DIR})
117endif()
Vitaly Bukac4593402016-10-20 16:17:52 -0700118
Vitaly Buka1109c002016-10-20 17:25:19 -0700119enable_testing()
Vitaly Buka5b1a0032017-02-17 00:06:06 -0800120
Vitaly Buka40f881f2017-02-04 11:09:15 -0800121include(googletest)
Vitaly Buka1109c002016-10-20 17:25:19 -0700122
Vitaly Bukab3323e22017-08-25 15:53:32 -0700123if (NOT LIB_PROTO_MUTATOR_CTEST_JOBS)
124 ProcessorCount(LIB_PROTO_MUTATOR_CTEST_JOBS)
morehouseaec5bb42017-08-25 14:12:09 -0700125endif()
Vitaly Bukac2f0c692017-01-05 18:36:12 -0800126add_custom_target(check
Vitaly Bukab3323e22017-08-25 15:53:32 -0700127 COMMAND ${CMAKE_CTEST_COMMAND} -j${LIB_PROTO_MUTATOR_CTEST_JOBS} --output-on-failure)
Vitaly Buka7c99c8b2017-01-11 13:56:09 -0800128
Vitaly Buka5b1a0032017-02-17 00:06:06 -0800129add_subdirectory(src)
130
Vitaly Buka40f881f2017-02-04 11:09:15 -0800131if ("${LIB_PROTO_MUTATOR_FUZZER_LIBRARIES}" STREQUAL "" AND
132 NOT "${FUZZING_FLAGS}" STREQUAL "")
133 include(libfuzzer)
Vitaly Bukacc394282017-02-04 00:05:43 -0800134endif()
135
136if (NOT "${LIB_PROTO_MUTATOR_FUZZER_LIBRARIES}" STREQUAL "")
Matt Morehousead1c84a2017-08-23 11:02:15 -0700137 add_subdirectory(examples EXCLUDE_FROM_ALL)
Vitaly Buka7c99c8b2017-01-11 13:56:09 -0800138endif()
Vitaly Buka5b1a0032017-02-17 00:06:06 -0800139