Konstantin Podsvirov | 8298343 | 2015-07-31 23:36:00 +0300 | [diff] [blame] | 1 | # Minimum CMake required |
Adam Cozzette | 23e7cfd | 2022-03-04 13:13:19 -0800 | [diff] [blame] | 2 | cmake_minimum_required(VERSION 3.5) |
Feng Xiao | 4333edb | 2015-05-31 02:28:34 -0700 | [diff] [blame] | 3 | |
Konstantin Podsvirov | 7155629 | 2016-06-01 17:00:08 +0300 | [diff] [blame] | 4 | if(protobuf_VERBOSE) |
| 5 | message(STATUS "Protocol Buffers Configuring...") |
| 6 | endif() |
Feng Xiao | 4333edb | 2015-05-31 02:28:34 -0700 | [diff] [blame] | 7 | |
Konstantin Podsvirov | 905f464 | 2015-09-01 16:44:48 +0300 | [diff] [blame] | 8 | # CMake policies |
| 9 | cmake_policy(SET CMP0022 NEW) |
Mizux | 7306f54 | 2018-05-22 21:52:07 +0200 | [diff] [blame] | 10 | # On MacOS use @rpath/ for target's install name prefix path |
| 11 | if (POLICY CMP0042) |
| 12 | cmake_policy(SET CMP0042 NEW) |
| 13 | endif () |
| 14 | # Clear VERSION variables when no VERSION is given to project() |
Corentin Le Molgat | 1ec9beb | 2018-01-29 15:31:06 +0100 | [diff] [blame] | 15 | if(POLICY CMP0048) |
| 16 | cmake_policy(SET CMP0048 NEW) |
| 17 | endif() |
Saleem Abdulrasool | c47adad | 2021-07-31 16:07:04 -0700 | [diff] [blame] | 18 | # MSVC runtime library flags are selected by an abstraction. |
| 19 | if(POLICY CMP0091) |
| 20 | cmake_policy(SET CMP0091 NEW) |
| 21 | endif() |
Corentin Le Molgat | 1ec9beb | 2018-01-29 15:31:06 +0100 | [diff] [blame] | 22 | |
Konstantin Podsvirov | 7155629 | 2016-06-01 17:00:08 +0300 | [diff] [blame] | 23 | # Project |
| 24 | project(protobuf C CXX) |
| 25 | |
Arfrever Frehtes Taifersar Arahesis | def70d7 | 2022-03-08 00:00:00 +0000 | [diff] [blame] | 26 | if(protobuf_DEPRECATED_CMAKE_SUBDIRECTORY_USAGE) |
| 27 | if(CMAKE_PROJECT_NAME STREQUAL "protobuf") |
| 28 | get_filename_component(CMAKE_SOURCE_DIR ${CMAKE_SOURCE_DIR} DIRECTORY) |
| 29 | endif() |
| 30 | get_filename_component(CMAKE_CURRENT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORY) |
| 31 | get_filename_component(PROJECT_SOURCE_DIR ${PROJECT_SOURCE_DIR} DIRECTORY) |
| 32 | get_filename_component(protobuf_SOURCE_DIR ${protobuf_SOURCE_DIR} DIRECTORY) |
| 33 | endif() |
| 34 | |
Adam Cozzette | 500cbd7 | 2022-08-11 18:22:15 -0700 | [diff] [blame] | 35 | # Add c++14 flags |
Ivan Shynkarenka | f80a886 | 2018-05-02 02:51:08 +0300 | [diff] [blame] | 36 | if (CYGWIN) |
Adam Cozzette | 500cbd7 | 2022-08-11 18:22:15 -0700 | [diff] [blame] | 37 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++14") |
Ivan Shynkarenka | f80a886 | 2018-05-02 02:51:08 +0300 | [diff] [blame] | 38 | else() |
Adam Cozzette | 500cbd7 | 2022-08-11 18:22:15 -0700 | [diff] [blame] | 39 | set(CMAKE_CXX_STANDARD 14) |
Ivan Shynkarenka | f80a886 | 2018-05-02 02:51:08 +0300 | [diff] [blame] | 40 | set(CMAKE_CXX_STANDARD_REQUIRED ON) |
| 41 | set(CMAKE_CXX_EXTENSIONS OFF) |
| 42 | endif() |
Silver Chan | d3e8a54 | 2018-04-04 10:31:05 +0800 | [diff] [blame] | 43 | |
Chuck Atkins | 10c48c9 | 2020-02-11 10:22:38 -0500 | [diff] [blame] | 44 | # The Intel compiler isn't able to deal with noinline member functions of |
Peter Newman | e2cc2de | 2020-08-10 19:08:25 +0100 | [diff] [blame] | 45 | # template classes defined in headers. As such it spams the output with |
Chuck Atkins | 10c48c9 | 2020-02-11 10:22:38 -0500 | [diff] [blame] | 46 | # warning #2196: routine is both "inline" and "noinline" |
| 47 | # This silences that warning. |
| 48 | if (CMAKE_CXX_COMPILER_ID MATCHES Intel) |
| 49 | string(APPEND CMAKE_CXX_FLAGS " -diag-disable=2196") |
| 50 | endif() |
| 51 | |
Konstantin Podsvirov | 8298343 | 2015-07-31 23:36:00 +0300 | [diff] [blame] | 52 | # Options |
JCooky | 55645ca | 2022-02-03 01:29:25 +0900 | [diff] [blame] | 53 | option(protobuf_INSTALL "Install protobuf binaries and files" ON) |
Michael WERLE | 976f85b | 2020-05-01 16:50:53 +0900 | [diff] [blame] | 54 | if(WITH_PROTOC) |
| 55 | set(protobuf_PROTOC_EXE ${WITH_PROTOC} CACHE FILEPATH "Protocol Buffer Compiler executable" FORCE) |
| 56 | endif() |
Konstantin Podsvirov | 673d32e | 2015-09-15 15:30:02 +0300 | [diff] [blame] | 57 | option(protobuf_BUILD_TESTS "Build tests" ON) |
Josh Haberman | 4249692 | 2018-08-24 12:27:21 -0700 | [diff] [blame] | 58 | option(protobuf_BUILD_CONFORMANCE "Build conformance tests" OFF) |
Konstantin Podsvirov | 7155629 | 2016-06-01 17:00:08 +0300 | [diff] [blame] | 59 | option(protobuf_BUILD_EXAMPLES "Build examples" OFF) |
Mike Kruskal | 3edec1f | 2022-07-25 20:36:47 -0700 | [diff] [blame] | 60 | option(protobuf_BUILD_PROTOBUF_BINARIES "Build protobuf libraries and protoc compiler" ON) |
Yangqing Jia | cba18ef | 2017-11-13 15:15:39 -0800 | [diff] [blame] | 61 | option(protobuf_BUILD_PROTOC_BINARIES "Build libprotoc and protoc compiler" ON) |
Daniel Joos | c8f7633 | 2020-10-10 00:54:39 +0200 | [diff] [blame] | 62 | option(protobuf_BUILD_LIBPROTOC "Build libprotoc" OFF) |
Florian Simon | b9a036b | 2021-03-04 11:39:28 -0500 | [diff] [blame] | 63 | option(protobuf_DISABLE_RTTI "Remove runtime type information in the binaries" OFF) |
Mike Kruskal | 3edec1f | 2022-07-25 20:36:47 -0700 | [diff] [blame] | 64 | option(protobuf_TEST_XML_OUTDIR "Output directory for XML logs from tests." "") |
Konstantin Podsvirov | c3aa4c2 | 2015-10-15 02:56:48 +0300 | [diff] [blame] | 65 | if (BUILD_SHARED_LIBS) |
| 66 | set(protobuf_BUILD_SHARED_LIBS_DEFAULT ON) |
| 67 | else (BUILD_SHARED_LIBS) |
| 68 | set(protobuf_BUILD_SHARED_LIBS_DEFAULT OFF) |
| 69 | endif (BUILD_SHARED_LIBS) |
| 70 | option(protobuf_BUILD_SHARED_LIBS "Build Shared Libraries" ${protobuf_BUILD_SHARED_LIBS_DEFAULT}) |
Walter Gray | 4150a91 | 2016-06-09 13:25:27 -0700 | [diff] [blame] | 71 | include(CMakeDependentOption) |
Rafi Kamal | de75651 | 2019-11-20 18:03:29 -0800 | [diff] [blame] | 72 | cmake_dependent_option(protobuf_MSVC_STATIC_RUNTIME "Link static runtime libraries" ON |
| 73 | "NOT protobuf_BUILD_SHARED_LIBS" OFF) |
Corentin Le Molgat | 8dd0f4e | 2018-01-29 15:16:40 +0100 | [diff] [blame] | 74 | set(protobuf_WITH_ZLIB_DEFAULT ON) |
Konstantin Podsvirov | 620bd74 | 2015-09-15 15:31:25 +0300 | [diff] [blame] | 75 | option(protobuf_WITH_ZLIB "Build with zlib support" ${protobuf_WITH_ZLIB_DEFAULT}) |
Konstantin Podsvirov | f397ede | 2015-09-17 13:00:12 +0300 | [diff] [blame] | 76 | set(protobuf_DEBUG_POSTFIX "d" |
| 77 | CACHE STRING "Default debug postfix") |
Konstantin Podsvirov | 7155629 | 2016-06-01 17:00:08 +0300 | [diff] [blame] | 78 | mark_as_advanced(protobuf_DEBUG_POSTFIX) |
| 79 | # User options |
Arfrever Frehtes Taifersar Arahesis | 14cab5b | 2022-03-08 00:00:00 +0000 | [diff] [blame] | 80 | include(${protobuf_SOURCE_DIR}/cmake/protobuf-options.cmake) |
Feng Xiao | 4333edb | 2015-05-31 02:28:34 -0700 | [diff] [blame] | 81 | |
Mike Kruskal | bc1b310 | 2022-08-16 16:31:35 -0700 | [diff] [blame] | 82 | if (protobuf_BUILD_SHARED_LIBS) |
| 83 | # This is necessary for linking in Abseil. |
| 84 | set(CMAKE_POSITION_INDEPENDENT_CODE ON) |
| 85 | endif () |
| 86 | |
Mike Kruskal | ed5c57a | 2022-08-10 22:51:29 -0700 | [diff] [blame] | 87 | # Version metadata |
| 88 | set(protobuf_VERSION_STRING "3.21.4") |
| 89 | set(protobuf_DESCRIPTION "Protocol Buffers") |
| 90 | set(protobuf_CONTACT "protobuf@googlegroups.com") |
| 91 | |
Michael WERLE | 976f85b | 2020-05-01 16:50:53 +0900 | [diff] [blame] | 92 | # Overrides for option dependencies |
| 93 | if (protobuf_BUILD_PROTOC_BINARIES OR protobuf_BUILD_TESTS) |
| 94 | set(protobuf_BUILD_LIBPROTOC ON) |
Michael WERLE | 976f85b | 2020-05-01 16:50:53 +0900 | [diff] [blame] | 95 | endif () |
Mike Kruskal | 3edec1f | 2022-07-25 20:36:47 -0700 | [diff] [blame] | 96 | if (NOT protobuf_BUILD_PROTOBUF_BINARIES) |
| 97 | set(protobuf_INSTALL OFF) |
| 98 | endif() |
Konstantin Podsvirov | 743ec44 | 2015-08-01 02:01:42 +0300 | [diff] [blame] | 99 | # Parse version tweaks |
Paul Yang | 5b4ac53 | 2019-02-01 18:43:55 -0800 | [diff] [blame] | 100 | set(protobuf_VERSION_REGEX "^([0-9]+)\\.([0-9]+)\\.([0-9]+)([-]rc[-]|\\.)?([0-9]*)$") |
Konstantin Podsvirov | db01460 | 2015-08-31 15:20:18 +0300 | [diff] [blame] | 101 | string(REGEX REPLACE "${protobuf_VERSION_REGEX}" "\\1" |
Konstantin Podsvirov | 743ec44 | 2015-08-01 02:01:42 +0300 | [diff] [blame] | 102 | protobuf_VERSION_MAJOR "${protobuf_VERSION_STRING}") |
Konstantin Podsvirov | db01460 | 2015-08-31 15:20:18 +0300 | [diff] [blame] | 103 | string(REGEX REPLACE "${protobuf_VERSION_REGEX}" "\\2" |
Konstantin Podsvirov | 743ec44 | 2015-08-01 02:01:42 +0300 | [diff] [blame] | 104 | protobuf_VERSION_MINOR "${protobuf_VERSION_STRING}") |
Konstantin Podsvirov | db01460 | 2015-08-31 15:20:18 +0300 | [diff] [blame] | 105 | string(REGEX REPLACE "${protobuf_VERSION_REGEX}" "\\3" |
Konstantin Podsvirov | 743ec44 | 2015-08-01 02:01:42 +0300 | [diff] [blame] | 106 | protobuf_VERSION_PATCH "${protobuf_VERSION_STRING}") |
Paul Yang | 5b4ac53 | 2019-02-01 18:43:55 -0800 | [diff] [blame] | 107 | string(REGEX REPLACE "${protobuf_VERSION_REGEX}" "\\5" |
Walter Gray | f1091ab | 2016-05-27 22:48:24 -0700 | [diff] [blame] | 108 | protobuf_VERSION_PRERELEASE "${protobuf_VERSION_STRING}") |
| 109 | |
Paul Yang | 5b4ac53 | 2019-02-01 18:43:55 -0800 | [diff] [blame] | 110 | message(STATUS "${protobuf_VERSION_PRERELEASE}") |
| 111 | |
Konstantin Podsvirov | 743ec44 | 2015-08-01 02:01:42 +0300 | [diff] [blame] | 112 | # Package version |
Konstantin Podsvirov | 8298343 | 2015-07-31 23:36:00 +0300 | [diff] [blame] | 113 | set(protobuf_VERSION |
Konstantin Podsvirov | 743ec44 | 2015-08-01 02:01:42 +0300 | [diff] [blame] | 114 | "${protobuf_VERSION_MAJOR}.${protobuf_VERSION_MINOR}.${protobuf_VERSION_PATCH}") |
Konstantin Podsvirov | 8298343 | 2015-07-31 23:36:00 +0300 | [diff] [blame] | 115 | |
Walter Gray | f1091ab | 2016-05-27 22:48:24 -0700 | [diff] [blame] | 116 | if(protobuf_VERSION_PRERELEASE) |
Paul Yang | 5b4ac53 | 2019-02-01 18:43:55 -0800 | [diff] [blame] | 117 | set(protobuf_VERSION "${protobuf_VERSION}.${protobuf_VERSION_PRERELEASE}") |
| 118 | else() |
| 119 | set(protobuf_VERSION "${protobuf_VERSION}.0") |
Walter Gray | f1091ab | 2016-05-27 22:48:24 -0700 | [diff] [blame] | 120 | endif() |
Paul Yang | 5b4ac53 | 2019-02-01 18:43:55 -0800 | [diff] [blame] | 121 | message(STATUS "${protobuf_VERSION}") |
Walter Gray | f1091ab | 2016-05-27 22:48:24 -0700 | [diff] [blame] | 122 | |
Konstantin Podsvirov | db01460 | 2015-08-31 15:20:18 +0300 | [diff] [blame] | 123 | if(protobuf_VERBOSE) |
| 124 | message(STATUS "Configuration script parsing status [") |
| 125 | message(STATUS " Description : ${protobuf_DESCRIPTION}") |
| 126 | message(STATUS " Version : ${protobuf_VERSION} (${protobuf_VERSION_STRING})") |
| 127 | message(STATUS " Contact : ${protobuf_CONTACT}") |
| 128 | message(STATUS "]") |
| 129 | endif() |
| 130 | |
Jisi Liu | 78d470c | 2015-06-12 15:49:21 -0700 | [diff] [blame] | 131 | add_definitions(-DGOOGLE_PROTOBUF_CMAKE_BUILD) |
| 132 | |
Florian Simon | 1add7a7 | 2021-02-25 15:11:40 -0500 | [diff] [blame] | 133 | if (protobuf_DISABLE_RTTI) |
| 134 | add_definitions(-DGOOGLE_PROTOBUF_NO_RTTI=1) |
| 135 | endif() |
| 136 | |
Arfrever | 1d13b60 | 2022-03-02 02:06:14 +0100 | [diff] [blame] | 137 | file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/cmaketest.map |
| 138 | "{ |
| 139 | global: |
| 140 | main; |
| 141 | local: |
| 142 | *; |
| 143 | };") |
| 144 | # CheckLinkerFlag module available in CMake >=3.18. |
Arfrever | 1cec803 | 2022-03-08 02:03:50 +0100 | [diff] [blame] | 145 | if(${CMAKE_VERSION} VERSION_GREATER 3.18 OR ${CMAKE_VERSION} VERSION_EQUAL 3.18) |
Arfrever | 1d13b60 | 2022-03-02 02:06:14 +0100 | [diff] [blame] | 146 | include(CheckLinkerFlag) |
| 147 | check_linker_flag(CXX -Wl,--version-script=${CMAKE_CURRENT_BINARY_DIR}/cmaketest.map protobuf_HAVE_LD_VERSION_SCRIPT) |
| 148 | else() |
| 149 | include(CheckCXXSourceCompiles) |
| 150 | set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) |
| 151 | set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} -Wl,--version-script=${CMAKE_CURRENT_BINARY_DIR}/cmaketest.map) |
| 152 | check_cxx_source_compiles(" |
| 153 | int main() { |
| 154 | return 0; |
| 155 | } |
| 156 | " protobuf_HAVE_LD_VERSION_SCRIPT) |
| 157 | set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) |
| 158 | endif() |
| 159 | file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/cmaketest.map) |
| 160 | |
Feng Xiao | 4333edb | 2015-05-31 02:28:34 -0700 | [diff] [blame] | 161 | find_package(Threads REQUIRED) |
Feng Xiao | 4333edb | 2015-05-31 02:28:34 -0700 | [diff] [blame] | 162 | |
Mike Kruskal | cac9765 | 2022-08-12 16:41:00 -0700 | [diff] [blame] | 163 | # We can install dependencies from submodules if we're running |
| 164 | # CMake v3.13 or newer. |
| 165 | if(CMAKE_VERSION VERSION_LESS 3.13) |
| 166 | set(_protobuf_INSTALL_SUPPORTED_FROM_MODULE OFF) |
| 167 | else() |
| 168 | set(_protobuf_INSTALL_SUPPORTED_FROM_MODULE ON) |
| 169 | endif() |
| 170 | |
Konstantin Podsvirov | eefd1fd | 2016-08-02 22:37:36 +0300 | [diff] [blame] | 171 | set(_protobuf_FIND_ZLIB) |
Konstantin Podsvirov | 620bd74 | 2015-09-15 15:31:25 +0300 | [diff] [blame] | 172 | if (protobuf_WITH_ZLIB) |
Feng Xiao | 4333edb | 2015-05-31 02:28:34 -0700 | [diff] [blame] | 173 | find_package(ZLIB) |
| 174 | if (ZLIB_FOUND) |
| 175 | set(HAVE_ZLIB 1) |
Konstantin Podsvirov | 20b882d | 2015-08-31 16:23:40 +0300 | [diff] [blame] | 176 | # FindZLIB module define ZLIB_INCLUDE_DIRS variable |
| 177 | # Set ZLIB_INCLUDE_DIRECTORIES for compatible |
| 178 | set(ZLIB_INCLUDE_DIRECTORIES ${ZLIB_INCLUDE_DIRECTORIES} ${ZLIB_INCLUDE_DIRS}) |
| 179 | # Using imported target if exists |
| 180 | if (TARGET ZLIB::ZLIB) |
| 181 | set(ZLIB_LIBRARIES ZLIB::ZLIB) |
Konstantin Podsvirov | eefd1fd | 2016-08-02 22:37:36 +0300 | [diff] [blame] | 182 | set(_protobuf_FIND_ZLIB "if(NOT ZLIB_FOUND)\n find_package(ZLIB)\nendif()") |
Konstantin Podsvirov | 20b882d | 2015-08-31 16:23:40 +0300 | [diff] [blame] | 183 | endif (TARGET ZLIB::ZLIB) |
Feng Xiao | 4333edb | 2015-05-31 02:28:34 -0700 | [diff] [blame] | 184 | else (ZLIB_FOUND) |
| 185 | set(HAVE_ZLIB 0) |
| 186 | # Explicitly set these to empty (override NOT_FOUND) so cmake doesn't |
| 187 | # complain when we use them later. |
| 188 | set(ZLIB_INCLUDE_DIRECTORIES) |
| 189 | set(ZLIB_LIBRARIES) |
| 190 | endif (ZLIB_FOUND) |
Konstantin Podsvirov | 620bd74 | 2015-09-15 15:31:25 +0300 | [diff] [blame] | 191 | endif (protobuf_WITH_ZLIB) |
Feng Xiao | 4333edb | 2015-05-31 02:28:34 -0700 | [diff] [blame] | 192 | |
Jisi Liu | 78d470c | 2015-06-12 15:49:21 -0700 | [diff] [blame] | 193 | if (HAVE_ZLIB) |
| 194 | add_definitions(-DHAVE_ZLIB) |
| 195 | endif (HAVE_ZLIB) |
| 196 | |
boscosiu | 55ed1d4 | 2019-07-03 06:34:09 -0700 | [diff] [blame] | 197 | # We need to link with libatomic on systems that do not have builtin atomics, or |
| 198 | # don't have builtin support for 8 byte atomics |
| 199 | set(protobuf_LINK_LIBATOMIC false) |
| 200 | if (NOT MSVC) |
| 201 | include(CheckCXXSourceCompiles) |
Ben Bader | 56e7bdf | 2019-07-08 11:13:53 -0700 | [diff] [blame] | 202 | set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) |
Adam Cozzette | 500cbd7 | 2022-08-11 18:22:15 -0700 | [diff] [blame] | 203 | set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} -std=c++14) |
boscosiu | 55ed1d4 | 2019-07-03 06:34:09 -0700 | [diff] [blame] | 204 | check_cxx_source_compiles(" |
| 205 | #include <atomic> |
| 206 | int main() { |
| 207 | return std::atomic<int64_t>{}; |
| 208 | } |
| 209 | " protobuf_HAVE_BUILTIN_ATOMICS) |
| 210 | if (NOT protobuf_HAVE_BUILTIN_ATOMICS) |
| 211 | set(protobuf_LINK_LIBATOMIC true) |
| 212 | endif (NOT protobuf_HAVE_BUILTIN_ATOMICS) |
Ben Bader | 56e7bdf | 2019-07-08 11:13:53 -0700 | [diff] [blame] | 213 | set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) |
boscosiu | 55ed1d4 | 2019-07-03 06:34:09 -0700 | [diff] [blame] | 214 | endif (NOT MSVC) |
| 215 | |
Konstantin Podsvirov | c3aa4c2 | 2015-10-15 02:56:48 +0300 | [diff] [blame] | 216 | if (protobuf_BUILD_SHARED_LIBS) |
| 217 | set(protobuf_SHARED_OR_STATIC "SHARED") |
| 218 | else (protobuf_BUILD_SHARED_LIBS) |
| 219 | set(protobuf_SHARED_OR_STATIC "STATIC") |
Saleem Abdulrasool | c47adad | 2021-07-31 16:07:04 -0700 | [diff] [blame] | 220 | # The CMAKE_<LANG>_FLAGS(_<BUILD_TYPE>)? is meant to be user controlled. |
| 221 | # Prior to CMake 3.15, the MSVC runtime library was pushed into the same flags |
| 222 | # making programmatic control difficult. Prefer the functionality in newer |
| 223 | # CMake versions when available. |
Arfrever | 1cec803 | 2022-03-08 02:03:50 +0100 | [diff] [blame] | 224 | if(${CMAKE_VERSION} VERSION_GREATER 3.15 OR ${CMAKE_VERSION} VERSION_EQUAL 3.15) |
David Geldreich | f180289 | 2022-01-24 22:17:14 +0100 | [diff] [blame] | 225 | if (protobuf_MSVC_STATIC_RUNTIME) |
| 226 | set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded$<$<CONFIG:Debug>:Debug>) |
| 227 | else() |
| 228 | set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded$<$<CONFIG:Debug>:Debug>DLL) |
| 229 | endif() |
Saleem Abdulrasool | c47adad | 2021-07-31 16:07:04 -0700 | [diff] [blame] | 230 | else() |
| 231 | # In case we are building static libraries, link also the runtime library statically |
| 232 | # so that MSVCR*.DLL is not required at runtime. |
| 233 | # https://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx |
| 234 | # This is achieved by replacing msvc option /MD with /MT and /MDd with /MTd |
| 235 | # http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_build_my_MSVC_application_with_a_static_runtime.3F |
| 236 | if (MSVC AND protobuf_MSVC_STATIC_RUNTIME) |
| 237 | foreach(flag_var |
| 238 | CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE |
| 239 | CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) |
| 240 | if(${flag_var} MATCHES "/MD") |
| 241 | string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") |
| 242 | endif(${flag_var} MATCHES "/MD") |
| 243 | endforeach(flag_var) |
| 244 | endif (MSVC AND protobuf_MSVC_STATIC_RUNTIME) |
| 245 | endif() |
Konstantin Podsvirov | c3aa4c2 | 2015-10-15 02:56:48 +0300 | [diff] [blame] | 246 | endif (protobuf_BUILD_SHARED_LIBS) |
Feng Xiao | 4333edb | 2015-05-31 02:28:34 -0700 | [diff] [blame] | 247 | |
Feng Xiao | dffd542 | 2015-06-05 17:59:09 -0700 | [diff] [blame] | 248 | if (MSVC) |
Jorge López Fueyo | 1ae531d | 2021-06-04 20:13:56 +0200 | [diff] [blame] | 249 | if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") |
| 250 | # Build with multiple processes |
Alexander Neumann | 30f273c | 2022-07-26 19:59:28 +0200 | [diff] [blame] | 251 | add_compile_options(/MP) |
Jorge López Fueyo | 1ae531d | 2021-06-04 20:13:56 +0200 | [diff] [blame] | 252 | endif() |
Shigeo Hashimoto | 25180ac | 2021-10-15 01:45:40 +0900 | [diff] [blame] | 253 | # Set source file and execution character sets to UTF-8 |
Alexander Neumann | 30f273c | 2022-07-26 19:59:28 +0200 | [diff] [blame] | 254 | add_compile_options(/utf-8) |
Tim Ebringer | a23669c | 2017-10-21 09:40:32 -0400 | [diff] [blame] | 255 | # MSVC warning suppressions |
Alexander Neumann | 30f273c | 2022-07-26 19:59:28 +0200 | [diff] [blame] | 256 | add_compile_options( |
Tim Ebringer | a23669c | 2017-10-21 09:40:32 -0400 | [diff] [blame] | 257 | /wd4065 # switch statement contains 'default' but no 'case' labels |
Tim Ebringer | a23669c | 2017-10-21 09:40:32 -0400 | [diff] [blame] | 258 | /wd4244 # 'conversion' conversion from 'type1' to 'type2', possible loss of data |
| 259 | /wd4251 # 'identifier' : class 'type' needs to have dll-interface to be used by clients of class 'type2' |
| 260 | /wd4267 # 'var' : conversion from 'size_t' to 'type', possible loss of data |
| 261 | /wd4305 # 'identifier' : truncation from 'type1' to 'type2' |
| 262 | /wd4307 # 'operator' : integral constant overflow |
| 263 | /wd4309 # 'conversion' : truncation of constant value |
| 264 | /wd4334 # 'operator' : result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?) |
| 265 | /wd4355 # 'this' : used in base member initializer list |
| 266 | /wd4506 # no definition for inline function 'function' |
| 267 | /wd4800 # 'type' : forcing value to bool 'true' or 'false' (performance warning) |
| 268 | /wd4996 # The compiler encountered a deprecated declaration. |
| 269 | ) |
Jisi Liu | 3b6df06 | 2016-04-01 15:02:45 -0700 | [diff] [blame] | 270 | # Allow big object |
Alexander Neumann | 30f273c | 2022-07-26 19:59:28 +0200 | [diff] [blame] | 271 | add_compile_options(/bigobj) |
Feng Xiao | dffd542 | 2015-06-05 17:59:09 -0700 | [diff] [blame] | 272 | string(REPLACE "/" "\\" PROTOBUF_SOURCE_WIN32_PATH ${protobuf_SOURCE_DIR}) |
| 273 | string(REPLACE "/" "\\" PROTOBUF_BINARY_WIN32_PATH ${protobuf_BINARY_DIR}) |
Jozef Izso | 3415201 | 2018-04-27 23:44:38 +0200 | [diff] [blame] | 274 | string(REPLACE "." "," protobuf_RC_FILEVERSION "${protobuf_VERSION}") |
Ivan Shynkarenka | f80a886 | 2018-05-02 02:51:08 +0300 | [diff] [blame] | 275 | |
Tim Ebringer | 2a72840 | 2017-10-06 14:26:43 -0400 | [diff] [blame] | 276 | # Suppress linker warnings about files with no symbols defined. |
Alexander Neumann | 30f273c | 2022-07-26 19:59:28 +0200 | [diff] [blame] | 277 | string(APPEND CMAKE_STATIC_LINKER_FLAGS " /ignore:4221") |
Jozef Izso | 3415201 | 2018-04-27 23:44:38 +0200 | [diff] [blame] | 278 | |
Alexander Neumann | 30f273c | 2022-07-26 19:59:28 +0200 | [diff] [blame] | 279 | # use English language (0x409) in resource compiler |
| 280 | string(APPEND CMAKE_RC_FLAGS " -l0x409") |
Jozef Izso | 3415201 | 2018-04-27 23:44:38 +0200 | [diff] [blame] | 281 | |
David L. Jones | c4ddd84 | 2022-04-28 15:17:51 -0700 | [diff] [blame] | 282 | # Generate the version.rc file used elsewhere. |
Arfrever Frehtes Taifersar Arahesis | 14cab5b | 2022-03-08 00:00:00 +0000 | [diff] [blame] | 283 | configure_file(${protobuf_SOURCE_DIR}/cmake/version.rc.in ${CMAKE_CURRENT_BINARY_DIR}/version.rc @ONLY) |
David L. Jones | c4ddd84 | 2022-04-28 15:17:51 -0700 | [diff] [blame] | 284 | set(protobuf_version_rc_file ${CMAKE_CURRENT_BINARY_DIR}/version.rc) |
| 285 | |
| 286 | # Add the "lib" prefix for generated .lib outputs. |
| 287 | set(LIB_PREFIX lib) |
| 288 | else (MSVC) |
| 289 | # No version.rc file. |
| 290 | set(protobuf_version_rc_file) |
| 291 | |
| 292 | # When building with "make", "lib" prefix will be added automatically by |
| 293 | # the build tool. |
| 294 | set(LIB_PREFIX) |
Feng Xiao | dffd542 | 2015-06-05 17:59:09 -0700 | [diff] [blame] | 295 | endif (MSVC) |
Feng Xiao | 4333edb | 2015-05-31 02:28:34 -0700 | [diff] [blame] | 296 | |
Feng Xiao | 4333edb | 2015-05-31 02:28:34 -0700 | [diff] [blame] | 297 | include_directories( |
| 298 | ${ZLIB_INCLUDE_DIRECTORIES} |
| 299 | ${protobuf_BINARY_DIR} |
Arfrever Frehtes Taifersar Arahesis | 4268662 | 2022-03-08 00:00:00 +0000 | [diff] [blame] | 300 | ${protobuf_SOURCE_DIR}/src) |
Feng Xiao | 4333edb | 2015-05-31 02:28:34 -0700 | [diff] [blame] | 301 | |
Wei-Yin Chen (陳威尹) | a7eaf36 | 2016-09-01 17:12:49 -0700 | [diff] [blame] | 302 | if (protobuf_UNICODE) |
Wei-Yin Chen (陳威尹) | 588a803 | 2016-08-19 15:25:54 -0700 | [diff] [blame] | 303 | add_definitions(-DUNICODE -D_UNICODE) |
Wei-Yin Chen (陳威尹) | a7eaf36 | 2016-09-01 17:12:49 -0700 | [diff] [blame] | 304 | endif (protobuf_UNICODE) |
Wei-Yin Chen (陳威尹) | 588a803 | 2016-08-19 15:25:54 -0700 | [diff] [blame] | 305 | |
Mike Kruskal | cac9765 | 2022-08-12 16:41:00 -0700 | [diff] [blame] | 306 | set(protobuf_ABSL_PROVIDER "module" CACHE STRING "Provider of absl library") |
| 307 | set_property(CACHE protobuf_ABSL_PROVIDER PROPERTY STRINGS "module" "package") |
| 308 | |
| 309 | include(${protobuf_SOURCE_DIR}/cmake/abseil-cpp.cmake) |
| 310 | |
Mike Kruskal | 3edec1f | 2022-07-25 20:36:47 -0700 | [diff] [blame] | 311 | if (protobuf_BUILD_PROTOBUF_BINARIES) |
| 312 | include(${protobuf_SOURCE_DIR}/cmake/libprotobuf-lite.cmake) |
| 313 | if (NOT DEFINED protobuf_LIB_PROTOBUF_LITE) |
| 314 | set(protobuf_LIB_PROTOBUF_LITE libprotobuf-lite) |
| 315 | endif () |
| 316 | include(${protobuf_SOURCE_DIR}/cmake/libprotobuf.cmake) |
| 317 | if (NOT DEFINED protobuf_LIB_PROTOBUF) |
| 318 | set(protobuf_LIB_PROTOBUF libprotobuf) |
| 319 | endif () |
| 320 | if (protobuf_BUILD_LIBPROTOC) |
| 321 | include(${protobuf_SOURCE_DIR}/cmake/libprotoc.cmake) |
| 322 | if (NOT DEFINED protobuf_LIB_PROTOC) |
| 323 | set(protobuf_LIB_PROTOC libprotoc) |
| 324 | endif () |
| 325 | endif () |
| 326 | if (protobuf_BUILD_PROTOC_BINARIES) |
| 327 | include(${protobuf_SOURCE_DIR}/cmake/protoc.cmake) |
| 328 | if (NOT DEFINED protobuf_PROTOC_EXE) |
| 329 | set(protobuf_PROTOC_EXE protoc) |
| 330 | endif () |
| 331 | endif () |
| 332 | else () |
Mike Kruskal | 69c1fa5 | 2022-08-09 08:20:51 -0700 | [diff] [blame] | 333 | find_package(Protobuf NO_MODULE) |
| 334 | if (Protobuf_FOUND) |
Mike Kruskal | 3edec1f | 2022-07-25 20:36:47 -0700 | [diff] [blame] | 335 | set(protobuf_PROTOC_EXE protobuf::protoc) |
| 336 | set(protobuf_LIB_PROTOC protobuf::libprotoc) |
| 337 | set(protobuf_LIB_PROTOBUF protobuf::libprotobuf) |
| 338 | set(protobuf_LIB_PROTOBUF_LITE protobuf::libprotobuf-lite) |
| 339 | message(STATUS "CMake installation of Protobuf found.") |
| 340 | endif () |
| 341 | endif () |
Konstantin Podsvirov | 8298343 | 2015-07-31 23:36:00 +0300 | [diff] [blame] | 342 | |
Mike Kruskal | 3edec1f | 2022-07-25 20:36:47 -0700 | [diff] [blame] | 343 | # Ensure we have a protoc executable and protobuf libraries if we need one |
Michael WERLE | 976f85b | 2020-05-01 16:50:53 +0900 | [diff] [blame] | 344 | if (protobuf_BUILD_TESTS OR protobuf_BUILD_CONFORMANCE OR protobuf_BUILD_EXAMPLES) |
| 345 | if (NOT DEFINED protobuf_PROTOC_EXE) |
Mike Kruskal | 3edec1f | 2022-07-25 20:36:47 -0700 | [diff] [blame] | 346 | find_program(protobuf_PROTOC_EXE protoc REQUIRED) |
| 347 | message(STATUS "Found system ${protobuf_PROTOC_EXE}.") |
Michael WERLE | 976f85b | 2020-05-01 16:50:53 +0900 | [diff] [blame] | 348 | endif () |
| 349 | if(protobuf_VERBOSE) |
| 350 | message(STATUS "Using protoc : ${protobuf_PROTOC_EXE}") |
Mike Kruskal | 3edec1f | 2022-07-25 20:36:47 -0700 | [diff] [blame] | 351 | message(STATUS "Using libprotobuf : ${protobuf_LIB_PROTOBUF}") |
| 352 | message(STATUS "Using libprotobuf-lite : ${protobuf_LIB_PROTOBUF_LITE}") |
| 353 | message(STATUS "Using libprotoc : ${protobuf_LIB_PROTOC}") |
Michael WERLE | 976f85b | 2020-05-01 16:50:53 +0900 | [diff] [blame] | 354 | endif(protobuf_VERBOSE) |
| 355 | endif () |
| 356 | |
Konstantin Podsvirov | 673d32e | 2015-09-15 15:30:02 +0300 | [diff] [blame] | 357 | if (protobuf_BUILD_TESTS) |
Florin Crișan | 18c951e | 2022-02-08 03:38:38 +0200 | [diff] [blame] | 358 | enable_testing() |
Arfrever Frehtes Taifersar Arahesis | 14cab5b | 2022-03-08 00:00:00 +0000 | [diff] [blame] | 359 | include(${protobuf_SOURCE_DIR}/cmake/tests.cmake) |
Konstantin Podsvirov | 673d32e | 2015-09-15 15:30:02 +0300 | [diff] [blame] | 360 | endif (protobuf_BUILD_TESTS) |
Konstantin Podsvirov | 8298343 | 2015-07-31 23:36:00 +0300 | [diff] [blame] | 361 | |
Josh Haberman | 4249692 | 2018-08-24 12:27:21 -0700 | [diff] [blame] | 362 | if (protobuf_BUILD_CONFORMANCE) |
Arfrever Frehtes Taifersar Arahesis | 14cab5b | 2022-03-08 00:00:00 +0000 | [diff] [blame] | 363 | include(${protobuf_SOURCE_DIR}/cmake/conformance.cmake) |
Josh Haberman | 4249692 | 2018-08-24 12:27:21 -0700 | [diff] [blame] | 364 | endif (protobuf_BUILD_CONFORMANCE) |
| 365 | |
JCooky | 55645ca | 2022-02-03 01:29:25 +0900 | [diff] [blame] | 366 | if (protobuf_INSTALL) |
Arfrever Frehtes Taifersar Arahesis | 14cab5b | 2022-03-08 00:00:00 +0000 | [diff] [blame] | 367 | include(${protobuf_SOURCE_DIR}/cmake/install.cmake) |
JCooky | 55645ca | 2022-02-03 01:29:25 +0900 | [diff] [blame] | 368 | endif (protobuf_INSTALL) |
Konstantin Podsvirov | 7155629 | 2016-06-01 17:00:08 +0300 | [diff] [blame] | 369 | |
| 370 | if (protobuf_BUILD_EXAMPLES) |
Arfrever Frehtes Taifersar Arahesis | 14cab5b | 2022-03-08 00:00:00 +0000 | [diff] [blame] | 371 | include(${protobuf_SOURCE_DIR}/cmake/examples.cmake) |
Konstantin Podsvirov | 7155629 | 2016-06-01 17:00:08 +0300 | [diff] [blame] | 372 | endif (protobuf_BUILD_EXAMPLES) |
| 373 | |
| 374 | if(protobuf_VERBOSE) |
Michael WERLE | 976f85b | 2020-05-01 16:50:53 +0900 | [diff] [blame] | 375 | message(STATUS "Protocol Buffers Configuring done") |
| 376 | endif(protobuf_VERBOSE) |