blob: a8fe9e6c72d30d6e428136243b9e32e89dcddfc9 [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
Kitsu652f3872018-09-27 22:53:13 +030021option(LIB_PROTO_MUTATOR_TESTING "Enable test building" ON)
Matt Morehouseddd2e482017-08-02 15:04:27 -070022option(LIB_PROTO_MUTATOR_DOWNLOAD_PROTOBUF
23 "Automatically download working protobuf" OFF)
Vitaly Buka19669022017-05-12 21:00:19 -070024option(LIB_PROTO_MUTATOR_WITH_ASAN "Enable address sanitizer" OFF)
Michal Rostecki0b686f92018-10-24 11:39:00 +020025option(PKG_CONFIG_PATH "Directory to install pkgconfig file" "share/pkgconfig")
Vitaly Buka53dccbe2017-10-16 18:27:21 -070026set(LIB_PROTO_MUTATOR_FUZZER_LIBRARIES "" CACHE STRING "Fuzzing engine libs")
Vitaly Bukacc394282017-02-04 00:05:43 -080027
Vitaly Bukac4593402016-10-20 16:17:52 -070028# External dependencies
Vitaly Buka6a21eac2017-01-12 14:40:48 -080029set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/external)
Vitaly Bukac4593402016-10-20 16:17:52 -070030
31# External dependencies
Vitaly Bukac2f0c692017-01-05 18:36:12 -080032include(ProcessorCount)
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080033include(CheckCCompilerFlag)
34include(CheckCXXCompilerFlag)
Vitaly Bukac4593402016-10-20 16:17:52 -070035
Vitaly Bukad8ad9652017-05-12 22:00:56 -070036set(THREADS_PREFER_PTHREAD_FLAG ON)
Vitaly Buka0b6d2fe2017-02-03 18:27:46 -080037find_package(Threads)
Vitaly Buka4f9e49a2017-01-30 22:12:56 -080038
Vitaly Buka0b6d2fe2017-02-03 18:27:46 -080039find_package(LibLZMA)
Vitaly Buka4f9e49a2017-01-30 22:12:56 -080040include_directories(${LIBLZMA_INCLUDE_DIRS})
41
Vitaly Buka0b6d2fe2017-02-03 18:27:46 -080042find_package(ZLIB)
Vitaly Buka4f9e49a2017-01-30 22:12:56 -080043include_directories(${ZLIB_INCLUDE_DIRS})
Vitaly Bukac4593402016-10-20 16:17:52 -070044
Vitaly Buka5ee534b2016-11-18 10:02:01 -080045set(CMAKE_CXX_STANDARD 11)
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080046
Vitaly Buka9dd2f8e2017-01-13 00:48:31 -080047include_directories(${PROJECT_SOURCE_DIR})
48
Toshi Piazza012cc2f2019-05-29 15:30:36 -070049if (MSVC)
50 option(LIB_PROTO_MUTATOR_MSVC_STATIC_RUNTIME "Link static runtime libraries" ON)
51 if (LIB_PROTO_MUTATOR_DOWNLOAD_PROTOBUF OR LIB_PROTO_MUTATOR_MSVC_STATIC_RUNTIME)
52 # This is the default for protobuf with MSVC
53 # http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_build_my_MSVC_application_with_a_static_runtime.3F
54 foreach(flag_var
55 CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
56 CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
57 if(${flag_var} MATCHES "/MD")
58 string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
59 endif(${flag_var} MATCHES "/MD")
60 endforeach(flag_var)
61 endif (LIB_PROTO_MUTATOR_DOWNLOAD_PROTOBUF OR LIB_PROTO_MUTATOR_MSVC_STATIC_RUNTIME)
62endif (MSVC)
63
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080064set(CMAKE_REQUIRED_FLAGS "-fsanitize=address")
65check_cxx_compiler_flag(-fsanitize=address LIB_PROTO_MUTATOR_HAS_SANITIZE_ADDRESS)
66check_cxx_compiler_flag("-fsanitize=address -fsanitize-address-use-after-scope"
67 LIB_PROTO_MUTATOR_HAS_SANITIZE_SCOPE)
68unset(CMAKE_REQUIRED_FLAGS)
Vitaly Buka77f94142017-01-27 19:03:10 -080069
Vitaly Buka99a97c02017-10-16 18:11:29 -070070set(CMAKE_REQUIRED_FLAGS "-fsanitize-coverage=0")
71check_cxx_compiler_flag(-fsanitize-coverage= LIB_PROTO_MUTATOR_HAS_NO_COVERAGE)
72unset(CMAKE_REQUIRED_FLAGS)
73
Vitaly Buka7218a152017-10-16 16:36:40 -070074set(CMAKE_REQUIRED_FLAGS "-fsanitize=fuzzer-no-link")
75check_cxx_compiler_flag(-fsanitize=fuzzer-no-link LIB_PROTO_MUTATOR_HAS_SANITIZE_FUZZER)
Vitaly Bukacc394282017-02-04 00:05:43 -080076unset(CMAKE_REQUIRED_FLAGS)
77
Vitaly Buka7218a152017-10-16 16:36:40 -070078set(CMAKE_REQUIRED_FLAGS "-fno-sanitize=fuzzer")
79check_cxx_compiler_flag(-fno-sanitize=fuzzer LIB_PROTO_MUTATOR_HAS_NO_SANITIZE_FUZZER)
Vitaly Buka77f94142017-01-27 19:03:10 -080080unset(CMAKE_REQUIRED_FLAGS)
81
Vitaly Bukac1a194b2017-09-13 15:19:30 -070082check_cxx_compiler_flag(-Wstring-conversion LIB_PROTO_MUTATOR_HAS_WSTRING_CONVERSION)
83
Toshi Piazza012cc2f2019-05-29 15:30:36 -070084if (NOT MSVC)
85 set(EXTRA_FLAGS "-fno-exceptions -Werror -Wall")
86 if (LIB_PROTO_MUTATOR_HAS_WSTRING_CONVERSION)
87 set(EXTRA_FLAGS "${EXTRA_FLAGS} -Wstring-conversion")
88 endif()
89endif(NOT MSVC)
Vitaly Buka19669022017-05-12 21:00:19 -070090
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080091if (LIB_PROTO_MUTATOR_WITH_ASAN)
92 if (LIB_PROTO_MUTATOR_HAS_SANITIZE_ADDRESS)
Vitaly Buka8a038c62017-01-17 13:22:58 -080093 set(EXTRA_FLAGS "${EXTRA_FLAGS} -fsanitize=address")
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080094 if (LIB_PROTO_MUTATOR_HAS_SANITIZE_SCOPE)
Vitaly Buka8a038c62017-01-17 13:22:58 -080095 set(EXTRA_FLAGS "${EXTRA_FLAGS} -fsanitize-address-use-after-scope")
Vitaly Buka7c99c8b2017-01-11 13:56:09 -080096 endif()
97 endif()
Vitaly Bukaaa7be1e2017-01-06 16:29:28 -080098endif()
99
Vitaly Buka53dccbe2017-10-16 18:27:21 -0700100# Assume CFLAGS has coverage options if LIB_PROTO_MUTATOR_FUZZER_LIBRARIES was set
101if ("${LIB_PROTO_MUTATOR_FUZZER_LIBRARIES}" STREQUAL "")
102 if (LIB_PROTO_MUTATOR_HAS_SANITIZE_FUZZER)
103 set(FUZZING_FLAGS "-fsanitize=fuzzer-no-link")
104 set(FUZZING_FLAGS_BINARY "-fsanitize=fuzzer")
105 endif()
106 if (LIB_PROTO_MUTATOR_HAS_SANITIZE_NO_FUZZER)
107 set(NO_FUZZING_FLAGS "-fno-sanitize=fuzzer")
108 endif()
Vitaly Buka19669022017-05-12 21:00:19 -0700109endif()
Vitaly Buka99a97c02017-10-16 18:11:29 -0700110if (LIB_PROTO_MUTATOR_HAS_NO_COVERAGE)
111 set(NO_FUZZING_FLAGS "${NO_FUZZING_FLAGS} -fsanitize-coverage=0")
112endif()
Vitaly Buka19669022017-05-12 21:00:19 -0700113
Vitaly Bukaf5072d22017-01-27 20:39:21 -0800114set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_FLAGS}")
115set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_FLAGS}")
Vitaly Buka8a038c62017-01-17 13:22:58 -0800116
Vitaly Buka40f881f2017-02-04 11:09:15 -0800117set(PROTOBUF_CFLAGS "${CMAKE_C_FLAGS} ${NO_FUZZING_FLAGS} -w")
118set(PROTOBUF_CXXFLAGS "${CMAKE_CXX_FLAGS} ${NO_FUZZING_FLAGS} -w")
Vitaly Bukad09fb102017-05-12 22:20:40 -0700119if(CMAKE_USE_PTHREADS_INIT)
Vitaly Bukad8ad9652017-05-12 22:00:56 -0700120 set(PROTOBUF_CFLAGS "${PROTOBUF_CFLAGS} -pthread")
121 set(PROTOBUF_CXXFLAGS "${PROTOBUF_CXXFLAGS} -pthread")
122endif()
Matt Morehouse12a53ca2017-08-02 14:16:26 -0700123
Matt Morehouseddd2e482017-08-02 15:04:27 -0700124if (LIB_PROTO_MUTATOR_DOWNLOAD_PROTOBUF)
Matt Morehouse12a53ca2017-08-02 14:16:26 -0700125 include(protobuf)
126else()
127 find_package(Protobuf REQUIRED)
128 include_directories(${PROTOBUF_INCLUDE_DIRS})
129 include_directories(${CMAKE_CURRENT_BINARY_DIR})
130endif()
Vitaly Bukac4593402016-10-20 16:17:52 -0700131
Allen Webb17de2c32018-10-25 13:22:47 -0700132set(LIB_DIR "lib${LIB_SUFFIX}")
133
Kitsu652f3872018-09-27 22:53:13 +0300134if (LIB_PROTO_MUTATOR_TESTING)
135 enable_testing()
Vitaly Buka5b1a0032017-02-17 00:06:06 -0800136
Kitsu652f3872018-09-27 22:53:13 +0300137 include(googletest)
Vitaly Buka1109c002016-10-20 17:25:19 -0700138
Kitsu652f3872018-09-27 22:53:13 +0300139 if (NOT LIB_PROTO_MUTATOR_CTEST_JOBS)
140 ProcessorCount(LIB_PROTO_MUTATOR_CTEST_JOBS)
141 endif()
142 add_custom_target(check
143 COMMAND ${CMAKE_CTEST_COMMAND} -j${LIB_PROTO_MUTATOR_CTEST_JOBS} --output-on-failure)
morehouseaec5bb42017-08-25 14:12:09 -0700144endif()
Vitaly Buka7c99c8b2017-01-11 13:56:09 -0800145
Vitaly Buka5b1a0032017-02-17 00:06:06 -0800146add_subdirectory(src)
147
Vitaly Buka53dccbe2017-10-16 18:27:21 -0700148if (NOT "${LIB_PROTO_MUTATOR_FUZZER_LIBRARIES}" STREQUAL "" OR
149 NOT "${FUZZING_FLAGS}" STREQUAL "")
Matt Morehousead1c84a2017-08-23 11:02:15 -0700150 add_subdirectory(examples EXCLUDE_FROM_ALL)
Vitaly Buka7c99c8b2017-01-11 13:56:09 -0800151endif()
Vitaly Buka5b1a0032017-02-17 00:06:06 -0800152
Andrei Lebedev83727392020-09-23 21:50:46 +0300153install(EXPORT libprotobuf-mutatorTargets FILE libprotobuf-mutatorTargets.cmake
154 NAMESPACE libprotobuf-mutator:: DESTINATION lib/cmake/libprotobuf-mutator)
155configure_file(libprotobuf-mutatorConfig.cmake.in libprotobuf-mutatorConfig.cmake @ONLY)
156install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libprotobuf-mutatorConfig.cmake"
157 DESTINATION lib/cmake/libprotobuf-mutator)
Allen Webbd5e434f2018-08-23 14:04:32 -0700158configure_file("libprotobuf-mutator.pc.in" "libprotobuf-mutator.pc" @ONLY)
159install(FILES "${CMAKE_BINARY_DIR}/libprotobuf-mutator.pc"
Michal Rostecki0b686f92018-10-24 11:39:00 +0200160 DESTINATION ${PKG_CONFIG_PATH})
Allen Webbd5e434f2018-08-23 14:04:32 -0700161install(DIRECTORY ./port ./src DESTINATION include/libprotobuf-mutator
162 FILES_MATCHING PATTERN "*.h")