aboutsummaryrefslogtreecommitdiffhomepage
path: root/cmake
diff options
context:
space:
mode:
authorGravatar Gil <mcg@google.com>2018-06-12 10:55:48 -0700
committerGravatar GitHub <noreply@github.com>2018-06-12 10:55:48 -0700
commit0db8ef7dbe6c8c191252d33090dbb88b98735148 (patch)
tree35ada9d92eddbe4b43e8850eb52f5855755f8895 /cmake
parent9e14b80e0716c2be71c6100cad7aa7c61ac46c6e (diff)
Fix protobuf/nanopb builds on Windows (#1392)
* Build protobuf with CMake for compatibility with Windows. Fixes b/74067357 * Update to nanopb 0.3.9.1 This release includes functional CMake support for building the protoc plugin. * Fix license * Build nanopb out-of-source This is possible now that the build is CMake-based. * Find protoc on windows * Define CMAKE_ARGS in a more straightforward way * Adjust libprotobuf locations to account for CMake build
Diffstat (limited to 'cmake')
-rw-r--r--cmake/FindNanopb.cmake2
-rw-r--r--cmake/FindProtobuf.cmake8
-rw-r--r--cmake/external/grpc.cmake22
-rw-r--r--cmake/external/nanopb.cmake40
-rw-r--r--cmake/external/protobuf.cmake14
5 files changed, 39 insertions, 47 deletions
diff --git a/cmake/FindNanopb.cmake b/cmake/FindNanopb.cmake
index 12a5570..b5d844d 100644
--- a/cmake/FindNanopb.cmake
+++ b/cmake/FindNanopb.cmake
@@ -24,7 +24,7 @@ find_path(
find_library(
NANOPB_LIBRARY
NAMES protobuf-nanopb protobuf-nanopbd
- HINTS ${BINARY_DIR}/src/nanopb
+ HINTS ${BINARY_DIR}/src/nanopb-build
)
find_package_handle_standard_args(
diff --git a/cmake/FindProtobuf.cmake b/cmake/FindProtobuf.cmake
index e9a1a81..60a2e34 100644
--- a/cmake/FindProtobuf.cmake
+++ b/cmake/FindProtobuf.cmake
@@ -23,14 +23,14 @@ find_path(
find_library(
PROTOBUF_LIBRARY
- NAMES libprotobuf.a
- HINTS ${BINARY_DIR}/src/protobuf-build/src/.libs/
+ NAMES protobuf protobufd
+ HINTS ${BINARY_DIR}/src/protobuf-build
)
find_library(
PROTOBUFLITE_LIBRARY
- NAMES libprotobuf-lite.a
- HINTS ${BINARY_DIR}/src/protobuf-build/src/.libs/
+ NAMES protobuf-lite protobuf-lited
+ HINTS ${BINARY_DIR}/src/protobuf-build
)
find_package_handle_standard_args(
diff --git a/cmake/external/grpc.cmake b/cmake/external/grpc.cmake
index d545087..d192e94 100644
--- a/cmake/external/grpc.cmake
+++ b/cmake/external/grpc.cmake
@@ -33,6 +33,17 @@ else()
-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
-DgRPC_BUILD_TESTS:BOOL=OFF
-DBUILD_SHARED_LIBS:BOOL=OFF
+
+ # TODO(rsgowman): We're currently building nanopb twice; once via grpc, and
+ # once via nanopb. The version from grpc is the one that actually ends up
+ # being used. We need to fix this such that either:
+ # a) we instruct grpc to use our nanopb
+ # b) we rely on grpc's nanopb instead of using our own.
+ # For now, we'll pass in the necessary nanopb cflags into grpc. (We require
+ # 16 bit fields. Without explicitly requesting this, nanopb uses 8 bit
+ # fields.)
+ -DCMAKE_C_FLAGS=-DPB_FIELD_16BIT
+ -DCMAKE_CXX_FLAGS=-DPB_FIELD_16BIT
)
# zlib can be built by grpc but we can avoid it on platforms that provide it
@@ -68,15 +79,8 @@ else()
PREFIX ${PROJECT_BINARY_DIR}/external/grpc
- # TODO(rsgowman): We're currently building nanopb twice; once via grpc, and
- # once via nanopb. The version from grpc is the one that actually ends up
- # being used. We need to fix this such that either:
- # a) we instruct grpc to use our nanopb
- # b) we rely on grpc's nanopb instead of using our own.
- # For now, we'll pass in the necessary nanopb cflags into grpc. (We require
- # 16 bit fields. Without explicitly requesting this, nanopb uses 8 bit
- # fields.)
- CMAKE_ARGS ${CMAKE_ARGS};-DCMAKE_C_FLAGS=-DPB_FIELD_16BIT;DCMAKE_CXX_FLAGS=-DPB_FIELD_16BIT
+ CMAKE_ARGS
+ ${CMAKE_ARGS}
BUILD_COMMAND
${CMAKE_COMMAND} --build . --target grpc
diff --git a/cmake/external/nanopb.cmake b/cmake/external/nanopb.cmake
index f68af0b..6ca47c0 100644
--- a/cmake/external/nanopb.cmake
+++ b/cmake/external/nanopb.cmake
@@ -1,4 +1,6 @@
-# Copyright 2018 Google # # Licensed under the Apache License, Version 2.0 (the "License");
+# Copyright 2018 Google
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
@@ -14,7 +16,7 @@ include(ExternalProject)
set(
NANOPB_PROTOC_BIN
- ${FIREBASE_INSTALL_DIR}/external/protobuf/src/protobuf-build/src/protoc
+ ${FIREBASE_INSTALL_DIR}/external/protobuf/src/protobuf-build/${CMAKE_CFG_INTDIR}/protoc
)
ExternalProject_Add(
@@ -23,42 +25,18 @@ ExternalProject_Add(
protobuf
DOWNLOAD_DIR ${PROJECT_BINARY_DIR}/downloads
- URL https://github.com/nanopb/nanopb/archive/nanopb-0.3.8.tar.gz
- URL_HASH SHA256=f192c7c7cc036be36babc303b7d2315d4f62e2fe4be28c172cfed4cfa0ed5f22
-
- BUILD_IN_SOURCE ON
+ URL https://github.com/nanopb/nanopb/archive/nanopb-0.3.9.1.tar.gz
+ URL_HASH SHA256=67460d0c0ad331ef4d5369ad337056d0cd2f900c94887628d287eb56c69324bc
PREFIX ${PROJECT_BINARY_DIR}/external/nanopb
- # Note for (not yet released) nanopb 0.4.0: nanopb will (likely) switch to
- # cmake for the protoc plugin. Set these additional cmake variables to use
- # it.
- # -Dnanopb_BUILD_GENERATOR:BOOL=ON
- # -Dnanopb_PROTOC_PATH:STRING=${FIREBASE_INSTALL_DIR}/external/protobuf/src/protobuf-build/src/protoc
CMAKE_ARGS
-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
-DBUILD_SHARED_LIBS:BOOL=OFF
-
- BUILD_COMMAND
- COMMAND
- ${CMAKE_COMMAND} --build .
- # NB: The following additional command is only necessary to regenerate the
- # nanopb proto files.
- COMMAND
- make -C <SOURCE_DIR>/generator/proto
-
- # nanopb relies on $PATH for the location of protoc. cmake makes it difficult
- # to adjust the path, so we'll just patch the build files with the exact
- # location of protoc.
- #
- # NB: cmake sometimes runs the patch command multiple times in the same src
- # dir, so we need to make sure this is idempotent. (eg 'make && make clean &&
- # make')
- PATCH_COMMAND
- grep ${NANOPB_PROTOC_BIN} ./generator/proto/Makefile
- || perl -i -pe s,protoc,${NANOPB_PROTOC_BIN},g
- ./CMakeLists.txt ./generator/proto/Makefile
+ -Dnanopb_BUILD_GENERATOR:BOOL=ON
+ -Dnanopb_PROTOC_PATH:STRING=${NANOPB_PROTOC_BIN}
UPDATE_COMMAND ""
+ TEST_COMMAND ""
INSTALL_COMMAND ""
)
diff --git a/cmake/external/protobuf.cmake b/cmake/external/protobuf.cmake
index e1fdcbb..acc5a96 100644
--- a/cmake/external/protobuf.cmake
+++ b/cmake/external/protobuf.cmake
@@ -24,8 +24,18 @@ ExternalProject_Add(
PREFIX ${PROJECT_BINARY_DIR}/external/protobuf
+ # 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
+
UPDATE_COMMAND ""
- CONFIGURE_COMMAND cd <SOURCE_DIR> && ./autogen.sh
- COMMAND <SOURCE_DIR>/configure --prefix=${PREFIX}
+ TEST_COMMAND ""
INSTALL_COMMAND ""
)