pw_protobuf_compiler: Handle deps on nanopb.proto
- Add a pw_proto_library for nanopb.proto to the CMake build.
- Skip recompiling nanopb.proto when running protoc for Nanopb.
- Add the pw_protobuf_compiler Nanopb test to CMake.
Change-Id: I3469f35524b18efd3d484b17609e9de0f160e73a
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/46961
Pigweed-Auto-Submit: Wyatt Hepler <hepler@google.com>
Reviewed-by: Alexei Frolov <frolv@google.com>
Commit-Queue: Wyatt Hepler <hepler@google.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 17ce39b..0b707ca 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -46,6 +46,7 @@
add_subdirectory(pw_minimal_cpp_stdlib EXCLUDE_FROM_ALL)
add_subdirectory(pw_polyfill EXCLUDE_FROM_ALL)
add_subdirectory(pw_protobuf EXCLUDE_FROM_ALL)
+add_subdirectory(pw_protobuf_compiler EXCLUDE_FROM_ALL)
add_subdirectory(pw_preprocessor EXCLUDE_FROM_ALL)
add_subdirectory(pw_random EXCLUDE_FROM_ALL)
add_subdirectory(pw_result EXCLUDE_FROM_ALL)
diff --git a/pw_protobuf_compiler/CMakeLists.txt b/pw_protobuf_compiler/CMakeLists.txt
new file mode 100644
index 0000000..4b5a3b6
--- /dev/null
+++ b/pw_protobuf_compiler/CMakeLists.txt
@@ -0,0 +1,34 @@
+# Copyright 2021 The Pigweed Authors
+#
+# 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
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations under
+# the License.
+
+include($ENV{PW_ROOT}/pw_build/pigweed.cmake)
+include($ENV{PW_ROOT}/pw_protobuf_compiler/proto.cmake)
+
+if(NOT "${dir_pw_third_party_nanopb}" STREQUAL "")
+ pw_proto_library(pw_protobuf_compiler.nanopb_test_protos
+ SOURCES
+ pw_protobuf_compiler_nanopb_protos/nanopb_test.proto
+ DEPS
+ pw_third_party.nanopb.proto
+ )
+
+ pw_add_test(pw_protobuf_compiler.nanopb_test
+ SOURCES
+ nanopb_test.cc
+ DEPS
+ pw_protobuf_compiler.nanopb_test_protos.nanopb
+ GROUPS
+ pw_protobuf_compiler
+ )
+endif()
diff --git a/pw_protobuf_compiler/proto.cmake b/pw_protobuf_compiler/proto.cmake
index b7a4643..b7a466b 100644
--- a/pw_protobuf_compiler/proto.cmake
+++ b/pw_protobuf_compiler/proto.cmake
@@ -33,7 +33,7 @@
# PREFIX - prefix add to the proto files
# STRIP_PREFIX - prefix to remove from the proto files
# INPUTS - files to include along with the .proto files (such as Nanopb
-# .options files
+# .options files)
#
function(pw_proto_library NAME)
cmake_parse_arguments(PARSE_ARGV 1 arg "" "STRIP_PREFIX;PREFIX"
@@ -236,28 +236,37 @@
)
set(generated_outputs $<TARGET_PROPERTY:pw_build.empty,SOURCES>)
else()
- _pw_generate_protos("${NAME}._generate.nanopb"
- nanopb
- "${dir_pw_third_party_nanopb}/generator/protoc-gen-nanopb"
- ".pb.h;.pb.c"
- "${INCLUDE_FILE}"
- "${OUT_DIR}"
- "${SOURCES}"
- "${INPUTS}"
- "${DEPS}"
- )
+ # When compiling with the Nanopb plugin, the nanopb.proto file is already
+ # compiled internally, so skip recompiling it with protoc.
+ if("${SOURCES}" MATCHES "nanopb\\.proto")
+ add_custom_target("${NAME}._generate.nanopb") # Nothing to do
+ add_library("${NAME}.nanopb" INTERFACE)
+ target_link_libraries("${NAME}.nanopb" INTERFACE pw_third_party.nanopb ${DEPS})
+ else()
+ _pw_generate_protos("${NAME}._generate.nanopb"
+ nanopb
+ "${dir_pw_third_party_nanopb}/generator/protoc-gen-nanopb"
+ ".pb.h;.pb.c"
+ "${INCLUDE_FILE}"
+ "${OUT_DIR}"
+ "${SOURCES}"
+ "${INPUTS}"
+ "${DEPS}"
+ )
+
+ # Create the library with the generated source files.
+ add_library("${NAME}.nanopb" EXCLUDE_FROM_ALL ${generated_outputs})
+ target_include_directories("${NAME}.nanopb" PUBLIC "${OUT_DIR}/nanopb")
+ target_link_libraries("${NAME}.nanopb" PUBLIC pw_third_party.nanopb ${DEPS})
+ endif()
+
+ add_dependencies("${NAME}.nanopb" "${NAME}._generate.nanopb")
# Ensure that nanopb_pb2.py is generated to avoid race conditions.
add_dependencies("${NAME}._generate.nanopb"
pw_third_party.nanopb.generate_proto
)
endif()
-
- # Create the library with the generated source files.
- add_library("${NAME}.nanopb" EXCLUDE_FROM_ALL ${generated_outputs})
- target_include_directories("${NAME}.nanopb" PUBLIC "${OUT_DIR}/nanopb")
- target_link_libraries("${NAME}.nanopb" PUBLIC pw_third_party.nanopb ${DEPS})
- add_dependencies("${NAME}.nanopb" "${NAME}._generate.nanopb")
endfunction(_pw_nanopb_library)
# Internal function that creates a nanopb_rpc library.
diff --git a/third_party/nanopb/CMakeLists.txt b/third_party/nanopb/CMakeLists.txt
index 3c2927b..5f2c9aa 100644
--- a/third_party/nanopb/CMakeLists.txt
+++ b/third_party/nanopb/CMakeLists.txt
@@ -12,6 +12,9 @@
# License for the specific language governing permissions and limitations under
# the License.
+include($ENV{PW_ROOT}/pw_build/pigweed.cmake)
+include($ENV{PW_ROOT}/pw_protobuf_compiler/proto.cmake)
+
set(dir_pw_third_party_nanopb "" CACHE PATH "Path to the Nanopb installation.")
option(pw_third_party_nanopb_ADD_SUBDIRECTORY
"Whether to add the dir_pw_third_party_nanopb subdirectory" OFF)
@@ -32,6 +35,13 @@
"${dir_pw_third_party_nanopb}"
)
+pw_proto_library(pw_third_party.nanopb.proto
+ SOURCES
+ "${dir_pw_third_party_nanopb}/generator/proto/nanopb.proto"
+ STRIP_PREFIX
+ "${dir_pw_third_party_nanopb}/generator/proto"
+)
+
# Generates nanopb_pb2.py, which is needed to compile protobufs with Nanopb.
add_custom_command(
COMMAND