Просмотр исходного кода

Merge topic '12128_FindProtobuf_module_behavior_under_Windows_is_annoying'

517837f Fix , to - in Copyright message so it passes CMake.ModuleNotices test
162f3fb Merge branch 'master' of git://public.kitware.com/cmake into 12128_FindProtobuf_module_behavior_under_Windows_is_annoying
ca000a0 FindProtobuf: Better MSVC support, Searching for protobuf lite
Brad King 14 лет назад
Родитель
Сommit
e164bb1e76
1 измененных файлов с 82 добавлено и 22 удалено
  1. 82 22
      Modules/FindProtobuf.cmake

+ 82 - 22
Modules/FindProtobuf.cmake

@@ -1,15 +1,31 @@
 # 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:
 #
-#   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_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_PROTOC_LIBRARY   - The protoc library
 #   PROTOBUF_INCLUDE_DIR - The include directory for protocol buffers
 #   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:
@@ -20,7 +36,7 @@
 #   include_directories(${CMAKE_CURRENT_BINARY_DIR})
 #   PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS foo.proto)
 #   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
 # on the platform.
@@ -38,7 +54,7 @@
 
 #=============================================================================
 # Copyright 2009 Kitware, Inc.
-# Copyright 2009 Philip Lowman <[email protected]>
+# Copyright 2009-2011 Philip Lowman <[email protected]>
 # Copyright 2008 Esben Mose Hansen, Ange Optimization ApS
 #
 # Distributed under the OSI-approved BSD License (the "License");
@@ -81,41 +97,85 @@ function(PROTOBUF_GENERATE_CPP SRCS HDRS)
   set(${HDRS} ${${HDRS}} PARENT_SCOPE)
 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_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()
+
 
-find_path(PROTOBUF_INCLUDE_DIR google/protobuf/service.h)
+#
+# Main.
+#
 
 # Google's provided vcproj files generate libraries with a "lib"
 # prefix on Windows
-if(WIN32)
+if(MSVC)
     set(PROTOBUF_ORIG_FIND_LIBRARY_PREFIXES "${CMAKE_FIND_LIBRARY_PREFIXES}")
     set(CMAKE_FIND_LIBRARY_PREFIXES "lib" "")
+
+    find_path(PROTOBUF_SRC_ROOT_FOLDER protobuf.pc.in)
 endif()
 
-find_library(PROTOBUF_LIBRARY NAMES protobuf
-             DOC "The Google Protocol Buffers 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"
-)
+# The Protobuf library
+_protobuf_find_libraries(PROTOBUF protobuf)
+#DOC "The Google Protocol Buffers RELEASE Library"
 
-mark_as_advanced(PROTOBUF_INCLUDE_DIR
-                 PROTOBUF_LIBRARY
-                 PROTOBUF_PROTOC_LIBRARY
-                 PROTOBUF_PROTOC_EXECUTABLE)
+_protobuf_find_libraries(PROTOBUF_LITE protobuf-lite)
+
+# The Protobuf Protoc Library
+_protobuf_find_libraries(PROTOBUF_PROTOC protoc)
 
 # Restore original find library prefixes
-if(WIN32)
+if(MSVC)
     set(CMAKE_FIND_LIBRARY_PREFIXES "${PROTOBUF_ORIG_FIND_LIBRARY_PREFIXES}")
 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)
 FIND_PACKAGE_HANDLE_STANDARD_ARGS(PROTOBUF DEFAULT_MSG
     PROTOBUF_LIBRARY PROTOBUF_INCLUDE_DIR)
 
 if(PROTOBUF_FOUND)
     set(PROTOBUF_INCLUDE_DIRS ${PROTOBUF_INCLUDE_DIR})
-    set(PROTOBUF_LIBRARIES    ${PROTOBUF_LIBRARY})
 endif()