[CMake] Allow to use pre-installed protobuf
authorMyungJoo Ham <myungjoo.ham@samsung.com>
Wed, 10 Jul 2019 02:07:38 +0000 (11:07 +0900)
committerMyungJoo Ham <myungjoo.ham@samsung.com>
Wed, 10 Jul 2019 02:07:38 +0000 (11:07 +0900)
If the system already has protobuf, let's use it without
downloading one.

Change-Id: Iaa2e722f0a5e4170422d66579f56be29dee01249
Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
tensorflow/contrib/cmake/CMakeLists.txt
tensorflow/contrib/cmake/external/protobuf.cmake

index f693b9da4e100150ca8f4913797689bad0a46bbd..c3de5b8421cbd671d710de557b4f169944725e53 100644 (file)
@@ -27,6 +27,7 @@ get_filename_component(tensorflow_source_dir ${tf_tf_source_dir} PATH)
 cmake_policy(SET CMP0022 NEW)
 
 # Options
+set_property(DIRECTORY PROPERTY EP_UPDATE_DISCONNECTED 1)
 option(tensorflow_VERBOSE "Enable for verbose output" OFF)
 
 if(WIN32)
@@ -109,11 +110,13 @@ if (NOT WIN32)
   # Options for linking other libraries
   option(systemlib_ZLIB "Use the system installed library as shared objects instead of downloading ZLIB and statically linking to it: ZLIB" OFF)
   option(systemlib_ABSEIL_CPP "Use the system installed library as shared objects instead of downloading ABSEIL_CPP and statically linking to it: ABSEIL_CPP" OFF)
+  option(systemlib_PROTOBUF "Use the system installed library as shared objects instead of downloading PROTOBUF and statically linking to it: PROTOBUF" OFF)
 
   option(systemlib_ALL "Turn on every possible systemlib_* options" OFF)
   if (systemlib_ALL)
     set (systemlib_ZLIB ON)
     set (systemlib_ABSEIL_CPP ON)
+    set (systemlib_PROTOBUF ON)
   endif (systemlib_ALL)
 endif()
 
@@ -301,6 +304,14 @@ else (systemlib_ABSEIL_CPP)
     ${abseil_cpp_STATIC_LIBRARIES})
 endif (systemlib_ABSEIL_CPP)
 
+if (systemlib_PROTOBUF)
+  set(tensorflow_EXTERNAL_LIBRARIES ${tensorflow_EXTERNAL_LIBRARIES}
+      ${PROTOBUF_LIBRARIES})
+else (systemlib_PROTOBUF)
+  set(tensorflow_EXTERNAL_LIBRARIES ${tensorflow_EXTERNAL_LIBRARIES}
+    ${zlib_STATIC_LIBRARIES})
+endif (systemlib_PROTOBUF)
+
 set(tensorflow_EXTERNAL_DEPENDENCIES
     zlib_copy_headers_to_destination
     gif_copy_headers_to_destination
index 773c37b309b1dff4ed28d24cd7d6140a63ec5bc6..18aa7cf9e8e455b604189112398e3d3b4b447d57 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # ==============================================================================
-include (ExternalProject)
+if (systemlib_PROTOBUF)
+  find_package(PkgConfig)
+  pkg_search_module(PROTOBUF REQUIRED protobuf)
+  set(protobuf_INCLUDE_DIR ${PROTOBUF_INCLUDE_DIRS})
+  set(ADD_LINK_DIRECTORY ${ADD_LINK_DIRECTORY} ${PROTOBUF_LIBRARY_DIRS})
+  set(ADD_CFLAGS ${ADD_CFLAGS} ${PROTOBUF_CFLAGS_OTHER})
 
-set(PROTOBUF_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/src)
-set(PROTOBUF_URL https://github.com/google/protobuf.git)
+  # To meet DEPENDS protobuf from other projects.
+  # If we hit this line, protobuf is already built and installed to the system.
+  add_custom_target(protobuf)
+  add_custom_target(protobuf_copy_headers_to_destination)
 
-# enable choose protobuf versions
-SET(PROTOBUF_VERSION "3.6.1" CACHE STRING "Protobuf version")
-SET_PROPERTY(CACHE PROTOBUF_VERSION PROPERTY STRINGS "3.4.0" "3.5.0" "3.6.1") 
+else (systemlib_PROTOBUF)
+  include (ExternalProject)
 
-if(${PROTOBUF_VERSION} STREQUAL "3.5.1")
-    set(PROTOBUF_TAG v3.6.1)
-elseif(${PROTOBUF_VERSION} STREQUAL "3.5.0")
-    set(PROTOBUF_TAG 2761122b810fe8861004ae785cc3ab39f384d342)
-elseif(${PROTOBUF_VERSION} STREQUAL "3.4.0")
-    set(PROTOBUF_TAG b04e5cba356212e4e8c66c61bbe0c3a20537c5b9)
-endif()
+  set(PROTOBUF_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/src)
+  set(PROTOBUF_URL https://github.com/google/protobuf.git)
 
-if(WIN32)
-  if(${CMAKE_GENERATOR} MATCHES "Visual Studio.*")
-    set(protobuf_STATIC_LIBRARIES 
-      debug ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/$(Configuration)/libprotobufd.lib
-      optimized ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/$(Configuration)/libprotobuf.lib)
-    set(PROTOBUF_PROTOC_EXECUTABLE ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/$(Configuration)/protoc.exe)
-  else()
-    if(CMAKE_BUILD_TYPE EQUAL Debug)
-      set(protobuf_STATIC_LIBRARIES
-        ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/libprotobufd.lib)
+  # enable choose protobuf versions
+  SET(PROTOBUF_VERSION "3.6.1" CACHE STRING "Protobuf version")
+  SET_PROPERTY(CACHE PROTOBUF_VERSION PROPERTY STRINGS "3.4.0" "3.5.0" "3.6.1") 
+
+  if(${PROTOBUF_VERSION} STREQUAL "3.5.1")
+      set(PROTOBUF_TAG v3.6.1)
+  elseif(${PROTOBUF_VERSION} STREQUAL "3.5.0")
+      set(PROTOBUF_TAG 2761122b810fe8861004ae785cc3ab39f384d342)
+  elseif(${PROTOBUF_VERSION} STREQUAL "3.4.0")
+      set(PROTOBUF_TAG b04e5cba356212e4e8c66c61bbe0c3a20537c5b9)
+  endif()
+
+  if(WIN32)
+    if(${CMAKE_GENERATOR} MATCHES "Visual Studio.*")
+      set(protobuf_STATIC_LIBRARIES 
+        debug ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/$(Configuration)/libprotobufd.lib
+        optimized ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/$(Configuration)/libprotobuf.lib)
+      set(PROTOBUF_PROTOC_EXECUTABLE ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/$(Configuration)/protoc.exe)
     else()
-      set(protobuf_STATIC_LIBRARIES
-        ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/libprotobuf.lib)
+      if(CMAKE_BUILD_TYPE EQUAL Debug)
+        set(protobuf_STATIC_LIBRARIES
+          ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/libprotobufd.lib)
+      else()
+        set(protobuf_STATIC_LIBRARIES
+          ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/libprotobuf.lib)
+      endif()
+      set(PROTOBUF_PROTOC_EXECUTABLE ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/protoc.exe)
     endif()
-    set(PROTOBUF_PROTOC_EXECUTABLE ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/protoc.exe)
-  endif()
 
-  # This section is to make sure CONFIGURE_COMMAND use the same generator settings
-  set(PROTOBUF_GENERATOR_PLATFORM)
-  if (CMAKE_GENERATOR_PLATFORM)
-    set(PROTOBUF_GENERATOR_PLATFORM -A ${CMAKE_GENERATOR_PLATFORM})
-  endif()
-  set(PROTOBUF_GENERATOR_TOOLSET)
-  if (CMAKE_GENERATOR_TOOLSET)
-  set(PROTOBUF_GENERATOR_TOOLSET -T ${CMAKE_GENERATOR_TOOLSET})
+    # This section is to make sure CONFIGURE_COMMAND use the same generator settings
+    set(PROTOBUF_GENERATOR_PLATFORM)
+    if (CMAKE_GENERATOR_PLATFORM)
+      set(PROTOBUF_GENERATOR_PLATFORM -A ${CMAKE_GENERATOR_PLATFORM})
+    endif()
+    set(PROTOBUF_GENERATOR_TOOLSET)
+    if (CMAKE_GENERATOR_TOOLSET)
+    set(PROTOBUF_GENERATOR_TOOLSET -T ${CMAKE_GENERATOR_TOOLSET})
+    endif()
+    set(PROTOBUF_ADDITIONAL_CMAKE_OPTIONS      -Dprotobuf_MSVC_STATIC_RUNTIME:BOOL=OFF
+      -G${CMAKE_GENERATOR} ${PROTOBUF_GENERATOR_PLATFORM} ${PROTOBUF_GENERATOR_TOOLSET})
+    # End of section
+  else()
+    set(protobuf_STATIC_LIBRARIES ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/libprotobuf.a)
+    set(PROTOBUF_PROTOC_EXECUTABLE ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/protoc)
   endif()
-  set(PROTOBUF_ADDITIONAL_CMAKE_OPTIONS        -Dprotobuf_MSVC_STATIC_RUNTIME:BOOL=OFF
-    -G${CMAKE_GENERATOR} ${PROTOBUF_GENERATOR_PLATFORM} ${PROTOBUF_GENERATOR_TOOLSET})
-  # End of section
-else()
-  set(protobuf_STATIC_LIBRARIES ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/libprotobuf.a)
-  set(PROTOBUF_PROTOC_EXECUTABLE ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/protoc)
-endif()
 
-ExternalProject_Add(protobuf
-    PREFIX protobuf
-    DEPENDS zlib
-    GIT_REPOSITORY ${PROTOBUF_URL}
-    GIT_TAG ${PROTOBUF_TAG}
-    DOWNLOAD_DIR "${DOWNLOAD_LOCATION}"
-    BUILD_IN_SOURCE 1
-    BUILD_BYPRODUCTS ${PROTOBUF_PROTOC_EXECUTABLE} ${protobuf_STATIC_LIBRARIES}
-    SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf
-    # SOURCE_SUBDIR cmake/ # Requires CMake 3.7, this will allow removal of CONFIGURE_COMMAND
-    # CONFIGURE_COMMAND resets some settings made in CMAKE_CACHE_ARGS and the generator used
-    CONFIGURE_COMMAND ${CMAKE_COMMAND} cmake/
-        -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=${tensorflow_ENABLE_POSITION_INDEPENDENT_CODE}
-        -DCMAKE_BUILD_TYPE:STRING=Release
-        -DCMAKE_VERBOSE_MAKEFILE:BOOL=OFF
-        -Dprotobuf_BUILD_TESTS:BOOL=OFF
-        -DZLIB_ROOT=${ZLIB_INSTALL}
-        ${PROTOBUF_ADDITIONAL_CMAKE_OPTIONS}
-    INSTALL_COMMAND ""
-    CMAKE_CACHE_ARGS
-        -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=${tensorflow_ENABLE_POSITION_INDEPENDENT_CODE}
-        -DCMAKE_BUILD_TYPE:STRING=Release
-        -DCMAKE_VERBOSE_MAKEFILE:BOOL=OFF
-        -Dprotobuf_BUILD_TESTS:BOOL=OFF
-        -Dprotobuf_MSVC_STATIC_RUNTIME:BOOL=OFF
-        -DZLIB_ROOT:STRING=${ZLIB_INSTALL}
-)
+  ExternalProject_Add(protobuf
+      PREFIX protobuf
+      DEPENDS zlib
+      GIT_REPOSITORY ${PROTOBUF_URL}
+      GIT_TAG ${PROTOBUF_TAG}
+      DOWNLOAD_DIR "${DOWNLOAD_LOCATION}"
+      BUILD_IN_SOURCE 1
+      BUILD_BYPRODUCTS ${PROTOBUF_PROTOC_EXECUTABLE} ${protobuf_STATIC_LIBRARIES}
+      SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf
+      # SOURCE_SUBDIR cmake/ # Requires CMake 3.7, this will allow removal of CONFIGURE_COMMAND
+      # CONFIGURE_COMMAND resets some settings made in CMAKE_CACHE_ARGS and the generator used
+      CONFIGURE_COMMAND ${CMAKE_COMMAND} cmake/
+          -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=${tensorflow_ENABLE_POSITION_INDEPENDENT_CODE}
+          -DCMAKE_BUILD_TYPE:STRING=Release
+          -DCMAKE_VERBOSE_MAKEFILE:BOOL=OFF
+          -Dprotobuf_BUILD_TESTS:BOOL=OFF
+          -DZLIB_ROOT=${ZLIB_INSTALL}
+          ${PROTOBUF_ADDITIONAL_CMAKE_OPTIONS}
+      INSTALL_COMMAND ""
+      CMAKE_CACHE_ARGS
+          -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=${tensorflow_ENABLE_POSITION_INDEPENDENT_CODE}
+          -DCMAKE_BUILD_TYPE:STRING=Release
+          -DCMAKE_VERBOSE_MAKEFILE:BOOL=OFF
+          -Dprotobuf_BUILD_TESTS:BOOL=OFF
+          -Dprotobuf_MSVC_STATIC_RUNTIME:BOOL=OFF
+          -DZLIB_ROOT:STRING=${ZLIB_INSTALL}
+  )
+endif (systemlib_PROTOBUF)