xref: /aosp_15_r20/external/libprotobuf-mutator/CMakeLists.txt (revision fd525a9c096e28cf6f8d8719388df0568a611e7b)
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