1*fd525a9cSAndroid Build Coastguard Worker# Copyright 2016 Google Inc. All rights reserved. 2*fd525a9cSAndroid Build Coastguard Worker# 3*fd525a9cSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*fd525a9cSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*fd525a9cSAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*fd525a9cSAndroid Build Coastguard Worker# 7*fd525a9cSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*fd525a9cSAndroid Build Coastguard Worker# 9*fd525a9cSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*fd525a9cSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*fd525a9cSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*fd525a9cSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*fd525a9cSAndroid Build Coastguard Worker# limitations under the License. 14*fd525a9cSAndroid Build Coastguard Worker 15*fd525a9cSAndroid Build Coastguard Workercmake_minimum_required(VERSION 3.5) 16*fd525a9cSAndroid Build Coastguard Workerproject(LibProtobufMutator CXX) 17*fd525a9cSAndroid Build Coastguard Worker 18*fd525a9cSAndroid Build Coastguard Workerenable_language(C) 19*fd525a9cSAndroid Build Coastguard Workerenable_language(CXX) 20*fd525a9cSAndroid Build Coastguard Worker 21*fd525a9cSAndroid Build Coastguard Workeroption(LIB_PROTO_MUTATOR_TESTING "Enable test building" ON) 22*fd525a9cSAndroid Build Coastguard Workeroption(LIB_PROTO_MUTATOR_DOWNLOAD_PROTOBUF 23*fd525a9cSAndroid Build Coastguard Worker "Automatically download working protobuf" OFF) 24*fd525a9cSAndroid Build Coastguard Workeroption(LIB_PROTO_MUTATOR_WITH_ASAN "Enable address sanitizer" OFF) 25*fd525a9cSAndroid Build Coastguard Workeroption(PKG_CONFIG_PATH "Directory to install pkgconfig file" "share/pkgconfig") 26*fd525a9cSAndroid Build Coastguard Workerset(LIB_PROTO_MUTATOR_FUZZER_LIBRARIES "" CACHE STRING "Fuzzing engine libs") 27*fd525a9cSAndroid Build Coastguard Worker 28*fd525a9cSAndroid Build Coastguard Worker# External dependencies 29*fd525a9cSAndroid Build Coastguard Workerset(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/external) 30*fd525a9cSAndroid Build Coastguard Worker 31*fd525a9cSAndroid Build Coastguard Worker# External dependencies 32*fd525a9cSAndroid Build Coastguard Workerinclude(ProcessorCount) 33*fd525a9cSAndroid Build Coastguard Workerinclude(CheckCCompilerFlag) 34*fd525a9cSAndroid Build Coastguard Workerinclude(CheckCXXCompilerFlag) 35*fd525a9cSAndroid Build Coastguard Worker 36*fd525a9cSAndroid Build Coastguard Workerset(THREADS_PREFER_PTHREAD_FLAG ON) 37*fd525a9cSAndroid Build Coastguard Workerfind_package(Threads) 38*fd525a9cSAndroid Build Coastguard Worker 39*fd525a9cSAndroid Build Coastguard Workerfind_package(LibLZMA) 40*fd525a9cSAndroid Build Coastguard Workerinclude_directories(${LIBLZMA_INCLUDE_DIRS}) 41*fd525a9cSAndroid Build Coastguard Worker 42*fd525a9cSAndroid Build Coastguard Workerfind_package(ZLIB) 43*fd525a9cSAndroid Build Coastguard Workerinclude_directories(${ZLIB_INCLUDE_DIRS}) 44*fd525a9cSAndroid Build Coastguard Worker 45*fd525a9cSAndroid Build Coastguard Workerset(CMAKE_CXX_STANDARD 11) 46*fd525a9cSAndroid Build Coastguard Worker 47*fd525a9cSAndroid Build Coastguard Workerinclude_directories(${PROJECT_SOURCE_DIR}) 48*fd525a9cSAndroid Build Coastguard Worker 49*fd525a9cSAndroid Build Coastguard Workerif (MSVC) 50*fd525a9cSAndroid Build Coastguard Worker option(LIB_PROTO_MUTATOR_MSVC_STATIC_RUNTIME "Link static runtime libraries" ON) 51*fd525a9cSAndroid Build Coastguard Worker if (LIB_PROTO_MUTATOR_DOWNLOAD_PROTOBUF OR LIB_PROTO_MUTATOR_MSVC_STATIC_RUNTIME) 52*fd525a9cSAndroid Build Coastguard Worker # This is the default for protobuf with MSVC 53*fd525a9cSAndroid Build Coastguard Worker # http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_build_my_MSVC_application_with_a_static_runtime.3F 54*fd525a9cSAndroid Build Coastguard Worker foreach(flag_var 55*fd525a9cSAndroid Build Coastguard Worker CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE 56*fd525a9cSAndroid Build Coastguard Worker CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) 57*fd525a9cSAndroid Build Coastguard Worker if(${flag_var} MATCHES "/MD") 58*fd525a9cSAndroid Build Coastguard Worker string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") 59*fd525a9cSAndroid Build Coastguard Worker endif(${flag_var} MATCHES "/MD") 60*fd525a9cSAndroid Build Coastguard Worker endforeach(flag_var) 61*fd525a9cSAndroid Build Coastguard Worker endif (LIB_PROTO_MUTATOR_DOWNLOAD_PROTOBUF OR LIB_PROTO_MUTATOR_MSVC_STATIC_RUNTIME) 62*fd525a9cSAndroid Build Coastguard Workerendif (MSVC) 63*fd525a9cSAndroid Build Coastguard Worker 64*fd525a9cSAndroid Build Coastguard Workerset(CMAKE_REQUIRED_FLAGS "-fsanitize=address") 65*fd525a9cSAndroid Build Coastguard Workercheck_cxx_compiler_flag(-fsanitize=address LIB_PROTO_MUTATOR_HAS_SANITIZE_ADDRESS) 66*fd525a9cSAndroid Build Coastguard Workercheck_cxx_compiler_flag("-fsanitize=address -fsanitize-address-use-after-scope" 67*fd525a9cSAndroid Build Coastguard Worker LIB_PROTO_MUTATOR_HAS_SANITIZE_SCOPE) 68*fd525a9cSAndroid Build Coastguard Workerunset(CMAKE_REQUIRED_FLAGS) 69*fd525a9cSAndroid Build Coastguard Worker 70*fd525a9cSAndroid Build Coastguard Workerset(CMAKE_REQUIRED_FLAGS "-fsanitize-coverage=0") 71*fd525a9cSAndroid Build Coastguard Workercheck_cxx_compiler_flag(-fsanitize-coverage= LIB_PROTO_MUTATOR_HAS_NO_COVERAGE) 72*fd525a9cSAndroid Build Coastguard Workerunset(CMAKE_REQUIRED_FLAGS) 73*fd525a9cSAndroid Build Coastguard Worker 74*fd525a9cSAndroid Build Coastguard Workerset(CMAKE_REQUIRED_FLAGS "-fsanitize=fuzzer-no-link") 75*fd525a9cSAndroid Build Coastguard Workercheck_cxx_compiler_flag(-fsanitize=fuzzer-no-link LIB_PROTO_MUTATOR_HAS_SANITIZE_FUZZER) 76*fd525a9cSAndroid Build Coastguard Workerunset(CMAKE_REQUIRED_FLAGS) 77*fd525a9cSAndroid Build Coastguard Worker 78*fd525a9cSAndroid Build Coastguard Workerset(CMAKE_REQUIRED_FLAGS "-fno-sanitize=fuzzer") 79*fd525a9cSAndroid Build Coastguard Workercheck_cxx_compiler_flag(-fno-sanitize=fuzzer LIB_PROTO_MUTATOR_HAS_NO_SANITIZE_FUZZER) 80*fd525a9cSAndroid Build Coastguard Workerunset(CMAKE_REQUIRED_FLAGS) 81*fd525a9cSAndroid Build Coastguard Worker 82*fd525a9cSAndroid Build Coastguard Workercheck_cxx_compiler_flag(-Wstring-conversion LIB_PROTO_MUTATOR_HAS_WSTRING_CONVERSION) 83*fd525a9cSAndroid Build Coastguard Worker 84*fd525a9cSAndroid Build Coastguard Workerif (NOT MSVC) 85*fd525a9cSAndroid Build Coastguard Worker set(EXTRA_FLAGS "-fno-exceptions -Werror -Wall") 86*fd525a9cSAndroid Build Coastguard Worker if (LIB_PROTO_MUTATOR_HAS_WSTRING_CONVERSION) 87*fd525a9cSAndroid Build Coastguard Worker set(EXTRA_FLAGS "${EXTRA_FLAGS} -Wstring-conversion") 88*fd525a9cSAndroid Build Coastguard Worker endif() 89*fd525a9cSAndroid Build Coastguard Workerendif(NOT MSVC) 90*fd525a9cSAndroid Build Coastguard Worker 91*fd525a9cSAndroid Build Coastguard Workerif (LIB_PROTO_MUTATOR_WITH_ASAN) 92*fd525a9cSAndroid Build Coastguard Worker if (LIB_PROTO_MUTATOR_HAS_SANITIZE_ADDRESS) 93*fd525a9cSAndroid Build Coastguard Worker set(EXTRA_FLAGS "${EXTRA_FLAGS} -fsanitize=address") 94*fd525a9cSAndroid Build Coastguard Worker if (LIB_PROTO_MUTATOR_HAS_SANITIZE_SCOPE) 95*fd525a9cSAndroid Build Coastguard Worker set(EXTRA_FLAGS "${EXTRA_FLAGS} -fsanitize-address-use-after-scope") 96*fd525a9cSAndroid Build Coastguard Worker endif() 97*fd525a9cSAndroid Build Coastguard Worker endif() 98*fd525a9cSAndroid Build Coastguard Workerendif() 99*fd525a9cSAndroid Build Coastguard Worker 100*fd525a9cSAndroid Build Coastguard Worker# Assume CFLAGS has coverage options if LIB_PROTO_MUTATOR_FUZZER_LIBRARIES was set 101*fd525a9cSAndroid Build Coastguard Workerif ("${LIB_PROTO_MUTATOR_FUZZER_LIBRARIES}" STREQUAL "") 102*fd525a9cSAndroid Build Coastguard Worker if (LIB_PROTO_MUTATOR_HAS_SANITIZE_FUZZER) 103*fd525a9cSAndroid Build Coastguard Worker set(FUZZING_FLAGS "-fsanitize=fuzzer-no-link") 104*fd525a9cSAndroid Build Coastguard Worker set(FUZZING_FLAGS_BINARY "-fsanitize=fuzzer") 105*fd525a9cSAndroid Build Coastguard Worker endif() 106*fd525a9cSAndroid Build Coastguard Worker if (LIB_PROTO_MUTATOR_HAS_SANITIZE_NO_FUZZER) 107*fd525a9cSAndroid Build Coastguard Worker set(NO_FUZZING_FLAGS "-fno-sanitize=fuzzer") 108*fd525a9cSAndroid Build Coastguard Worker endif() 109*fd525a9cSAndroid Build Coastguard Workerendif() 110*fd525a9cSAndroid Build Coastguard Workerif (LIB_PROTO_MUTATOR_HAS_NO_COVERAGE) 111*fd525a9cSAndroid Build Coastguard Worker set(NO_FUZZING_FLAGS "${NO_FUZZING_FLAGS} -fsanitize-coverage=0") 112*fd525a9cSAndroid Build Coastguard Workerendif() 113*fd525a9cSAndroid Build Coastguard Worker 114*fd525a9cSAndroid Build Coastguard Workerset(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_FLAGS}") 115*fd525a9cSAndroid Build Coastguard Workerset(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_FLAGS}") 116*fd525a9cSAndroid Build Coastguard Worker 117*fd525a9cSAndroid Build Coastguard Workerset(PROTOBUF_CFLAGS "${CMAKE_C_FLAGS} ${NO_FUZZING_FLAGS} -w") 118*fd525a9cSAndroid Build Coastguard Workerset(PROTOBUF_CXXFLAGS "${CMAKE_CXX_FLAGS} ${NO_FUZZING_FLAGS} -w") 119*fd525a9cSAndroid Build Coastguard Workerif(CMAKE_USE_PTHREADS_INIT) 120*fd525a9cSAndroid Build Coastguard Worker set(PROTOBUF_CFLAGS "${PROTOBUF_CFLAGS} -pthread") 121*fd525a9cSAndroid Build Coastguard Worker set(PROTOBUF_CXXFLAGS "${PROTOBUF_CXXFLAGS} -pthread") 122*fd525a9cSAndroid Build Coastguard Workerendif() 123*fd525a9cSAndroid Build Coastguard Worker 124*fd525a9cSAndroid Build Coastguard Workerif (LIB_PROTO_MUTATOR_DOWNLOAD_PROTOBUF) 125*fd525a9cSAndroid Build Coastguard Worker include(protobuf) 126*fd525a9cSAndroid Build Coastguard Workerelse() 127*fd525a9cSAndroid Build Coastguard Worker find_package(Protobuf REQUIRED) 128*fd525a9cSAndroid Build Coastguard Worker include_directories(${PROTOBUF_INCLUDE_DIRS}) 129*fd525a9cSAndroid Build Coastguard Worker include_directories(${CMAKE_CURRENT_BINARY_DIR}) 130*fd525a9cSAndroid Build Coastguard Workerendif() 131*fd525a9cSAndroid Build Coastguard Worker 132*fd525a9cSAndroid Build Coastguard Workerset(LIB_DIR "lib${LIB_SUFFIX}") 133*fd525a9cSAndroid Build Coastguard Worker 134*fd525a9cSAndroid Build Coastguard Workerif (LIB_PROTO_MUTATOR_TESTING) 135*fd525a9cSAndroid Build Coastguard Worker enable_testing() 136*fd525a9cSAndroid Build Coastguard Worker 137*fd525a9cSAndroid Build Coastguard Worker include(googletest) 138*fd525a9cSAndroid Build Coastguard Worker 139*fd525a9cSAndroid Build Coastguard Worker if (NOT LIB_PROTO_MUTATOR_CTEST_JOBS) 140*fd525a9cSAndroid Build Coastguard Worker ProcessorCount(LIB_PROTO_MUTATOR_CTEST_JOBS) 141*fd525a9cSAndroid Build Coastguard Worker endif() 142*fd525a9cSAndroid Build Coastguard Worker add_custom_target(check 143*fd525a9cSAndroid Build Coastguard Worker COMMAND ${CMAKE_CTEST_COMMAND} -j${LIB_PROTO_MUTATOR_CTEST_JOBS} --output-on-failure) 144*fd525a9cSAndroid Build Coastguard Workerendif() 145*fd525a9cSAndroid Build Coastguard Worker 146*fd525a9cSAndroid Build Coastguard Workeradd_subdirectory(src) 147*fd525a9cSAndroid Build Coastguard Worker 148*fd525a9cSAndroid Build Coastguard Workerif (NOT "${LIB_PROTO_MUTATOR_FUZZER_LIBRARIES}" STREQUAL "" OR 149*fd525a9cSAndroid Build Coastguard Worker NOT "${FUZZING_FLAGS}" STREQUAL "") 150*fd525a9cSAndroid Build Coastguard Worker add_subdirectory(examples EXCLUDE_FROM_ALL) 151*fd525a9cSAndroid Build Coastguard Workerendif() 152*fd525a9cSAndroid Build Coastguard Worker 153*fd525a9cSAndroid Build Coastguard Workerinstall(EXPORT libprotobuf-mutatorTargets FILE libprotobuf-mutatorTargets.cmake 154*fd525a9cSAndroid Build Coastguard Worker NAMESPACE libprotobuf-mutator:: DESTINATION lib/cmake/libprotobuf-mutator) 155*fd525a9cSAndroid Build Coastguard Workerconfigure_file(libprotobuf-mutatorConfig.cmake.in libprotobuf-mutatorConfig.cmake @ONLY) 156*fd525a9cSAndroid Build Coastguard Workerinstall(FILES "${CMAKE_CURRENT_BINARY_DIR}/libprotobuf-mutatorConfig.cmake" 157*fd525a9cSAndroid Build Coastguard Worker DESTINATION lib/cmake/libprotobuf-mutator) 158*fd525a9cSAndroid Build Coastguard Workerconfigure_file("libprotobuf-mutator.pc.in" "libprotobuf-mutator.pc" @ONLY) 159*fd525a9cSAndroid Build Coastguard Workerinstall(FILES "${CMAKE_BINARY_DIR}/libprotobuf-mutator.pc" 160*fd525a9cSAndroid Build Coastguard Worker DESTINATION ${PKG_CONFIG_PATH}) 161*fd525a9cSAndroid Build Coastguard Workerinstall(DIRECTORY ./port ./src DESTINATION include/libprotobuf-mutator 162*fd525a9cSAndroid Build Coastguard Worker FILES_MATCHING PATTERN "*.h") 163