CMakeLists.txt 8.12 KB
Newer Older
1
# Minimum CMake required
2
cmake_minimum_required(VERSION 3.1.3)
Feng Xiao's avatar
Feng Xiao committed
3

4 5 6
if(protobuf_VERBOSE)
  message(STATUS "Protocol Buffers Configuring...")
endif()
Feng Xiao's avatar
Feng Xiao committed
7

8 9
# CMake policies
cmake_policy(SET CMP0022 NEW)
10 11 12 13 14
# On MacOS use @rpath/ for target's install name prefix path
if (POLICY CMP0042)
  cmake_policy(SET CMP0042 NEW)
endif ()
# Clear VERSION variables when no VERSION is given to project()
15 16 17 18
if(POLICY CMP0048)
  cmake_policy(SET CMP0048 NEW)
endif()

19 20 21
# Project
project(protobuf C CXX)

22
# Add c++11 flags
Ivan Shynkarenka's avatar
Ivan Shynkarenka committed
23 24 25 26 27 28 29
if (CYGWIN)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
else()
  set(CMAKE_CXX_STANDARD 11)
  set(CMAKE_CXX_STANDARD_REQUIRED ON)
  set(CMAKE_CXX_EXTENSIONS OFF)
endif()
30

31
# Options
32
option(protobuf_BUILD_TESTS "Build tests" ON)
33
option(protobuf_BUILD_EXAMPLES "Build examples" OFF)
34
option(protobuf_BUILD_PROTOC_BINARIES "Build libprotoc and protoc compiler" ON)
35 36 37 38 39 40
if (BUILD_SHARED_LIBS)
  set(protobuf_BUILD_SHARED_LIBS_DEFAULT ON)
else (BUILD_SHARED_LIBS)
  set(protobuf_BUILD_SHARED_LIBS_DEFAULT OFF)
endif (BUILD_SHARED_LIBS)
option(protobuf_BUILD_SHARED_LIBS "Build Shared Libraries" ${protobuf_BUILD_SHARED_LIBS_DEFAULT})
41 42 43
include(CMakeDependentOption)
cmake_dependent_option(protobuf_MSVC_STATIC_RUNTIME "Link static runtime libraries" ON
  "NOT protobuf_BUILD_SHARED_LIBS" OFF)
44
set(protobuf_WITH_ZLIB_DEFAULT ON)
45
option(protobuf_WITH_ZLIB "Build with zlib support" ${protobuf_WITH_ZLIB_DEFAULT})
46 47
set(protobuf_DEBUG_POSTFIX "d"
  CACHE STRING "Default debug postfix")
48 49
mark_as_advanced(protobuf_DEBUG_POSTFIX)
# User options
50
include(protobuf-options.cmake)
Feng Xiao's avatar
Feng Xiao committed
51

52 53
# Path to main configure script
set(protobuf_CONFIGURE_SCRIPT "../configure.ac")
54

55 56 57 58 59 60 61 62 63 64 65 66 67 68
# Parse configure script
set(protobuf_AC_INIT_REGEX
  "^AC_INIT\\(\\[([^]]+)\\],\\[([^]]+)\\],\\[([^]]+)\\],\\[([^]]+)\\]\\)$")
file(STRINGS "${protobuf_CONFIGURE_SCRIPT}" protobuf_AC_INIT_LINE
  LIMIT_COUNT 1 REGEX "^AC_INIT")
# Description
string(REGEX REPLACE        "${protobuf_AC_INIT_REGEX}" "\\1"
    protobuf_DESCRIPTION    "${protobuf_AC_INIT_LINE}")
# Version
string(REGEX REPLACE        "${protobuf_AC_INIT_REGEX}" "\\2"
    protobuf_VERSION_STRING "${protobuf_AC_INIT_LINE}")
# Contact
string(REGEX REPLACE        "${protobuf_AC_INIT_REGEX}" "\\3"
    protobuf_CONTACT        "${protobuf_AC_INIT_LINE}")
69
# Parse version tweaks
70
set(protobuf_VERSION_REGEX "^([0-9]+)\\.([0-9]+)\\.([0-9]+)-?(.*)$")
71
string(REGEX REPLACE     "${protobuf_VERSION_REGEX}" "\\1"
72
  protobuf_VERSION_MAJOR "${protobuf_VERSION_STRING}")
73
string(REGEX REPLACE     "${protobuf_VERSION_REGEX}" "\\2"
74
  protobuf_VERSION_MINOR "${protobuf_VERSION_STRING}")
75
string(REGEX REPLACE     "${protobuf_VERSION_REGEX}" "\\3"
76
  protobuf_VERSION_PATCH "${protobuf_VERSION_STRING}")
77 78 79
string(REGEX REPLACE     "${protobuf_VERSION_REGEX}" "\\4"
  protobuf_VERSION_PRERELEASE "${protobuf_VERSION_STRING}")

80
# Package version
81
set(protobuf_VERSION
82
  "${protobuf_VERSION_MAJOR}.${protobuf_VERSION_MINOR}.${protobuf_VERSION_PATCH}")
83

84 85 86 87
if(protobuf_VERSION_PRERELEASE)
  set(protobuf_VERSION "${protobuf_VERSION}-${protobuf_VERSION_PRERELEASE}")
endif()

88 89 90 91 92 93 94 95
if(protobuf_VERBOSE)
  message(STATUS "Configuration script parsing status [")
  message(STATUS "  Description : ${protobuf_DESCRIPTION}")
  message(STATUS "  Version     : ${protobuf_VERSION} (${protobuf_VERSION_STRING})")
  message(STATUS "  Contact     : ${protobuf_CONTACT}")
  message(STATUS "]")
endif()

96 97
add_definitions(-DGOOGLE_PROTOBUF_CMAKE_BUILD)

Feng Xiao's avatar
Feng Xiao committed
98 99
find_package(Threads REQUIRED)
if (CMAKE_USE_PTHREADS_INIT)
100
  add_definitions(-DHAVE_PTHREAD)
Feng Xiao's avatar
Feng Xiao committed
101 102
endif (CMAKE_USE_PTHREADS_INIT)

103
set(_protobuf_FIND_ZLIB)
104
if (protobuf_WITH_ZLIB)
Feng Xiao's avatar
Feng Xiao committed
105 106 107
  find_package(ZLIB)
  if (ZLIB_FOUND)
    set(HAVE_ZLIB 1)
108 109 110 111 112 113
    # FindZLIB module define ZLIB_INCLUDE_DIRS variable
    # Set ZLIB_INCLUDE_DIRECTORIES for compatible
    set(ZLIB_INCLUDE_DIRECTORIES ${ZLIB_INCLUDE_DIRECTORIES} ${ZLIB_INCLUDE_DIRS})
    # Using imported target if exists
    if (TARGET ZLIB::ZLIB)
      set(ZLIB_LIBRARIES ZLIB::ZLIB)
114
      set(_protobuf_FIND_ZLIB "if(NOT ZLIB_FOUND)\n  find_package(ZLIB)\nendif()")
115
    endif (TARGET ZLIB::ZLIB)
Feng Xiao's avatar
Feng Xiao committed
116 117 118 119 120 121 122
  else (ZLIB_FOUND)
    set(HAVE_ZLIB 0)
    # Explicitly set these to empty (override NOT_FOUND) so cmake doesn't
    # complain when we use them later.
    set(ZLIB_INCLUDE_DIRECTORIES)
    set(ZLIB_LIBRARIES)
  endif (ZLIB_FOUND)
123
endif (protobuf_WITH_ZLIB)
Feng Xiao's avatar
Feng Xiao committed
124

125 126 127 128
if (HAVE_ZLIB)
  add_definitions(-DHAVE_ZLIB)
endif (HAVE_ZLIB)

129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
if (protobuf_BUILD_SHARED_LIBS)
  set(protobuf_SHARED_OR_STATIC "SHARED")
else (protobuf_BUILD_SHARED_LIBS)
  set(protobuf_SHARED_OR_STATIC "STATIC")
  # In case we are building static libraries, link also the runtime library statically
  # so that MSVCR*.DLL is not required at runtime.
  # https://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx
  # This is achieved by replacing msvc option /MD with /MT and /MDd with /MTd
  # http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_build_my_MSVC_application_with_a_static_runtime.3F
  if (MSVC AND protobuf_MSVC_STATIC_RUNTIME)
    foreach(flag_var
        CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
        CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
      if(${flag_var} MATCHES "/MD")
        string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
      endif(${flag_var} MATCHES "/MD")
    endforeach(flag_var)
  endif (MSVC AND protobuf_MSVC_STATIC_RUNTIME)
endif (protobuf_BUILD_SHARED_LIBS)
Feng Xiao's avatar
Feng Xiao committed
148

149
if (MSVC)
150 151
  # Build with multiple processes
  add_definitions(/MP)
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
  # MSVC warning suppressions
  add_definitions(
    /wd4018 # 'expression' : signed/unsigned mismatch
    /wd4065 # switch statement contains 'default' but no 'case' labels
    /wd4146 # unary minus operator applied to unsigned type, result still unsigned
    /wd4244 # 'conversion' conversion from 'type1' to 'type2', possible loss of data
    /wd4251 # 'identifier' : class 'type' needs to have dll-interface to be used by clients of class 'type2'
    /wd4267 # 'var' : conversion from 'size_t' to 'type', possible loss of data
    /wd4305 # 'identifier' : truncation from 'type1' to 'type2'
    /wd4307 # 'operator' : integral constant overflow
    /wd4309 # 'conversion' : truncation of constant value
    /wd4334 # 'operator' : result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?)
    /wd4355 # 'this' : used in base member initializer list
    /wd4506 # no definition for inline function 'function'
    /wd4800 # 'type' : forcing value to bool 'true' or 'false' (performance warning)
    /wd4996 # The compiler encountered a deprecated declaration.
  )
169 170
  # Allow big object
  add_definitions(/bigobj)
171 172
  string(REPLACE "/" "\\" PROTOBUF_SOURCE_WIN32_PATH ${protobuf_SOURCE_DIR})
  string(REPLACE "/" "\\" PROTOBUF_BINARY_WIN32_PATH ${protobuf_BINARY_DIR})
173
  string(REPLACE "." ","  protobuf_RC_FILEVERSION "${protobuf_VERSION}")
174
  configure_file(extract_includes.bat.in extract_includes.bat)
Ivan Shynkarenka's avatar
Ivan Shynkarenka committed
175

176 177
  # Suppress linker warnings about files with no symbols defined.
  set(CMAKE_STATIC_LINKER_FLAGS /ignore:4221)
178 179 180 181 182 183 184 185 186

  # Configure Resource Compiler
  enable_language(RC)
  # use English language (0x409) in resource compiler
  set(rc_flags "/l0x409")
  # fix rc.exe invocations because of usage of add_definitions()
  set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> ${rc_flags} <DEFINES> /fo<OBJECT> <SOURCE>")

  configure_file(version.rc.in ${CMAKE_CURRENT_BINARY_DIR}/version.rc @ONLY)
187
endif (MSVC)
Feng Xiao's avatar
Feng Xiao committed
188

189

Feng Xiao's avatar
Feng Xiao committed
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
get_filename_component(protobuf_source_dir ${protobuf_SOURCE_DIR} PATH)

include_directories(
  ${ZLIB_INCLUDE_DIRECTORIES}
  ${protobuf_BINARY_DIR}
  ${protobuf_source_dir}/src)

if (MSVC)
  # Add the "lib" prefix for generated .lib outputs.
  set(LIB_PREFIX lib)
else (MSVC)
  # When building with "make", "lib" prefix will be added automatically by
  # the build tool.
  set(LIB_PREFIX)
endif (MSVC)

206
if (protobuf_UNICODE)
207
  add_definitions(-DUNICODE -D_UNICODE)
208
endif (protobuf_UNICODE)
209

Feng Xiao's avatar
Feng Xiao committed
210 211
include(libprotobuf-lite.cmake)
include(libprotobuf.cmake)
212 213 214 215
if (protobuf_BUILD_PROTOC_BINARIES)
  include(libprotoc.cmake)
  include(protoc.cmake)
endif (protobuf_BUILD_PROTOC_BINARIES)
216

217
if (protobuf_BUILD_TESTS)
218
  include(tests.cmake)
219
endif (protobuf_BUILD_TESTS)
220 221

include(install.cmake)
222 223 224 225 226 227 228 229

if (protobuf_BUILD_EXAMPLES)
  include(examples.cmake)
endif (protobuf_BUILD_EXAMPLES)

if(protobuf_VERBOSE)
    message(STATUS "Protocol Buffers Configuring done")
endif()