pw_protobuf_compiler: Fix CMake proto deps

- Properly handle deps between pw_proto_library targets in CMake.
- Rename the .generate targets to ._generate since they should not be
  depended on directly.

Change-Id: Ib9b8e3a80435b863b505cafe081e480602c47da0
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/40680
Pigweed-Auto-Submit: Wyatt Hepler <hepler@google.com>
Reviewed-by: Keir Mierle <keir@google.com>
Reviewed-by: Rob Oliver <rgoliver@google.com>
Commit-Queue: Wyatt Hepler <hepler@google.com>
diff --git a/pw_protobuf/CMakeLists.txt b/pw_protobuf/CMakeLists.txt
index 8d67047..6d821b5 100644
--- a/pw_protobuf/CMakeLists.txt
+++ b/pw_protobuf/CMakeLists.txt
@@ -68,6 +68,11 @@
     pw_protobuf
 )
 
+pw_proto_library(pw_protobuf.common_protos
+  SOURCES
+    pw_protobuf_protos/common.proto
+)
+
 pw_proto_library(pw_protobuf.codegen_test_protos
   SOURCES
     pw_protobuf_test_protos/full_test.proto
@@ -76,4 +81,6 @@
     pw_protobuf_test_protos/non_pw_package.proto
     pw_protobuf_test_protos/proto2.proto
     pw_protobuf_test_protos/repeated.proto
+  DEPS
+    pw_protobuf.common_protos
 )
diff --git a/pw_protobuf_compiler/proto.cmake b/pw_protobuf_compiler/proto.cmake
index 6d39633..d05b960 100644
--- a/pw_protobuf_compiler/proto.cmake
+++ b/pw_protobuf_compiler/proto.cmake
@@ -53,14 +53,15 @@
   list(TRANSFORM include_deps APPEND ._includes)
 
   add_library("${NAME}._includes" INTERFACE)
-  target_include_directories("${NAME}._includes" INTERFACE ".")
+  target_include_directories("${NAME}._includes" INTERFACE "${out_dir}/sources")
   target_link_libraries("${NAME}._includes" INTERFACE ${include_deps})
 
-  # Generate a file with all include paths needed by protoc.
+  # Generate a file with all include paths needed by protoc. Use the include
+  # directory paths and replace ; with \n.
   set(include_file "${out_dir}/include_paths.txt")
   file(GENERATE OUTPUT "${include_file}"
      CONTENT
-       "$<TARGET_PROPERTY:${NAME}._includes,INTERFACE_INCLUDE_DIRECTORIES>")
+       "$<JOIN:$<TARGET_PROPERTY:${NAME}._includes,INTERFACE_INCLUDE_DIRECTORIES>,\n>")
 
   if("${arg_STRIP_PREFIX}" STREQUAL "")
     set(arg_STRIP_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}")
@@ -87,10 +88,17 @@
     DEPENDS
       "$ENV{PW_ROOT}/pw_build/py/pw_build/mirror_tree.py"
       ${files_to_mirror}
-      ${arg_DEPS}
     OUTPUT
       ${sources} ${inputs}
   )
+  add_custom_target("${NAME}._sources" DEPENDS ${sources} ${inputs})
+
+  set(sources_deps "${arg_DEPS}")
+  list(TRANSFORM sources_deps APPEND ._sources)
+
+  if(sources_deps)
+    add_dependencies("${NAME}._sources" ${sources_deps})
+  endif()
 
   # Create a protobuf target for each supported protobuf library.
   _pw_pwpb_library(
@@ -164,7 +172,7 @@
 function(_pw_pwpb_library NAME SOURCES INPUTS DEPS INCLUDE_FILE OUT_DIR)
   list(TRANSFORM DEPS APPEND .pwpb)
 
-  _pw_generate_protos("${NAME}.generate.pwpb"
+  _pw_generate_protos("${NAME}._generate.pwpb"
       pwpb
       "$ENV{PW_ROOT}/pw_protobuf/py/pw_protobuf/plugin.py"
       ".pwpb.h"
@@ -179,14 +187,14 @@
   add_library("${NAME}.pwpb" INTERFACE)
   target_include_directories("${NAME}.pwpb" INTERFACE "${OUT_DIR}/pwpb")
   target_link_libraries("${NAME}.pwpb" INTERFACE pw_protobuf ${DEPS})
-  add_dependencies("${NAME}.pwpb" "${NAME}.generate.pwpb")
+  add_dependencies("${NAME}.pwpb" "${NAME}._generate.pwpb")
 endfunction(_pw_pwpb_library)
 
 # Internal function that creates a raw_rpc proto library.
 function(_pw_raw_rpc_library NAME SOURCES INPUTS DEPS INCLUDE_FILE OUT_DIR)
   list(TRANSFORM DEPS APPEND .raw_rpc)
 
-  _pw_generate_protos("${NAME}.generate.raw_rpc"
+  _pw_generate_protos("${NAME}._generate.raw_rpc"
       raw_rpc
       "$ENV{PW_ROOT}/pw_rpc/py/pw_rpc/plugin_raw.py"
       ".raw_rpc.pb.h"
@@ -206,7 +214,7 @@
       pw_rpc.server
       ${DEPS}
   )
-  add_dependencies("${NAME}.raw_rpc" "${NAME}.generate.raw_rpc")
+  add_dependencies("${NAME}.raw_rpc" "${NAME}._generate.raw_rpc")
 endfunction(_pw_raw_rpc_library)
 
 # Internal function that creates a nanopb proto library.
@@ -214,7 +222,7 @@
   list(TRANSFORM DEPS APPEND .nanopb)
 
   if("${dir_pw_third_party_nanopb}" STREQUAL "")
-    add_custom_target("${NAME}.generate.nanopb"
+    add_custom_target("${NAME}._generate.nanopb"
         cmake -E echo
             ERROR: Attempting to use pw_proto_library, but
             dir_pw_third_party_nanopb is not set. Set dir_pw_third_party_nanopb
@@ -228,7 +236,7 @@
     )
     set(generated_outputs $<TARGET_PROPERTY:pw_build.empty,SOURCES>)
   else()
-    _pw_generate_protos("${NAME}.generate.nanopb"
+    _pw_generate_protos("${NAME}._generate.nanopb"
         nanopb
         "${dir_pw_third_party_nanopb}/generator/protoc-gen-nanopb"
         ".pb.h;.pb.c"
@@ -244,7 +252,7 @@
   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")
+  add_dependencies("${NAME}.nanopb" "${NAME}._generate.nanopb")
 endfunction(_pw_nanopb_library)
 
 # Internal function that creates a nanopb_rpc library.
@@ -252,7 +260,7 @@
   # Determine the names of the output files.
   list(TRANSFORM DEPS APPEND .nanopb_rpc)
 
-  _pw_generate_protos("${NAME}.generate.nanopb_rpc"
+  _pw_generate_protos("${NAME}._generate.nanopb_rpc"
       nanopb_rpc
       "$ENV{PW_ROOT}/pw_rpc/py/pw_rpc/plugin_nanopb.py"
       ".rpc.pb.h"
@@ -276,5 +284,5 @@
       pw_rpc.server
       ${DEPS}
   )
-  add_dependencies("${NAME}.nanopb_rpc" "${NAME}.generate.nanopb_rpc")
+  add_dependencies("${NAME}.nanopb_rpc" "${NAME}._generate.nanopb_rpc")
 endfunction(_pw_nanopb_rpc_library)