Index: cmake-2.8.3/Modules/FindProtobuf.cmake
===================================================================
--- cmake-2.8.3.orig/Modules/FindProtobuf.cmake
+++ cmake-2.8.3/Modules/FindProtobuf.cmake
@@ -11,6 +11,13 @@
 #   PROTOBUF_INCLUDE_DIR - The include directory for protocol buffers
 #   PROTOBUF_PROTOC_EXECUTABLE - The protoc compiler
 #
+# Optional variables you can define prior to calling this module:
+#
+#   PROTOBUF_IMPORT_DIRS - List of directories to search for imported
+#                          .proto files. This variable, if specifed,
+#                          overrides the default search (in the
+#                          ${CMAKE_CURRENT_SOURCE_DIR} directory).
+#
 #  ====================================================================
 #  Example:
 #
@@ -57,24 +64,47 @@ function(PROTOBUF_GENERATE_CPP SRCS HDRS
     return()
   endif(NOT ARGN)
 
+  if(DEFINED PROTOBUF_IMPORT_DIRS)
+    foreach(DIR ${PROTOBUF_IMPORT_DIRS})
+      get_filename_component(ABS_DIR ${DIR} ABSOLUTE)
+      list(APPEND PROTO_PATH_DIRS ${ABS_DIR})
+    endforeach(DIR)
+  else(DEFINED PROTOBUF_IMPORT_DIRS)
+    set(PROTO_PATH_DIRS ${CMAKE_CURRENT_SOURCE_DIR})
+  endif(DEFINED PROTOBUF_IMPORT_DIRS)
+
+  foreach(DIR ${PROTO_PATH_DIRS})
+    list(APPEND PROTO_PATH_OPTS --proto_path ${DIR})
+  endforeach(DIR)
+
   set(${SRCS})
   set(${HDRS})
   foreach(FIL ${ARGN})
     get_filename_component(ABS_FIL ${FIL} ABSOLUTE)
-    get_filename_component(FIL_WE ${FIL} NAME_WE)
-    
-    list(APPEND ${SRCS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc")
-    list(APPEND ${HDRS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h")
+
+    # Find the first directory in the PROTO_PATH_DIRS list matching
+    # the .proto file path. The directory will be used by the protoc
+    # compiler for the --proto_path => --cpp_out substitution.
+    #
+    foreach(DIR ${PROTO_PATH_DIRS})
+      file(RELATIVE_PATH REL_FIL ${DIR} ${ABS_FIL})
+      if(NOT ${REL_FIL})
+        string(REGEX REPLACE ".proto$" "" FIL_WE ${REL_FIL})
+        list(APPEND ${SRCS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc")
+        list(APPEND ${HDRS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h")
+        break()
+      endif(NOT ${REL_FIL})
+    endforeach(DIR)
 
     add_custom_command(
       OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc"
              "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h"
       COMMAND  ${PROTOBUF_PROTOC_EXECUTABLE}
-      ARGS --cpp_out  ${CMAKE_CURRENT_BINARY_DIR} --proto_path ${CMAKE_CURRENT_SOURCE_DIR} ${ABS_FIL}
+      ARGS --cpp_out  ${CMAKE_CURRENT_BINARY_DIR} ${PROTO_PATH_OPTS} ${ABS_FIL}
       DEPENDS ${ABS_FIL}
       COMMENT "Running C++ protocol buffer compiler on ${FIL}"
       VERBATIM )
-  endforeach()
+  endforeach(FIL)
 
   set_source_files_properties(${${SRCS}} ${${HDRS}} PROPERTIES GENERATED TRUE)
   set(${SRCS} ${${SRCS}} PARENT_SCOPE)
