Forráskód Böngészése

Restore and improve build from protobuf/grpc sources

Viktor Kopp 5 éve
szülő
commit
0526227908
3 módosított fájl, 29 hozzáadás és 30 törlés
  1. 9 15
      CMakeLists.txt
  2. 19 14
      cmake/gRPCBuild.cmake
  3. 1 1
      examples/addressbookserver/CMakeLists.txt

+ 9 - 15
CMakeLists.txt

@@ -4,6 +4,7 @@ project(QtProtobuf VERSION 0.1.0)
 
 find_package(Protobuf)
 
+# FIXME: what is the reason to set these variables in root CMake?
 if(NOT DEFINED PREFIX)
     set(PREFIX /usr)
 endif()
@@ -18,26 +19,19 @@ set(TARGET_INCLUDE_DIR ${PREFIX}/include/${PROJECT_NAME})
 set(TARGET_CMAKE_DIR ${TARGET_LIB_DIR}/cmake/${PROJECT_NAME})
 
 message("CMAKE_MODULE_PATH: ${CMAKE_SYSTEM_MODULE_PATH}")
+# FIXME: each target must expose their headers via target_include_directories
 include_directories(${CMAKE_SOURCE_DIR}/src/protobuf ${CMAKE_SOURCE_DIR}/src/grpc)
 
-if(NOT Protobuf_FOUND)
-    # these names of the variable are equal to those assigned by find_package(Protobuf)
-    set(Protobuf_PROTOC_EXECUTABLE protoc)
-    set(Protobuf_PROTOC_LIBRARY protoc)
-    set(Protobuf_LIBRARIES protobuf pthread)
-endif()
-
-if(NOT DEFINED gRPC_CPP_PLUGIN_EXECUTABLE)
-    find_program(gRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin)
-    if(gRPC_CPP_PLUGIN_EXECUTABLE STREQUAL gRPC_CPP_PLUGIN_EXECUTABLE-NOTFOUND)
-        unset(gRPC_CPP_PLUGIN_EXECUTABLE)
-    endif()
-endif()
-
-if (NOT DEFINED gRPC_CPP_PLUGIN_EXECUTABLE)
+find_program(gRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin)
+if (gRPC_CPP_PLUGIN_EXECUTABLE STREQUAL gRPC_CPP_PLUGIN_EXECUTABLE-NOTFOUND)
     # if no approprite Protobuf installed, there is no appropriate version of gRPC neither
     # the next include provides both from sources
     include(cmake/gRPCBuild.cmake)
+    
+    # names of the variables are equal to those assigned by find_package(Protobuf)
+    set(Protobuf_PROTOC_EXECUTABLE protoc)
+    set(Protobuf_PROTOC_LIBRARY libprotoc)
+    set(Protobuf_LIBRARIES libprotobuf)
 
     set(gRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:grpc_cpp_plugin>)
 endif()

+ 19 - 14
cmake/gRPCBuild.cmake

@@ -5,7 +5,6 @@ download_project(PROJ   gRPCDownload
 )
 set(gRPCDownload_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR})
 
-
 include(ExternalProject)
 # Builds c-ares project from the git submodule.
 # Note: For all external projects, instead of using checked-out code, one could
@@ -36,26 +35,25 @@ set(LIBPROTOC_PREFIX_PATH "${gRPCDownload_INSTALL_DIR}/protobuf")
 set(LIBPROTOC_BINARY_PATH "${LIBPROTOC_PREFIX_PATH}/lib")
 set(LIBPROTOC_LIB_INCLUDE "${LIBPROTOC_PREFIX_PATH}/include")
 
-# Hack to make it work, otherwise INTERFACE_INCLUDE_DIRECTORIES will not be propagated
-file(MAKE_DIRECTORY ${LIBPROTOC_LIB_INCLUDE})
-
 add_library(libprotoc IMPORTED STATIC GLOBAL)
 add_library(libprotobuf IMPORTED STATIC GLOBAL)
 add_executable(protoc IMPORTED GLOBAL)
 add_dependencies(libprotoc protobuf)
+add_dependencies(libprotobuf protobuf)
+add_dependencies(protoc protobuf)
 
 set_target_properties(protoc PROPERTIES
-        "IMPORTED_LOCATION" "${LIBPROTOC_PREFIX_PATH}/bin/protoc"
+        IMPORTED_LOCATION "${LIBPROTOC_PREFIX_PATH}/bin/protoc"
 )
 
 set_target_properties(libprotoc PROPERTIES
-        "IMPORTED_LOCATION" "${LIBPROTOC_BINARY_PATH}/libprotoc.a"
-        "INTERFACE_INCLUDE_DIRECTORIES" "${LIBPROTOC_LIB_INCLUDE}"
+        IMPORTED_LOCATION "${LIBPROTOC_BINARY_PATH}/libprotoc.a"
+        INTERFACE_INCLUDE_DIRECTORIES $<BUILD_INTERFACE:${LIBPROTOC_LIB_INCLUDE}>
 )
 
 set_target_properties(libprotobuf PROPERTIES
-        "IMPORTED_LOCATION" "${LIBPROTOC_BINARY_PATH}/libprotobuf.a"
-        "INTERFACE_INCLUDE_DIRECTORIES" "${LIBPROTOC_LIB_INCLUDE}"
+        IMPORTED_LOCATION "${LIBPROTOC_BINARY_PATH}/libprotobuf.a"
+        INTERFACE_INCLUDE_DIRECTORIES $<BUILD_INTERFACE:${LIBPROTOC_LIB_INCLUDE}>
 )
 
 # Builds zlib project from the git submodule.
@@ -81,7 +79,7 @@ endif()
 
 # Builds gRPC based on locally checked-out sources and set arguments so that all the dependencies
 # are correctly located.
-ExternalProject_Add(grpc
+ExternalProject_Add(gRPC
   PREFIX grpc
   SOURCE_DIR "${gRPCDownload_SOURCE_DIR}"
   CMAKE_CACHE_ARGS
@@ -108,8 +106,15 @@ set_target_properties(grpc_cpp_plugin PROPERTIES
 
 add_library(grpc++ IMPORTED STATIC GLOBAL)
 set_target_properties(grpc++ PROPERTIES
-        IMPORTED_LOCATION "${LIBGRPC_PREFIX_PATH}/lib/libgrpc++_unsecure.a"
-        INTERFACE_INCLUDE_DIRECTORIES "${LIBGRPC_PREFIX_PATH}/include"
-        IMPORTED_LINK_INTERFACE_LIBRARIES "${LIBGRPC_PREFIX_PATH}/lib/libgrpc.a;${LIBGRPC_PREFIX_PATH}/lib/libgpr.a;${LIBGRPC_PREFIX_PATH}/lib/libaddress_sorting.a;${gRPCDownload_INSTALL_DIR}/c-ares/lib/libcares.a;${gRPCDownload_INSTALL_DIR}/zlib/lib/libz.a;pthread"
-                                          
+        IMPORTED_LOCATION "${LIBGRPC_PREFIX_PATH}/lib/libgrpc++.a"
+        INTERFACE_INCLUDE_DIRECTORIES $<BUILD_INTERFACE:${LIBGRPC_PREFIX_PATH}/include>
+        IMPORTED_LINK_INTERFACE_LIBRARIES "${LIBGRPC_PREFIX_PATH}/lib/libgrpc.a;${LIBGRPC_PREFIX_PATH}/lib/libgpr.a;${LIBGRPC_PREFIX_PATH}/lib/libaddress_sorting.a;${gRPCDownload_INSTALL_DIR}/c-ares/lib/libcares.a;${gRPCDownload_INSTALL_DIR}/zlib/lib/libz.a;ssl;crypto;pthread"
+)
+
+add_library(grpc IMPORTED STATIC GLOBAL)
+set_target_properties(grpc PROPERTIES
+        IMPORTED_LOCATION "${LIBGRPC_PREFIX_PATH}/lib/libgrpc.a"
 )
+add_dependencies(grpc_cpp_plugin gRPC)
+add_dependencies(grpc++ gRPC)
+add_dependencies(grpc gRPC)

+ 1 - 1
examples/addressbookserver/CMakeLists.txt

@@ -21,5 +21,5 @@ if(WIN32)
     link_directories(${PROTOBUF_LIBRARIES_PATH} ${GRPC_LIBRARIES})
 endif()
 
-target_link_libraries(${TARGET} protobuf grpc grpc++)
+target_link_libraries(${TARGET} ${Protobuf_LIBRARIES} grpc++ grpc)
 file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/cert.pem ${CMAKE_CURRENT_SOURCE_DIR}/key.pem DESTINATION ${CMAKE_CURRENT_BINARY_DIR})