From 3722deff12ec2e79c479ceae3a829752f92bb710 Mon Sep 17 00:00:00 2001 From: Gil Date: Tue, 26 Jun 2018 15:05:28 -0700 Subject: Install protobuf during CMake build (#1460) * Install protobuf * Use the built-in FindProtobuf.cmake * Add additional build configuration flags * Preserve generator configuration in the protobuf sub-build Without this, the build fails on Win64 because the default configuration builds a Win32 libprotobuf and the Win64 build rejects it. * Wire the installed protobuf into the gRPC build. * Install nanopb --- cmake/external/protobuf.cmake | 93 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 81 insertions(+), 12 deletions(-) (limited to 'cmake/external/protobuf.cmake') diff --git a/cmake/external/protobuf.cmake b/cmake/external/protobuf.cmake index 21cfac3..66d1426 100644 --- a/cmake/external/protobuf.cmake +++ b/cmake/external/protobuf.cmake @@ -14,28 +14,97 @@ include(ExternalProject) +# Protubuf has CMake support, but includes it in a `cmake` subdirectory, which +# does not work with CMake's ExternalProject by default. CMake 3.7 added +# SOURCE_SUBDIR as a means of supporting this but that's too new to require +# yet. + +# Compose CMAKE_ARGS +set( + cmake_args + -DCMAKE_INSTALL_PREFIX:PATH= + -DBUILD_SHARED_LIBS:BOOL=OFF + -Dprotobuf_BUILD_TESTS:BOOL=OFF + -Dprotobuf_WITH_ZLIB:BOOL=OFF + -Dprotobuf_MSVC_STATIC_RUNTIME:BOOL=ON +) + +# For single-configuration generators, pass CONFIG at configure time +if(NOT CMAKE_CONFIGURATION_TYPES) + list(APPEND cmake_args -DCMAKE_BUILD_TYPE=$) +endif() + + +if(CMAKE_VERSION VERSION_LESS "3.7") + # Manually compose the commands required to invoke CMake in the external + # project. + # + # Compose CONFIGURE_COMMAND so as to preserve the outer CMake's generator + # configuration in the sub-build. Without this the builds can invoke + # different compilers or disagree about word size or other fundamental + # parameters making the output of the sub-build useless. This is based on + # _ep_extract_configure_command in ExternalProject.cmake. + set(configure "${CMAKE_COMMAND}") + + if(CMAKE_EXTRA_GENERATOR) + list(APPEND configure "-G${CMAKE_EXTRA_GENERATOR} - ${CMAKE_GENERATOR}") + else() + list(APPEND configure "-G${CMAKE_GENERATOR}") + endif() + + if(CMAKE_GENERATOR_PLATFORM) + list(APPEND configure "-A${CMAKE_GENERATOR_PLATFORM}") + endif() + + if(CMAKE_GENERATOR_TOOLSET) + list(APPEND configure "-T${CMAKE_GENERATOR_TOOLSET}") + endif() + + list( + APPEND configure + ${cmake_args} + "${PROJECT_BINARY_DIR}/external/protobuf/src/protobuf/cmake" + ) + + # Compose BUILD_COMMAND and INSTALL_COMMAND + set(build "${CMAKE_COMMAND}" --build .) + + # For multi-configuration generators, pass CONFIG at build time. + if(CMAKE_CONFIGURATION_TYPES) + list(APPEND build --config $) + endif() + + set(install ${build} --target install) + + set( + commands + CONFIGURE_COMMAND ${configure} + BUILD_COMMAND ${build} + INSTALL_COMMAND ${install} + ) + +else() + # CMake 3.7 and above support this directly. + set( + commands + CMAKE_ARGS ${cmake_args} + SOURCE_SUBDIR cmake + ) +endif() + ExternalProject_Add( protobuf DOWNLOAD_DIR ${FIREBASE_DOWNLOAD_DIR} - DOWNLOAD_NAME protobuf-v3.5.11.tar.gz + DOWNLOAD_NAME protobuf-v3.5.1.1.tar.gz URL https://github.com/google/protobuf/archive/v3.5.1.1.tar.gz URL_HASH SHA256=56b5d9e1ab2bf4f5736c4cfba9f4981fbc6976246721e7ded5602fbaee6d6869 PREFIX ${PROJECT_BINARY_DIR}/external/protobuf + INSTALL_DIR ${FIREBASE_INSTALL_DIR} - # protobuf ships CMake files but not at the root of the repo, which confuses - # CMake by default. Unfortunately when you override CONFIGURE_COMMAND like - # this, CMake no longer automatically plumbs in CMAKE_ARGS and friends so - # those need to be manually passed in this command line. - CONFIGURE_COMMAND - ${CMAKE_COMMAND} - -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} - -DCMAKE_INSTALL_PREFIX:PATH=${FIREBASE_INSTALL_DIR} - -Dprotobuf_BUILD_TESTS=OFF - ${PROJECT_BINARY_DIR}/external/protobuf/src/protobuf/cmake + ${commands} UPDATE_COMMAND "" TEST_COMMAND "" - INSTALL_COMMAND "" ) -- cgit v1.2.3