FindProtobuf: Better MSVC support, Searching for protobuf lite

Add support for finding debug libraries
Add support for searching Google provided MSVC project dir structure for libs
Add support for finding Protobuf "Lite" libraries
This commit is contained in:
Philip Lowman 2011-05-25 22:01:49 -04:00
parent 9ea53478a6
commit ca000a0948
1 changed files with 82 additions and 22 deletions

View File

@ -1,15 +1,31 @@
# Locate and configure the Google Protocol Buffers library. # Locate and configure the Google Protocol Buffers library.
#
# The following variables can be set and are optional:
#
# PROTOBUF_SRC_ROOT_FOLDER - When compiling with MSVC, if this cache variable is set
# the protobuf-default VS project build locations
# (vsprojects/Debug & vsprojects/Release) will be searched
# for libraries and binaries.
#
# Defines the following variables: # Defines the following variables:
# #
# PROTOBUF_FOUND - Found the Google Protocol Buffers library # PROTOBUF_FOUND - Found the Google Protocol Buffers library (libprotobuf & header files)
# PROTOBUF_INCLUDE_DIRS - Include directories for Google Protocol Buffers # PROTOBUF_INCLUDE_DIRS - Include directories for Google Protocol Buffers
# PROTOBUF_LIBRARIES - The protobuf library # PROTOBUF_LIBRARIES - The protobuf libraries
# [New in CMake 2.8.5]
# PROTOBUF_PROTOC_LIBRARIES - The protoc libraries
# PROTOBUF_LITE_LIBRARIES - The protobuf-lite libraries
# #
# The following cache variables are also defined: # The following cache variables are also available to set or use:
# PROTOBUF_LIBRARY - The protobuf library # PROTOBUF_LIBRARY - The protobuf library
# PROTOBUF_PROTOC_LIBRARY - The protoc library # PROTOBUF_PROTOC_LIBRARY - The protoc library
# PROTOBUF_INCLUDE_DIR - The include directory for protocol buffers # PROTOBUF_INCLUDE_DIR - The include directory for protocol buffers
# PROTOBUF_PROTOC_EXECUTABLE - The protoc compiler # PROTOBUF_PROTOC_EXECUTABLE - The protoc compiler
# [New in CMake 2.8.5]
# PROTOBUF_LIBRARY_DEBUG - The protobuf library (debug)
# PROTOBUF_PROTOC_LIBRARY_DEBUG - The protoc library (debug)
# PROTOBUF_LITE_LIBRARY - The protobuf lite library
# PROTOBUF_LITE_LIBRARY_DEBUG - The protobuf lite library (debug)
# #
# ==================================================================== # ====================================================================
# Example: # Example:
@ -20,7 +36,7 @@
# include_directories(${CMAKE_CURRENT_BINARY_DIR}) # include_directories(${CMAKE_CURRENT_BINARY_DIR})
# PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS foo.proto) # PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS foo.proto)
# add_executable(bar bar.cc ${PROTO_SRCS} ${PROTO_HDRS}) # add_executable(bar bar.cc ${PROTO_SRCS} ${PROTO_HDRS})
# target_link_libraries(bar ${PROTOBUF_LIBRARY}) # target_link_libraries(bar ${PROTOBUF_LIBRARIES})
# #
# NOTE: You may need to link against pthreads, depending # NOTE: You may need to link against pthreads, depending
# on the platform. # on the platform.
@ -38,7 +54,7 @@
#============================================================================= #=============================================================================
# Copyright 2009 Kitware, Inc. # Copyright 2009 Kitware, Inc.
# Copyright 2009 Philip Lowman <philip@yhbt.com> # Copyright 2009,2011 Philip Lowman <philip@yhbt.com>
# Copyright 2008 Esben Mose Hansen, Ange Optimization ApS # Copyright 2008 Esben Mose Hansen, Ange Optimization ApS
# #
# Distributed under the OSI-approved BSD License (the "License"); # Distributed under the OSI-approved BSD License (the "License");
@ -81,41 +97,85 @@ function(PROTOBUF_GENERATE_CPP SRCS HDRS)
set(${HDRS} ${${HDRS}} PARENT_SCOPE) set(${HDRS} ${${HDRS}} PARENT_SCOPE)
endfunction() endfunction()
# 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)
find_library(${name}_LIBRARY
NAMES ${filename}
PATHS ${PROTOBUF_SRC_ROOT_FOLDER}/vsprojects/Release)
mark_as_advanced(${name}_LIBRARY)
find_path(PROTOBUF_INCLUDE_DIR google/protobuf/service.h) find_library(${name}_LIBRARY_DEBUG
NAMES ${filename}
PATHS ${PROTOBUF_SRC_ROOT_FOLDER}/vsprojects/Debug)
mark_as_advanced(${name}_LIBRARY_DEBUG)
if(NOT ${name}_LIBRARY_DEBUG)
# There is no debug library
set(${name}_LIBRARY_DEBUG ${${name}_LIBRARY} PARENT_SCOPE)
set(${name}_LIBRARIES ${${name}_LIBRARY} PARENT_SCOPE)
else()
# There IS a debug library
set(${name}_LIBRARIES
optimized ${${name}_LIBRARY}
debug ${${name}_LIBRARY_DEBUG}
PARENT_SCOPE
)
endif()
endfunction()
#
# Main.
#
# Google's provided vcproj files generate libraries with a "lib" # Google's provided vcproj files generate libraries with a "lib"
# prefix on Windows # prefix on Windows
if(WIN32) if(MSVC)
set(PROTOBUF_ORIG_FIND_LIBRARY_PREFIXES "${CMAKE_FIND_LIBRARY_PREFIXES}") set(PROTOBUF_ORIG_FIND_LIBRARY_PREFIXES "${CMAKE_FIND_LIBRARY_PREFIXES}")
set(CMAKE_FIND_LIBRARY_PREFIXES "lib" "") set(CMAKE_FIND_LIBRARY_PREFIXES "lib" "")
find_path(PROTOBUF_SRC_ROOT_FOLDER protobuf.pc.in)
endif() endif()
find_library(PROTOBUF_LIBRARY NAMES protobuf # The Protobuf library
DOC "The Google Protocol Buffers Library" _protobuf_find_libraries(PROTOBUF protobuf)
) #DOC "The Google Protocol Buffers RELEASE Library"
find_library(PROTOBUF_PROTOC_LIBRARY NAMES protoc
DOC "The Google Protocol Buffers Compiler Library"
)
find_program(PROTOBUF_PROTOC_EXECUTABLE NAMES protoc
DOC "The Google Protocol Buffers Compiler"
)
mark_as_advanced(PROTOBUF_INCLUDE_DIR _protobuf_find_libraries(PROTOBUF_LITE protobuf-lite)
PROTOBUF_LIBRARY
PROTOBUF_PROTOC_LIBRARY # The Protobuf Protoc Library
PROTOBUF_PROTOC_EXECUTABLE) _protobuf_find_libraries(PROTOBUF_PROTOC protoc)
# Restore original find library prefixes # Restore original find library prefixes
if(WIN32) if(MSVC)
set(CMAKE_FIND_LIBRARY_PREFIXES "${PROTOBUF_ORIG_FIND_LIBRARY_PREFIXES}") set(CMAKE_FIND_LIBRARY_PREFIXES "${PROTOBUF_ORIG_FIND_LIBRARY_PREFIXES}")
endif() endif()
# Find the include directory
find_path(PROTOBUF_INCLUDE_DIR
google/protobuf/service.h
PATHS ${PROTOBUF_SRC_ROOT_FOLDER}/src
)
mark_as_advanced(PROTOBUF_INCLUDE_DIR)
# Find the protoc Executable
find_program(PROTOBUF_PROTOC_EXECUTABLE
NAMES protoc
DOC "The Google Protocol Buffers Compiler"
PATHS
${PROTOBUF_SRC_ROOT_FOLDER}/vsprojects/Release
${PROTOBUF_SRC_ROOT_FOLDER}/vsprojects/Debug
)
mark_as_advanced(PROTOBUF_PROTOC_EXECUTABLE)
include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(PROTOBUF DEFAULT_MSG FIND_PACKAGE_HANDLE_STANDARD_ARGS(PROTOBUF DEFAULT_MSG
PROTOBUF_LIBRARY PROTOBUF_INCLUDE_DIR) PROTOBUF_LIBRARY PROTOBUF_INCLUDE_DIR)
if(PROTOBUF_FOUND) if(PROTOBUF_FOUND)
set(PROTOBUF_INCLUDE_DIRS ${PROTOBUF_INCLUDE_DIR}) set(PROTOBUF_INCLUDE_DIRS ${PROTOBUF_INCLUDE_DIR})
set(PROTOBUF_LIBRARIES ${PROTOBUF_LIBRARY})
endif() endif()