FindProtobuf.cmake 21.3 KB
Newer Older
1 2 3
# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.

4 5 6 7
#.rst:
# FindProtobuf
# ------------
#
8
# Locate and configure the Google Protocol Buffers library.
9 10 11
#
# The following variables can be set and are optional:
#
12
# ``Protobuf_SRC_ROOT_FOLDER``
13 14
#   When compiling with MSVC, if this cache variable is set
#   the protobuf-default VS project build locations
15 16 17
#   (vsprojects/Debug and vsprojects/Release
#   or vsprojects/x64/Debug and vsprojects/x64/Release)
#   will be searched for libraries and binaries.
18
# ``Protobuf_IMPORT_DIRS``
19 20
#   List of additional directories to be searched for
#   imported .proto files.
21
# ``Protobuf_DEBUG``
22
#   Show debug messages.
23 24 25
# ``Protobuf_USE_STATIC_LIBS``
#   Set to ON to force the use of the static libraries.
#   Default is OFF.
26
#
27 28
# Defines the following variables:
#
29
# ``Protobuf_FOUND``
30 31
#   Found the Google Protocol Buffers library
#   (libprotobuf & header files)
32
# ``Protobuf_VERSION``
33
#   Version of package found.
34
# ``Protobuf_INCLUDE_DIRS``
35
#   Include directories for Google Protocol Buffers
36
# ``Protobuf_LIBRARIES``
37
#   The protobuf libraries
38
# ``Protobuf_PROTOC_LIBRARIES``
39
#   The protoc libraries
40
# ``Protobuf_LITE_LIBRARIES``
41
#   The protobuf-lite libraries
42
#
43 44
# The following :prop_tgt:`IMPORTED` targets are also defined:
#
45
# ``protobuf::libprotobuf``
46
#   The protobuf library.
47
# ``protobuf::libprotobuf-lite``
48
#   The protobuf lite library.
49
# ``protobuf::libprotoc``
50
#   The protoc library.
51 52
# ``protobuf::protoc``
#   The protoc compiler.
53
#
54
# The following cache variables are also available to set or use:
55
#
56
# ``Protobuf_LIBRARY``
57
#   The protobuf library
58
# ``Protobuf_PROTOC_LIBRARY``
59
#   The protoc library
60
# ``Protobuf_INCLUDE_DIR``
61
#   The include directory for protocol buffers
62
# ``Protobuf_PROTOC_EXECUTABLE``
63
#   The protoc compiler
64
# ``Protobuf_LIBRARY_DEBUG``
65
#   The protobuf library (debug)
66
# ``Protobuf_PROTOC_LIBRARY_DEBUG``
67
#   The protoc library (debug)
68
# ``Protobuf_LITE_LIBRARY``
69
#   The protobuf lite library
70
# ``Protobuf_LITE_LIBRARY_DEBUG``
71 72 73 74 75 76 77
#   The protobuf lite library (debug)
#
# Example:
#
# .. code-block:: cmake
#
#   find_package(Protobuf REQUIRED)
78
#   include_directories(${Protobuf_INCLUDE_DIRS})
79 80
#   include_directories(${CMAKE_CURRENT_BINARY_DIR})
#   protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS foo.proto)
81
#   protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS EXPORT_MACRO DLL_EXPORT foo.proto)
82
#   protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS DESCRIPTORS PROTO_DESCS foo.proto)
83
#   protobuf_generate_python(PROTO_PY foo.proto)
84
#   add_executable(bar bar.cc ${PROTO_SRCS} ${PROTO_HDRS})
85
#   target_link_libraries(bar ${Protobuf_LIBRARIES})
86 87
#
# .. note::
88 89 90
#   The ``protobuf_generate_cpp`` and ``protobuf_generate_python``
#   functions and :command:`add_executable` or :command:`add_library`
#   calls only work properly within the same directory.
91 92 93
#
# .. command:: protobuf_generate_cpp
#
94
#   Add custom commands to process ``.proto`` files to C++::
95
#
96 97
#     protobuf_generate_cpp (<SRCS> <HDRS>
#         [DESCRIPTORS <DESC>] [EXPORT_MACRO <MACRO>] [<ARGN>...])
98 99 100 101 102
#
#   ``SRCS``
#     Variable to define with autogenerated source files
#   ``HDRS``
#     Variable to define with autogenerated header files
103
#   ``DESCRIPTORS``
104
#     Variable to define with autogenerated descriptor files, if requested.
105 106 107
#   ``EXPORT_MACRO``
#     is a macro which should expand to ``__declspec(dllexport)`` or
#     ``__declspec(dllimport)`` depending on what is being compiled.
108 109
#   ``ARGN``
#     ``.proto`` files
110 111 112 113 114 115 116 117 118 119 120
#
# .. command:: protobuf_generate_python
#
#   Add custom commands to process ``.proto`` files to Python::
#
#     protobuf_generate_python (<PY> [<ARGN>...])
#
#   ``PY``
#     Variable to define with autogenerated Python files
#   ``ARGN``
#     ``.proto`` filess
121

122 123
function(protobuf_generate)
  include(CMakeParseArguments)
124

125
  set(_options APPEND_PATH DESCRIPTORS)
126 127 128 129 130 131 132 133 134 135
  set(_singleargs LANGUAGE OUT_VAR EXPORT_MACRO PROTOC_OUT_DIR)
  if(COMMAND target_sources)
    list(APPEND _singleargs TARGET)
  endif()
  set(_multiargs PROTOS IMPORT_DIRS GENERATE_EXTENSIONS)

  cmake_parse_arguments(protobuf_generate "${_options}" "${_singleargs}" "${_multiargs}" "${ARGN}")

  if(NOT protobuf_generate_PROTOS AND NOT protobuf_generate_TARGET)
    message(SEND_ERROR "Error: protobuf_generate called without any targets or source files")
136
    return()
137
  endif()
138

139 140 141
  if(NOT protobuf_generate_OUT_VAR AND NOT protobuf_generate_TARGET)
    message(SEND_ERROR "Error: protobuf_generate called without a target or output variable")
    return()
142 143
  endif()

144 145
  if(NOT protobuf_generate_LANGUAGE)
    set(protobuf_generate_LANGUAGE cpp)
146
  endif()
147
  string(TOLOWER ${protobuf_generate_LANGUAGE} protobuf_generate_LANGUAGE)
148

149 150
  if(NOT protobuf_generate_PROTOC_OUT_DIR)
    set(protobuf_generate_PROTOC_OUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
151 152
  endif()

153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
  if(protobuf_generate_EXPORT_MACRO AND protobuf_generate_LANGUAGE STREQUAL cpp)
    set(_dll_export_decl "dllexport_decl=${protobuf_generate_EXPORT_MACRO}:")
  endif()

  if(NOT protobuf_generate_GENERATE_EXTENSIONS)
    if(protobuf_generate_LANGUAGE STREQUAL cpp)
      set(protobuf_generate_GENERATE_EXTENSIONS .pb.h .pb.cc)
    elseif(protobuf_generate_LANGUAGE STREQUAL python)
      set(protobuf_generate_GENERATE_EXTENSIONS _pb2.py)
    else()
      message(SEND_ERROR "Error: protobuf_generate given unknown Language ${LANGUAGE}, please provide a value for GENERATE_EXTENSIONS")
      return()
    endif()
  endif()

  if(protobuf_generate_TARGET)
    get_target_property(_source_list ${protobuf_generate_TARGET} SOURCES)
    foreach(_file ${_source_list})
      if(_file MATCHES "proto$")
        list(APPEND protobuf_generate_PROTOS ${_file})
173 174 175 176
      endif()
    endforeach()
  endif()

177 178 179
  if(NOT protobuf_generate_PROTOS)
    message(SEND_ERROR "Error: protobuf_generate could not find any .proto files")
    return()
180 181
  endif()

182 183 184 185 186 187 188 189
  if(protobuf_generate_APPEND_PATH)
    # Create an include path for each file specified
    foreach(_file ${protobuf_generate_PROTOS})
      get_filename_component(_abs_file ${_file} ABSOLUTE)
      get_filename_component(_abs_path ${_abs_file} PATH)
      list(FIND _protobuf_include_path ${_abs_path} _contains_already)
      if(${_contains_already} EQUAL -1)
          list(APPEND _protobuf_include_path -I ${_abs_path})
190
      endif()
191 192 193 194 195 196 197 198 199 200
    endforeach()
  else()
    set(_protobuf_include_path -I ${CMAKE_CURRENT_SOURCE_DIR})
  endif()

  foreach(DIR ${protobuf_generate_IMPORT_DIRS})
    get_filename_component(ABS_PATH ${DIR} ABSOLUTE)
    list(FIND _protobuf_include_path ${ABS_PATH} _contains_already)
    if(${_contains_already} EQUAL -1)
        list(APPEND _protobuf_include_path -I ${ABS_PATH})
201
    endif()
202
  endforeach()
203

204 205 206 207 208 209
  set(_generated_srcs_all)
  foreach(_proto ${protobuf_generate_PROTOS})
    get_filename_component(_abs_file ${_proto} ABSOLUTE)
    get_filename_component(_abs_dir ${_abs_file} DIRECTORY)
    get_filename_component(_basename ${_proto} NAME_WE)
    file(RELATIVE_PATH _rel_dir ${CMAKE_CURRENT_SOURCE_DIR} ${_abs_dir})
210

211 212 213 214
    set(_generated_srcs)
    foreach(_ext ${protobuf_generate_GENERATE_EXTENSIONS})
      list(APPEND _generated_srcs "${protobuf_generate_PROTOC_OUT_DIR}/${_rel_dir}/${_basename}${_ext}")
    endforeach()
215 216 217 218 219 220

    if(protobuf_generate_DESCRIPTORS AND protobuf_generate_LANGUAGE STREQUAL cpp)
      set(_descriptor_file "${CMAKE_CURRENT_BINARY_DIR}/${_basename}.desc")
      set(_dll_desc_out "--descriptor_set_out=${_descriptor_file}")
      list(APPEND _generated_srcs ${_descriptor_file})
    endif()
221
    list(APPEND _generated_srcs_all ${_generated_srcs})
222

223
    add_custom_command(
224
      OUTPUT ${_generated_srcs}
225
      COMMAND  protobuf::protoc
226
      ARGS --${protobuf_generate_LANGUAGE}_out ${_dll_export_decl}${protobuf_generate_PROTOC_OUT_DIR}/${_rel_dir} ${_dll_desc_out} ${_protobuf_include_path} ${_abs_file}
227 228
      DEPENDS ${_abs_file} protobuf::protoc
      COMMENT "Running ${protobuf_generate_LANGUAGE} protocol buffer compiler on ${_proto}"
229 230 231
      VERBATIM )
  endforeach()

232 233 234 235 236 237
  set_source_files_properties(${_generated_srcs_all} PROPERTIES GENERATED TRUE)
  if(protobuf_generate_OUT_VAR)
    set(${protobuf_generate_OUT_VAR} ${_generated_srcs_all} PARENT_SCOPE)
  endif()
  if(protobuf_generate_TARGET)
    target_sources(${protobuf_generate_TARGET} PRIVATE ${_generated_srcs_all})
238
  endif()
239 240
endfunction()

241
function(PROTOBUF_GENERATE_CPP SRCS HDRS)
242
  cmake_parse_arguments(protobuf_generate_cpp "" "EXPORT_MACRO;DESCRIPTORS" "" ${ARGN})
243 244 245 246

  set(_proto_files "${protobuf_generate_cpp_UNPARSED_ARGUMENTS}")
  if(NOT _proto_files)
    message(SEND_ERROR "Error: PROTOBUF_GENERATE_CPP() called without any proto files")
247 248 249 250
    return()
  endif()

  if(PROTOBUF_GENERATE_CPP_APPEND_PATH)
251
    set(_append_arg APPEND_PATH)
252 253
  endif()

254 255 256 257
  if(protobuf_generate_cpp_DESCRIPTORS)
    set(_descriptors DESCRIPTORS)
  endif()

258 259 260 261
  if(DEFINED PROTOBUF_IMPORT_DIRS AND NOT DEFINED Protobuf_IMPORT_DIRS)
    set(Protobuf_IMPORT_DIRS "${PROTOBUF_IMPORT_DIRS}")
  endif()

262
  if(DEFINED Protobuf_IMPORT_DIRS)
263
    set(_import_arg IMPORT_DIRS ${Protobuf_IMPORT_DIRS})
264 265
  endif()

266
  set(_outvar)
267
  protobuf_generate(${_append_arg} ${_descriptors} LANGUAGE cpp EXPORT_MACRO ${protobuf_generate_cpp_EXPORT_MACRO} OUT_VAR _outvar ${_import_arg} PROTOS ${_proto_files})
268

269
  set(${SRCS})
270
  set(${HDRS})
271 272 273 274
  if(protobuf_generate_cpp_DESCRIPTORS)
    set(${protobuf_generate_cpp_DESCRIPTORS})
  endif()

275 276 277
  foreach(_file ${_outvar})
    if(_file MATCHES "cc$")
      list(APPEND ${SRCS} ${_file})
278 279
    elseif(_file MATCHES "desc$")
      list(APPEND ${protobuf_generate_cpp_DESCRIPTORS} ${_file})
280 281
    else()
      list(APPEND ${HDRS} ${_file})
282
    endif()
283 284
  endforeach()
  set(${SRCS} ${${SRCS}} PARENT_SCOPE)
285
  set(${HDRS} ${${HDRS}} PARENT_SCOPE)
286 287 288
  if(protobuf_generate_cpp_DESCRIPTORS)
    set(${protobuf_generate_cpp_DESCRIPTORS} "${${protobuf_generate_cpp_DESCRIPTORS}}" PARENT_SCOPE)
  endif()
289 290 291 292 293 294 295 296 297 298 299 300
endfunction()

function(PROTOBUF_GENERATE_PYTHON SRCS)
  if(NOT ARGN)
    message(SEND_ERROR "Error: PROTOBUF_GENERATE_PYTHON() called without any proto files")
    return()
  endif()

  if(PROTOBUF_GENERATE_CPP_APPEND_PATH)
    set(_append_arg APPEND_PATH)
  endif()

301 302 303 304
  if(DEFINED PROTOBUF_IMPORT_DIRS AND NOT DEFINED Protobuf_IMPORT_DIRS)
    set(Protobuf_IMPORT_DIRS "${PROTOBUF_IMPORT_DIRS}")
  endif()

305 306 307 308 309 310 311
  if(DEFINED Protobuf_IMPORT_DIRS)
    set(_import_arg IMPORT_DIRS ${Protobuf_IMPORT_DIRS})
  endif()

  set(_outvar)
  protobuf_generate(${_append_arg} LANGUAGE python OUT_VAR _outvar ${_import_arg} PROTOS ${ARGN})
  set(${SRCS} ${_outvar} PARENT_SCOPE)
312 313
endfunction()

314 315 316 317 318 319 320 321

if(Protobuf_DEBUG)
  # Output some of their choices
  message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
                 "Protobuf_USE_STATIC_LIBS = ${Protobuf_USE_STATIC_LIBS}")
endif()


322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344
# Backwards compatibility
# Define camel case versions of input variables
foreach(UPPER
    PROTOBUF_SRC_ROOT_FOLDER
    PROTOBUF_IMPORT_DIRS
    PROTOBUF_DEBUG
    PROTOBUF_LIBRARY
    PROTOBUF_PROTOC_LIBRARY
    PROTOBUF_INCLUDE_DIR
    PROTOBUF_PROTOC_EXECUTABLE
    PROTOBUF_LIBRARY_DEBUG
    PROTOBUF_PROTOC_LIBRARY_DEBUG
    PROTOBUF_LITE_LIBRARY
    PROTOBUF_LITE_LIBRARY_DEBUG
    )
    if (DEFINED ${UPPER})
        string(REPLACE "PROTOBUF_" "Protobuf_" Camel ${UPPER})
        if (NOT DEFINED ${Camel})
            set(${Camel} ${${UPPER}})
        endif()
    endif()
endforeach()

345 346 347 348
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
  set(_PROTOBUF_ARCH_DIR x64/)
endif()

349 350 351 352 353 354 355 356 357 358 359

# Support preference of static libs by adjusting CMAKE_FIND_LIBRARY_SUFFIXES
if( Protobuf_USE_STATIC_LIBS )
  set( _protobuf_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
  if(WIN32)
    set(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
  else()
    set(CMAKE_FIND_LIBRARY_SUFFIXES .a )
  endif()
endif()

360 361
include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake)

362 363 364 365
# Internal function: search for normal library as well as a debug one
#    if the debug one is specified also include debug/optimized keywords
#    in *_LIBRARIES variable
function(_protobuf_find_libraries name filename)
366 367 368 369 370 371 372 373 374
  if(${name}_LIBRARIES)
    # Use result recorded by a previous call.
    return()
  elseif(${name}_LIBRARY)
    # Honor cache entry used by CMake 3.5 and lower.
    set(${name}_LIBRARIES "${${name}_LIBRARY}" PARENT_SCOPE)
  else()
    find_library(${name}_LIBRARY_RELEASE
      NAMES ${filename}
375
      PATHS ${Protobuf_SRC_ROOT_FOLDER}/vsprojects/${_PROTOBUF_ARCH_DIR}Release)
376 377 378
    mark_as_advanced(${name}_LIBRARY_RELEASE)

    find_library(${name}_LIBRARY_DEBUG
379
      NAMES ${filename}d ${filename}
380
      PATHS ${Protobuf_SRC_ROOT_FOLDER}/vsprojects/${_PROTOBUF_ARCH_DIR}Debug)
381 382 383 384 385 386
    mark_as_advanced(${name}_LIBRARY_DEBUG)

    select_library_configurations(${name})
    set(${name}_LIBRARY "${${name}_LIBRARY}" PARENT_SCOPE)
    set(${name}_LIBRARIES "${${name}_LIBRARIES}" PARENT_SCOPE)
  endif()
387 388
endfunction()

389 390 391 392 393
# Internal function: find threads library
function(_protobuf_find_threads)
    set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
    find_package(Threads)
    if(Threads_FOUND)
394 395
        list(APPEND Protobuf_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
        set(Protobuf_LIBRARIES "${Protobuf_LIBRARIES}" PARENT_SCOPE)
396 397 398
    endif()
endfunction()

399 400 401
#
# Main.
#
402

403 404 405 406 407 408 409
# By default have PROTOBUF_GENERATE_CPP macro pass -I to protoc
# for each directory where a proto file is referenced.
if(NOT DEFINED PROTOBUF_GENERATE_CPP_APPEND_PATH)
  set(PROTOBUF_GENERATE_CPP_APPEND_PATH TRUE)
endif()


410 411
# Google's provided vcproj files generate libraries with a "lib"
# prefix on Windows
412
if(MSVC)
413
    set(Protobuf_ORIG_FIND_LIBRARY_PREFIXES "${CMAKE_FIND_LIBRARY_PREFIXES}")
414
    set(CMAKE_FIND_LIBRARY_PREFIXES "lib" "")
415

416
    find_path(Protobuf_SRC_ROOT_FOLDER protobuf.pc.in)
417 418
endif()

419
# The Protobuf library
420
_protobuf_find_libraries(Protobuf protobuf)
421
#DOC "The Google Protocol Buffers RELEASE Library"
422

423
_protobuf_find_libraries(Protobuf_LITE protobuf-lite)
424 425

# The Protobuf Protoc Library
426
_protobuf_find_libraries(Protobuf_PROTOC protoc)
427

428
# Restore original find library prefixes
429
if(MSVC)
430
    set(CMAKE_FIND_LIBRARY_PREFIXES "${Protobuf_ORIG_FIND_LIBRARY_PREFIXES}")
431 432
endif()

433 434 435
if(UNIX)
    _protobuf_find_threads()
endif()
436 437

# Find the include directory
438
find_path(Protobuf_INCLUDE_DIR
439
    google/protobuf/service.h
440
    PATHS ${Protobuf_SRC_ROOT_FOLDER}/src
441
)
442
mark_as_advanced(Protobuf_INCLUDE_DIR)
443 444

# Find the protoc Executable
445
find_program(Protobuf_PROTOC_EXECUTABLE
446 447 448
    NAMES protoc
    DOC "The Google Protocol Buffers Compiler"
    PATHS
449 450
    ${Protobuf_SRC_ROOT_FOLDER}/vsprojects/${_PROTOBUF_ARCH_DIR}Release
    ${Protobuf_SRC_ROOT_FOLDER}/vsprojects/${_PROTOBUF_ARCH_DIR}Debug
451
)
452
mark_as_advanced(Protobuf_PROTOC_EXECUTABLE)
453

454
if(Protobuf_DEBUG)
455 456 457 458
    message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
        "requested version of Google Protobuf is ${Protobuf_FIND_VERSION}")
endif()

459 460
if(Protobuf_INCLUDE_DIR)
  set(_PROTOBUF_COMMON_HEADER ${Protobuf_INCLUDE_DIR}/google/protobuf/stubs/common.h)
461

462
  if(Protobuf_DEBUG)
463 464 465 466
    message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
                   "location of common.h: ${_PROTOBUF_COMMON_HEADER}")
  endif()

467 468
  set(Protobuf_VERSION "")
  set(Protobuf_LIB_VERSION "")
469 470
  file(STRINGS ${_PROTOBUF_COMMON_HEADER} _PROTOBUF_COMMON_H_CONTENTS REGEX "#define[ \t]+GOOGLE_PROTOBUF_VERSION[ \t]+")
  if(_PROTOBUF_COMMON_H_CONTENTS MATCHES "#define[ \t]+GOOGLE_PROTOBUF_VERSION[ \t]+([0-9]+)")
471
      set(Protobuf_LIB_VERSION "${CMAKE_MATCH_1}")
472 473 474
  endif()
  unset(_PROTOBUF_COMMON_H_CONTENTS)

475 476 477 478
  math(EXPR _PROTOBUF_MAJOR_VERSION "${Protobuf_LIB_VERSION} / 1000000")
  math(EXPR _PROTOBUF_MINOR_VERSION "${Protobuf_LIB_VERSION} / 1000 % 1000")
  math(EXPR _PROTOBUF_SUBMINOR_VERSION "${Protobuf_LIB_VERSION} % 1000")
  set(Protobuf_VERSION "${_PROTOBUF_MAJOR_VERSION}.${_PROTOBUF_MINOR_VERSION}.${_PROTOBUF_SUBMINOR_VERSION}")
479

480
  if(Protobuf_DEBUG)
481
    message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
482
        "${_PROTOBUF_COMMON_HEADER} reveals protobuf ${Protobuf_VERSION}")
483 484 485
  endif()

  # Check Protobuf compiler version to be aligned with libraries version
486
  execute_process(COMMAND ${Protobuf_PROTOC_EXECUTABLE} --version
487 488 489 490 491 492
                  OUTPUT_VARIABLE _PROTOBUF_PROTOC_EXECUTABLE_VERSION)

  if("${_PROTOBUF_PROTOC_EXECUTABLE_VERSION}" MATCHES "libprotoc ([0-9.]+)")
    set(_PROTOBUF_PROTOC_EXECUTABLE_VERSION "${CMAKE_MATCH_1}")
  endif()

493
  if(Protobuf_DEBUG)
494
    message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
495
        "${Protobuf_PROTOC_EXECUTABLE} reveals version ${_PROTOBUF_PROTOC_EXECUTABLE_VERSION}")
496 497
  endif()

498
  if(NOT "${_PROTOBUF_PROTOC_EXECUTABLE_VERSION}" VERSION_EQUAL "${Protobuf_VERSION}")
499
      message(WARNING "Protobuf compiler version ${_PROTOBUF_PROTOC_EXECUTABLE_VERSION}"
500
          " doesn't match library version ${Protobuf_VERSION}")
501
  endif()
502 503

  if(Protobuf_LIBRARY)
504 505 506
      if(NOT TARGET protobuf::libprotobuf)
          add_library(protobuf::libprotobuf UNKNOWN IMPORTED)
          set_target_properties(protobuf::libprotobuf PROPERTIES
507 508
            INTERFACE_INCLUDE_DIRECTORIES "${Protobuf_INCLUDE_DIR}")
          if(EXISTS "${Protobuf_LIBRARY}")
509
            set_target_properties(protobuf::libprotobuf PROPERTIES
510 511 512
              IMPORTED_LOCATION "${Protobuf_LIBRARY}")
          endif()
          if(EXISTS "${Protobuf_LIBRARY_RELEASE}")
513
            set_property(TARGET protobuf::libprotobuf APPEND PROPERTY
514
              IMPORTED_CONFIGURATIONS RELEASE)
515
            set_target_properties(protobuf::libprotobuf PROPERTIES
516 517 518
              IMPORTED_LOCATION_RELEASE "${Protobuf_LIBRARY_RELEASE}")
          endif()
          if(EXISTS "${Protobuf_LIBRARY_DEBUG}")
519
            set_property(TARGET protobuf::libprotobuf APPEND PROPERTY
520
              IMPORTED_CONFIGURATIONS DEBUG)
521
            set_target_properties(protobuf::libprotobuf PROPERTIES
522 523 524 525 526 527
              IMPORTED_LOCATION_DEBUG "${Protobuf_LIBRARY_DEBUG}")
          endif()
      endif()
  endif()

  if(Protobuf_LITE_LIBRARY)
528 529 530
      if(NOT TARGET protobuf::libprotobuf-lite)
          add_library(protobuf::libprotobuf-lite UNKNOWN IMPORTED)
          set_target_properties(protobuf::libprotobuf-lite PROPERTIES
531 532
            INTERFACE_INCLUDE_DIRECTORIES "${Protobuf_INCLUDE_DIR}")
          if(EXISTS "${Protobuf_LITE_LIBRARY}")
533
            set_target_properties(protobuf::libprotobuf-lite PROPERTIES
534 535 536
              IMPORTED_LOCATION "${Protobuf_LITE_LIBRARY}")
          endif()
          if(EXISTS "${Protobuf_LITE_LIBRARY_RELEASE}")
537
            set_property(TARGET protobuf::libprotobuf-lite APPEND PROPERTY
538
              IMPORTED_CONFIGURATIONS RELEASE)
539
            set_target_properties(protobuf::libprotobuf-lite PROPERTIES
540 541 542
              IMPORTED_LOCATION_RELEASE "${Protobuf_LITE_LIBRARY_RELEASE}")
          endif()
          if(EXISTS "${Protobuf_LITE_LIBRARY_DEBUG}")
543
            set_property(TARGET protobuf::libprotobuf-lite APPEND PROPERTY
544
              IMPORTED_CONFIGURATIONS DEBUG)
545
            set_target_properties(protobuf::libprotobuf-lite PROPERTIES
546 547 548 549 550 551
              IMPORTED_LOCATION_DEBUG "${Protobuf_LITE_LIBRARY_DEBUG}")
          endif()
      endif()
  endif()

  if(Protobuf_PROTOC_LIBRARY)
552 553 554
      if(NOT TARGET protobuf::libprotoc)
          add_library(protobuf::libprotoc UNKNOWN IMPORTED)
          set_target_properties(protobuf::libprotoc PROPERTIES
555 556
            INTERFACE_INCLUDE_DIRECTORIES "${Protobuf_INCLUDE_DIR}")
          if(EXISTS "${Protobuf_PROTOC_LIBRARY}")
557
            set_target_properties(protobuf::libprotoc PROPERTIES
558 559 560
              IMPORTED_LOCATION "${Protobuf_PROTOC_LIBRARY}")
          endif()
          if(EXISTS "${Protobuf_PROTOC_LIBRARY_RELEASE}")
561
            set_property(TARGET protobuf::libprotoc APPEND PROPERTY
562
              IMPORTED_CONFIGURATIONS RELEASE)
563
            set_target_properties(protobuf::libprotoc PROPERTIES
564 565 566
              IMPORTED_LOCATION_RELEASE "${Protobuf_PROTOC_LIBRARY_RELEASE}")
          endif()
          if(EXISTS "${Protobuf_PROTOC_LIBRARY_DEBUG}")
567
            set_property(TARGET protobuf::libprotoc APPEND PROPERTY
568
              IMPORTED_CONFIGURATIONS DEBUG)
569
            set_target_properties(protobuf::libprotoc PROPERTIES
570 571 572 573
              IMPORTED_LOCATION_DEBUG "${Protobuf_PROTOC_LIBRARY_DEBUG}")
          endif()
      endif()
  endif()
574 575 576 577 578 579 580 581 582 583

  if(Protobuf_PROTOC_EXECUTABLE)
      if(NOT TARGET protobuf::protoc)
          add_executable(protobuf::protoc IMPORTED)
          if(EXISTS "${Protobuf_PROTOC_EXECUTABLE}")
            set_target_properties(protobuf::protoc PROPERTIES
              IMPORTED_LOCATION "${Protobuf_PROTOC_EXECUTABLE}")
          endif()
      endif()
  endif()
584
endif()
585

586
include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
587
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Protobuf
588 589
    REQUIRED_VARS Protobuf_LIBRARIES Protobuf_INCLUDE_DIR
    VERSION_VAR Protobuf_VERSION
590
)
591

592 593
if(Protobuf_FOUND)
    set(Protobuf_INCLUDE_DIRS ${Protobuf_INCLUDE_DIR})
594
endif()
595

596 597 598 599 600
# Restore the original find library ordering
if( Protobuf_USE_STATIC_LIBS )
  set(CMAKE_FIND_LIBRARY_SUFFIXES ${_protobuf_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
endif()

601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622
# Backwards compatibility
# Define upper case versions of output variables
foreach(Camel
    Protobuf_SRC_ROOT_FOLDER
    Protobuf_IMPORT_DIRS
    Protobuf_DEBUG
    Protobuf_INCLUDE_DIRS
    Protobuf_LIBRARIES
    Protobuf_PROTOC_LIBRARIES
    Protobuf_LITE_LIBRARIES
    Protobuf_LIBRARY
    Protobuf_PROTOC_LIBRARY
    Protobuf_INCLUDE_DIR
    Protobuf_PROTOC_EXECUTABLE
    Protobuf_LIBRARY_DEBUG
    Protobuf_PROTOC_LIBRARY_DEBUG
    Protobuf_LITE_LIBRARY
    Protobuf_LITE_LIBRARY_DEBUG
    )
    string(TOUPPER ${Camel} UPPER)
    set(${UPPER} ${${Camel}})
endforeach()