xref: /aosp_15_r20/external/nanopb-c/extra/FindNanopb.cmake (revision c8d645cafcee3f91213d30caa0fe303887010b9b)
1*c8d645caSAndroid Build Coastguard Worker# This is an example script for use with CMake projects for locating and configuring
2*c8d645caSAndroid Build Coastguard Worker# the nanopb library.
3*c8d645caSAndroid Build Coastguard Worker#
4*c8d645caSAndroid Build Coastguard Worker# The following variables can be set and are optional:
5*c8d645caSAndroid Build Coastguard Worker#
6*c8d645caSAndroid Build Coastguard Worker#
7*c8d645caSAndroid Build Coastguard Worker#   PROTOBUF_SRC_ROOT_FOLDER - When compiling with MSVC, if this cache variable is set
8*c8d645caSAndroid Build Coastguard Worker#                              the protobuf-default VS project build locations
9*c8d645caSAndroid Build Coastguard Worker#                              (vsprojects/Debug & vsprojects/Release) will be searched
10*c8d645caSAndroid Build Coastguard Worker#                              for libraries and binaries.
11*c8d645caSAndroid Build Coastguard Worker#
12*c8d645caSAndroid Build Coastguard Worker#   NANOPB_IMPORT_DIRS       - List of additional directories to be searched for
13*c8d645caSAndroid Build Coastguard Worker#                              imported .proto files.
14*c8d645caSAndroid Build Coastguard Worker#
15*c8d645caSAndroid Build Coastguard Worker#   NANOPB_OPTIONS           - List of options passed to nanopb.
16*c8d645caSAndroid Build Coastguard Worker#
17*c8d645caSAndroid Build Coastguard Worker#   NANOPB_DEPENDS           - List of files to be used as dependencies
18*c8d645caSAndroid Build Coastguard Worker#                              for the generated source and header files. These
19*c8d645caSAndroid Build Coastguard Worker#                              files are not directly passed as options to
20*c8d645caSAndroid Build Coastguard Worker#                              nanopb but rather their directories.
21*c8d645caSAndroid Build Coastguard Worker#
22*c8d645caSAndroid Build Coastguard Worker#   NANOPB_GENERATE_CPP_APPEND_PATH - By default -I will be passed to protoc
23*c8d645caSAndroid Build Coastguard Worker#                                     for each directory where a proto file is referenced.
24*c8d645caSAndroid Build Coastguard Worker#                                     Set to FALSE if you want to disable this behaviour.
25*c8d645caSAndroid Build Coastguard Worker#
26*c8d645caSAndroid Build Coastguard Worker# Defines the following variables:
27*c8d645caSAndroid Build Coastguard Worker#
28*c8d645caSAndroid Build Coastguard Worker#   NANOPB_FOUND - Found the nanopb library (source&header files, generator tool, protoc compiler tool)
29*c8d645caSAndroid Build Coastguard Worker#   NANOPB_INCLUDE_DIRS - Include directories for Google Protocol Buffers
30*c8d645caSAndroid Build Coastguard Worker#
31*c8d645caSAndroid Build Coastguard Worker# The following cache variables are also available to set or use:
32*c8d645caSAndroid Build Coastguard Worker#   PROTOBUF_PROTOC_EXECUTABLE - The protoc compiler
33*c8d645caSAndroid Build Coastguard Worker#   NANOPB_GENERATOR_SOURCE_DIR - The nanopb generator source
34*c8d645caSAndroid Build Coastguard Worker#
35*c8d645caSAndroid Build Coastguard Worker#  ====================================================================
36*c8d645caSAndroid Build Coastguard Worker#
37*c8d645caSAndroid Build Coastguard Worker# NANOPB_GENERATE_CPP (public function)
38*c8d645caSAndroid Build Coastguard Worker# NANOPB_GENERATE_CPP(SRCS HDRS [RELPATH <root-path-of-proto-files>]
39*c8d645caSAndroid Build Coastguard Worker#                     <proto-files>...)
40*c8d645caSAndroid Build Coastguard Worker#   SRCS = Variable to define with autogenerated source files
41*c8d645caSAndroid Build Coastguard Worker#   HDRS = Variable to define with autogenerated header files
42*c8d645caSAndroid Build Coastguard Worker#   If you want to use relative paths in your import statements use the RELPATH
43*c8d645caSAndroid Build Coastguard Worker#   option. The argument to RELPATH should be the directory that all the
44*c8d645caSAndroid Build Coastguard Worker#   imports will be relative to.
45*c8d645caSAndroid Build Coastguard Worker#   When RELPATH is not specified then all proto files can be imported without
46*c8d645caSAndroid Build Coastguard Worker#   a path.
47*c8d645caSAndroid Build Coastguard Worker#
48*c8d645caSAndroid Build Coastguard Worker#
49*c8d645caSAndroid Build Coastguard Worker#  ====================================================================
50*c8d645caSAndroid Build Coastguard Worker#  Example:
51*c8d645caSAndroid Build Coastguard Worker#
52*c8d645caSAndroid Build Coastguard Worker#   set(NANOPB_SRC_ROOT_FOLDER "/path/to/nanopb")
53*c8d645caSAndroid Build Coastguard Worker#   set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${NANOPB_SRC_ROOT_FOLDER}/extra)
54*c8d645caSAndroid Build Coastguard Worker#   find_package( Nanopb REQUIRED )
55*c8d645caSAndroid Build Coastguard Worker#   include_directories(${NANOPB_INCLUDE_DIRS})
56*c8d645caSAndroid Build Coastguard Worker#
57*c8d645caSAndroid Build Coastguard Worker#   NANOPB_GENERATE_CPP(PROTO_SRCS PROTO_HDRS foo.proto)
58*c8d645caSAndroid Build Coastguard Worker#
59*c8d645caSAndroid Build Coastguard Worker#   include_directories(${CMAKE_CURRENT_BINARY_DIR})
60*c8d645caSAndroid Build Coastguard Worker#   add_executable(bar bar.cc ${PROTO_SRCS} ${PROTO_HDRS})
61*c8d645caSAndroid Build Coastguard Worker#
62*c8d645caSAndroid Build Coastguard Worker#  Example with RELPATH:
63*c8d645caSAndroid Build Coastguard Worker#   Assume we have a layout like:
64*c8d645caSAndroid Build Coastguard Worker#    .../CMakeLists.txt
65*c8d645caSAndroid Build Coastguard Worker#    .../bar.cc
66*c8d645caSAndroid Build Coastguard Worker#    .../proto/
67*c8d645caSAndroid Build Coastguard Worker#    .../proto/foo.proto  (Which contains: import "sub/bar.proto"; )
68*c8d645caSAndroid Build Coastguard Worker#    .../proto/sub/bar.proto
69*c8d645caSAndroid Build Coastguard Worker#   Everything would be the same as the previous example, but the call to
70*c8d645caSAndroid Build Coastguard Worker#   NANOPB_GENERATE_CPP would change to:
71*c8d645caSAndroid Build Coastguard Worker#
72*c8d645caSAndroid Build Coastguard Worker#   NANOPB_GENERATE_CPP(PROTO_SRCS PROTO_HDRS RELPATH proto
73*c8d645caSAndroid Build Coastguard Worker#                       proto/foo.proto proto/sub/bar.proto)
74*c8d645caSAndroid Build Coastguard Worker#
75*c8d645caSAndroid Build Coastguard Worker#  ====================================================================
76*c8d645caSAndroid Build Coastguard Worker
77*c8d645caSAndroid Build Coastguard Worker#=============================================================================
78*c8d645caSAndroid Build Coastguard Worker# Copyright 2009 Kitware, Inc.
79*c8d645caSAndroid Build Coastguard Worker# Copyright 2009-2011 Philip Lowman <[email protected]>
80*c8d645caSAndroid Build Coastguard Worker# Copyright 2008 Esben Mose Hansen, Ange Optimization ApS
81*c8d645caSAndroid Build Coastguard Worker#
82*c8d645caSAndroid Build Coastguard Worker# Redistribution and use in source and binary forms, with or without
83*c8d645caSAndroid Build Coastguard Worker# modification, are permitted provided that the following conditions
84*c8d645caSAndroid Build Coastguard Worker# are met:
85*c8d645caSAndroid Build Coastguard Worker#
86*c8d645caSAndroid Build Coastguard Worker# * Redistributions of source code must retain the above copyright
87*c8d645caSAndroid Build Coastguard Worker#   notice, this list of conditions and the following disclaimer.
88*c8d645caSAndroid Build Coastguard Worker#
89*c8d645caSAndroid Build Coastguard Worker# * Redistributions in binary form must reproduce the above copyright
90*c8d645caSAndroid Build Coastguard Worker#   notice, this list of conditions and the following disclaimer in the
91*c8d645caSAndroid Build Coastguard Worker#   documentation and/or other materials provided with the distribution.
92*c8d645caSAndroid Build Coastguard Worker#
93*c8d645caSAndroid Build Coastguard Worker# * Neither the names of Kitware, Inc., the Insight Software Consortium,
94*c8d645caSAndroid Build Coastguard Worker#   nor the names of their contributors may be used to endorse or promote
95*c8d645caSAndroid Build Coastguard Worker#   products derived from this software without specific prior written
96*c8d645caSAndroid Build Coastguard Worker#   permission.
97*c8d645caSAndroid Build Coastguard Worker#
98*c8d645caSAndroid Build Coastguard Worker# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
99*c8d645caSAndroid Build Coastguard Worker# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
100*c8d645caSAndroid Build Coastguard Worker# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
101*c8d645caSAndroid Build Coastguard Worker# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
102*c8d645caSAndroid Build Coastguard Worker# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
103*c8d645caSAndroid Build Coastguard Worker# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
104*c8d645caSAndroid Build Coastguard Worker# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
105*c8d645caSAndroid Build Coastguard Worker# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
106*c8d645caSAndroid Build Coastguard Worker# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
107*c8d645caSAndroid Build Coastguard Worker# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
108*c8d645caSAndroid Build Coastguard Worker# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
109*c8d645caSAndroid Build Coastguard Worker#
110*c8d645caSAndroid Build Coastguard Worker#=============================================================================
111*c8d645caSAndroid Build Coastguard Worker#
112*c8d645caSAndroid Build Coastguard Worker# Changes
113*c8d645caSAndroid Build Coastguard Worker# 2013.01.31 - Pavlo Ilin - used Modules/FindProtobuf.cmake from cmake 2.8.10 to
114*c8d645caSAndroid Build Coastguard Worker#                           write FindNanopb.cmake
115*c8d645caSAndroid Build Coastguard Worker#
116*c8d645caSAndroid Build Coastguard Worker#=============================================================================
117*c8d645caSAndroid Build Coastguard Worker
118*c8d645caSAndroid Build Coastguard Worker
119*c8d645caSAndroid Build Coastguard Workerfunction(NANOPB_GENERATE_CPP SRCS HDRS)
120*c8d645caSAndroid Build Coastguard Worker  cmake_parse_arguments(NANOPB_GENERATE_CPP "" "RELPATH" "" ${ARGN})
121*c8d645caSAndroid Build Coastguard Worker  if(NOT NANOPB_GENERATE_CPP_UNPARSED_ARGUMENTS)
122*c8d645caSAndroid Build Coastguard Worker    return()
123*c8d645caSAndroid Build Coastguard Worker  endif()
124*c8d645caSAndroid Build Coastguard Worker
125*c8d645caSAndroid Build Coastguard Worker  if(NANOPB_GENERATE_CPP_APPEND_PATH)
126*c8d645caSAndroid Build Coastguard Worker    # Create an include path for each file specified
127*c8d645caSAndroid Build Coastguard Worker    foreach(FIL ${NANOPB_GENERATE_CPP_UNPARSED_ARGUMENTS})
128*c8d645caSAndroid Build Coastguard Worker      get_filename_component(ABS_FIL ${FIL} ABSOLUTE)
129*c8d645caSAndroid Build Coastguard Worker      get_filename_component(ABS_PATH ${ABS_FIL} PATH)
130*c8d645caSAndroid Build Coastguard Worker      list(APPEND _nanopb_include_path "-I${ABS_PATH}")
131*c8d645caSAndroid Build Coastguard Worker    endforeach()
132*c8d645caSAndroid Build Coastguard Worker  else()
133*c8d645caSAndroid Build Coastguard Worker    set(_nanopb_include_path "-I${CMAKE_CURRENT_SOURCE_DIR}")
134*c8d645caSAndroid Build Coastguard Worker  endif()
135*c8d645caSAndroid Build Coastguard Worker
136*c8d645caSAndroid Build Coastguard Worker  if(NANOPB_GENERATE_CPP_RELPATH)
137*c8d645caSAndroid Build Coastguard Worker    list(APPEND _nanopb_include_path "-I${NANOPB_GENERATE_CPP_RELPATH}")
138*c8d645caSAndroid Build Coastguard Worker  endif()
139*c8d645caSAndroid Build Coastguard Worker
140*c8d645caSAndroid Build Coastguard Worker  if(DEFINED NANOPB_IMPORT_DIRS)
141*c8d645caSAndroid Build Coastguard Worker    foreach(DIR ${NANOPB_IMPORT_DIRS})
142*c8d645caSAndroid Build Coastguard Worker      get_filename_component(ABS_PATH ${DIR} ABSOLUTE)
143*c8d645caSAndroid Build Coastguard Worker      list(APPEND _nanopb_include_path "-I${ABS_PATH}")
144*c8d645caSAndroid Build Coastguard Worker    endforeach()
145*c8d645caSAndroid Build Coastguard Worker  endif()
146*c8d645caSAndroid Build Coastguard Worker
147*c8d645caSAndroid Build Coastguard Worker  list(REMOVE_DUPLICATES _nanopb_include_path)
148*c8d645caSAndroid Build Coastguard Worker
149*c8d645caSAndroid Build Coastguard Worker  set(GENERATOR_PATH ${CMAKE_BINARY_DIR}/nanopb/generator)
150*c8d645caSAndroid Build Coastguard Worker
151*c8d645caSAndroid Build Coastguard Worker  set(NANOPB_GENERATOR_EXECUTABLE ${GENERATOR_PATH}/nanopb_generator.py)
152*c8d645caSAndroid Build Coastguard Worker  if (WIN32)
153*c8d645caSAndroid Build Coastguard Worker    set(NANOPB_GENERATOR_PLUGIN ${GENERATOR_PATH}/protoc-gen-nanopb.bat)
154*c8d645caSAndroid Build Coastguard Worker  else()
155*c8d645caSAndroid Build Coastguard Worker    set(NANOPB_GENERATOR_PLUGIN ${GENERATOR_PATH}/protoc-gen-nanopb)
156*c8d645caSAndroid Build Coastguard Worker  endif()
157*c8d645caSAndroid Build Coastguard Worker
158*c8d645caSAndroid Build Coastguard Worker  set(GENERATOR_CORE_DIR ${GENERATOR_PATH}/proto)
159*c8d645caSAndroid Build Coastguard Worker  set(GENERATOR_CORE_SRC
160*c8d645caSAndroid Build Coastguard Worker      ${GENERATOR_CORE_DIR}/nanopb.proto
161*c8d645caSAndroid Build Coastguard Worker      ${GENERATOR_CORE_DIR}/plugin.proto)
162*c8d645caSAndroid Build Coastguard Worker
163*c8d645caSAndroid Build Coastguard Worker  # Treat the source diretory as immutable.
164*c8d645caSAndroid Build Coastguard Worker  #
165*c8d645caSAndroid Build Coastguard Worker  # Copy the generator directory to the build directory before
166*c8d645caSAndroid Build Coastguard Worker  # compiling python and proto files.  Fixes issues when using the
167*c8d645caSAndroid Build Coastguard Worker  # same build directory with different python/protobuf versions
168*c8d645caSAndroid Build Coastguard Worker  # as the binary build directory is discarded across builds.
169*c8d645caSAndroid Build Coastguard Worker  #
170*c8d645caSAndroid Build Coastguard Worker  add_custom_command(
171*c8d645caSAndroid Build Coastguard Worker      OUTPUT ${NANOPB_GENERATOR_EXECUTABLE} ${GENERATOR_CORE_SRC}
172*c8d645caSAndroid Build Coastguard Worker      COMMAND ${CMAKE_COMMAND} -E copy_directory
173*c8d645caSAndroid Build Coastguard Worker      ARGS ${NANOPB_GENERATOR_SOURCE_DIR} ${GENERATOR_PATH}
174*c8d645caSAndroid Build Coastguard Worker      VERBATIM)
175*c8d645caSAndroid Build Coastguard Worker
176*c8d645caSAndroid Build Coastguard Worker  set(GENERATOR_CORE_PYTHON_SRC)
177*c8d645caSAndroid Build Coastguard Worker  foreach(FIL ${GENERATOR_CORE_SRC})
178*c8d645caSAndroid Build Coastguard Worker      get_filename_component(ABS_FIL ${FIL} ABSOLUTE)
179*c8d645caSAndroid Build Coastguard Worker      get_filename_component(FIL_WE ${FIL} NAME_WE)
180*c8d645caSAndroid Build Coastguard Worker
181*c8d645caSAndroid Build Coastguard Worker      set(output "${GENERATOR_CORE_DIR}/${FIL_WE}_pb2.py")
182*c8d645caSAndroid Build Coastguard Worker      set(GENERATOR_CORE_PYTHON_SRC ${GENERATOR_CORE_PYTHON_SRC} ${output})
183*c8d645caSAndroid Build Coastguard Worker      add_custom_command(
184*c8d645caSAndroid Build Coastguard Worker        OUTPUT ${output}
185*c8d645caSAndroid Build Coastguard Worker        COMMAND ${PROTOBUF_PROTOC_EXECUTABLE}
186*c8d645caSAndroid Build Coastguard Worker        ARGS -I${GENERATOR_PATH}/proto
187*c8d645caSAndroid Build Coastguard Worker          --python_out=${GENERATOR_CORE_DIR} ${ABS_FIL}
188*c8d645caSAndroid Build Coastguard Worker        DEPENDS ${ABS_FIL}
189*c8d645caSAndroid Build Coastguard Worker        VERBATIM)
190*c8d645caSAndroid Build Coastguard Worker  endforeach()
191*c8d645caSAndroid Build Coastguard Worker
192*c8d645caSAndroid Build Coastguard Worker  if(NANOPB_GENERATE_CPP_RELPATH)
193*c8d645caSAndroid Build Coastguard Worker      get_filename_component(ABS_ROOT ${NANOPB_GENERATE_CPP_RELPATH} ABSOLUTE)
194*c8d645caSAndroid Build Coastguard Worker  endif()
195*c8d645caSAndroid Build Coastguard Worker  foreach(FIL ${NANOPB_GENERATE_CPP_UNPARSED_ARGUMENTS})
196*c8d645caSAndroid Build Coastguard Worker    get_filename_component(ABS_FIL ${FIL} ABSOLUTE)
197*c8d645caSAndroid Build Coastguard Worker    get_filename_component(FIL_WE ${FIL} NAME_WE)
198*c8d645caSAndroid Build Coastguard Worker    get_filename_component(FIL_DIR ${FIL} PATH)
199*c8d645caSAndroid Build Coastguard Worker    set(FIL_PATH_REL)
200*c8d645caSAndroid Build Coastguard Worker    if(ABS_ROOT)
201*c8d645caSAndroid Build Coastguard Worker      # Check that the file is under the given "RELPATH"
202*c8d645caSAndroid Build Coastguard Worker      string(FIND ${ABS_FIL} ${ABS_ROOT} LOC)
203*c8d645caSAndroid Build Coastguard Worker      if (${LOC} EQUAL 0)
204*c8d645caSAndroid Build Coastguard Worker        string(REPLACE "${ABS_ROOT}/" "" FIL_REL ${ABS_FIL})
205*c8d645caSAndroid Build Coastguard Worker        get_filename_component(FIL_PATH_REL ${FIL_REL} PATH)
206*c8d645caSAndroid Build Coastguard Worker        file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${FIL_PATH_REL})
207*c8d645caSAndroid Build Coastguard Worker      endif()
208*c8d645caSAndroid Build Coastguard Worker    endif()
209*c8d645caSAndroid Build Coastguard Worker    if(NOT FIL_PATH_REL)
210*c8d645caSAndroid Build Coastguard Worker      set(FIL_PATH_REL ".")
211*c8d645caSAndroid Build Coastguard Worker    endif()
212*c8d645caSAndroid Build Coastguard Worker
213*c8d645caSAndroid Build Coastguard Worker    list(APPEND ${SRCS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_PATH_REL}/${FIL_WE}.pb.c")
214*c8d645caSAndroid Build Coastguard Worker    list(APPEND ${HDRS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_PATH_REL}/${FIL_WE}.pb.h")
215*c8d645caSAndroid Build Coastguard Worker
216*c8d645caSAndroid Build Coastguard Worker    set(NANOPB_PLUGIN_OPTIONS)
217*c8d645caSAndroid Build Coastguard Worker    set(NANOPB_OPTIONS_DIRS)
218*c8d645caSAndroid Build Coastguard Worker
219*c8d645caSAndroid Build Coastguard Worker    # If there an options file in the same working directory, set it as a dependency
220*c8d645caSAndroid Build Coastguard Worker    set(NANOPB_OPTIONS_FILE ${FIL_DIR}/${FIL_WE}.options)
221*c8d645caSAndroid Build Coastguard Worker    if(EXISTS ${NANOPB_OPTIONS_FILE})
222*c8d645caSAndroid Build Coastguard Worker        # Get directory as lookups for dependency options fail if an options
223*c8d645caSAndroid Build Coastguard Worker        # file is used. The options is still set as a dependency of the
224*c8d645caSAndroid Build Coastguard Worker        # generated source and header.
225*c8d645caSAndroid Build Coastguard Worker        get_filename_component(options_dir ${NANOPB_OPTIONS_FILE} DIRECTORY)
226*c8d645caSAndroid Build Coastguard Worker        list(APPEND NANOPB_OPTIONS_DIRS ${options_dir})
227*c8d645caSAndroid Build Coastguard Worker    else()
228*c8d645caSAndroid Build Coastguard Worker        set(NANOPB_OPTIONS_FILE)
229*c8d645caSAndroid Build Coastguard Worker    endif()
230*c8d645caSAndroid Build Coastguard Worker
231*c8d645caSAndroid Build Coastguard Worker    # If the dependencies are options files, we need to pass the directories
232*c8d645caSAndroid Build Coastguard Worker    # as arguments to nanopb
233*c8d645caSAndroid Build Coastguard Worker    foreach(depends_file ${NANOPB_DEPENDS})
234*c8d645caSAndroid Build Coastguard Worker        get_filename_component(ext ${depends_file} EXT)
235*c8d645caSAndroid Build Coastguard Worker        if(ext STREQUAL ".options")
236*c8d645caSAndroid Build Coastguard Worker            get_filename_component(depends_dir ${depends_file} DIRECTORY)
237*c8d645caSAndroid Build Coastguard Worker            list(APPEND NANOPB_OPTIONS_DIRS ${depends_dir})
238*c8d645caSAndroid Build Coastguard Worker        endif()
239*c8d645caSAndroid Build Coastguard Worker    endforeach()
240*c8d645caSAndroid Build Coastguard Worker
241*c8d645caSAndroid Build Coastguard Worker    if(NANOPB_OPTIONS_DIRS)
242*c8d645caSAndroid Build Coastguard Worker        list(REMOVE_DUPLICATES NANOPB_OPTIONS_DIRS)
243*c8d645caSAndroid Build Coastguard Worker    endif()
244*c8d645caSAndroid Build Coastguard Worker
245*c8d645caSAndroid Build Coastguard Worker    foreach(options_path ${NANOPB_OPTIONS_DIRS})
246*c8d645caSAndroid Build Coastguard Worker        set(NANOPB_PLUGIN_OPTIONS "${NANOPB_PLUGIN_OPTIONS} -I${options_path}")
247*c8d645caSAndroid Build Coastguard Worker    endforeach()
248*c8d645caSAndroid Build Coastguard Worker
249*c8d645caSAndroid Build Coastguard Worker    if(NANOPB_OPTIONS)
250*c8d645caSAndroid Build Coastguard Worker        set(NANOPB_PLUGIN_OPTIONS "${NANOPB_PLUGIN_OPTIONS} ${NANOPB_OPTIONS}")
251*c8d645caSAndroid Build Coastguard Worker    endif()
252*c8d645caSAndroid Build Coastguard Worker
253*c8d645caSAndroid Build Coastguard Worker    add_custom_command(
254*c8d645caSAndroid Build Coastguard Worker      OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${FIL_PATH_REL}/${FIL_WE}.pb.c"
255*c8d645caSAndroid Build Coastguard Worker             "${CMAKE_CURRENT_BINARY_DIR}/${FIL_PATH_REL}/${FIL_WE}.pb.h"
256*c8d645caSAndroid Build Coastguard Worker      COMMAND  ${PROTOBUF_PROTOC_EXECUTABLE}
257*c8d645caSAndroid Build Coastguard Worker      ARGS -I${GENERATOR_PATH} -I${GENERATOR_CORE_DIR}
258*c8d645caSAndroid Build Coastguard Worker           -I${CMAKE_CURRENT_BINARY_DIR} ${_nanopb_include_path}
259*c8d645caSAndroid Build Coastguard Worker           --plugin=protoc-gen-nanopb=${NANOPB_GENERATOR_PLUGIN}
260*c8d645caSAndroid Build Coastguard Worker           "--nanopb_out=${NANOPB_PLUGIN_OPTIONS}:${CMAKE_CURRENT_BINARY_DIR}" ${ABS_FIL}
261*c8d645caSAndroid Build Coastguard Worker      DEPENDS ${ABS_FIL} ${GENERATOR_CORE_PYTHON_SRC}
262*c8d645caSAndroid Build Coastguard Worker           ${NANOPB_OPTIONS_FILE} ${NANOPB_DEPENDS}
263*c8d645caSAndroid Build Coastguard Worker      COMMENT "Running C++ protocol buffer compiler using nanopb plugin on ${FIL}"
264*c8d645caSAndroid Build Coastguard Worker      VERBATIM )
265*c8d645caSAndroid Build Coastguard Worker
266*c8d645caSAndroid Build Coastguard Worker  endforeach()
267*c8d645caSAndroid Build Coastguard Worker
268*c8d645caSAndroid Build Coastguard Worker  set_source_files_properties(${${SRCS}} ${${HDRS}} PROPERTIES GENERATED TRUE)
269*c8d645caSAndroid Build Coastguard Worker  set(${SRCS} ${${SRCS}} ${NANOPB_SRCS} PARENT_SCOPE)
270*c8d645caSAndroid Build Coastguard Worker  set(${HDRS} ${${HDRS}} ${NANOPB_HDRS} PARENT_SCOPE)
271*c8d645caSAndroid Build Coastguard Worker
272*c8d645caSAndroid Build Coastguard Workerendfunction()
273*c8d645caSAndroid Build Coastguard Worker
274*c8d645caSAndroid Build Coastguard Worker
275*c8d645caSAndroid Build Coastguard Worker
276*c8d645caSAndroid Build Coastguard Worker#
277*c8d645caSAndroid Build Coastguard Worker# Main.
278*c8d645caSAndroid Build Coastguard Worker#
279*c8d645caSAndroid Build Coastguard Worker
280*c8d645caSAndroid Build Coastguard Worker# By default have NANOPB_GENERATE_CPP macro pass -I to protoc
281*c8d645caSAndroid Build Coastguard Worker# for each directory where a proto file is referenced.
282*c8d645caSAndroid Build Coastguard Workerif(NOT DEFINED NANOPB_GENERATE_CPP_APPEND_PATH)
283*c8d645caSAndroid Build Coastguard Worker  set(NANOPB_GENERATE_CPP_APPEND_PATH TRUE)
284*c8d645caSAndroid Build Coastguard Workerendif()
285*c8d645caSAndroid Build Coastguard Worker
286*c8d645caSAndroid Build Coastguard Worker# Make a really good guess regarding location of NANOPB_SRC_ROOT_FOLDER
287*c8d645caSAndroid Build Coastguard Workerif(NOT DEFINED NANOPB_SRC_ROOT_FOLDER)
288*c8d645caSAndroid Build Coastguard Worker  get_filename_component(NANOPB_SRC_ROOT_FOLDER
289*c8d645caSAndroid Build Coastguard Worker                         ${CMAKE_CURRENT_LIST_DIR}/.. ABSOLUTE)
290*c8d645caSAndroid Build Coastguard Workerendif()
291*c8d645caSAndroid Build Coastguard Worker
292*c8d645caSAndroid Build Coastguard Worker# Find the include directory
293*c8d645caSAndroid Build Coastguard Workerfind_path(NANOPB_INCLUDE_DIRS
294*c8d645caSAndroid Build Coastguard Worker    pb.h
295*c8d645caSAndroid Build Coastguard Worker    PATHS ${NANOPB_SRC_ROOT_FOLDER}
296*c8d645caSAndroid Build Coastguard Worker)
297*c8d645caSAndroid Build Coastguard Workermark_as_advanced(NANOPB_INCLUDE_DIRS)
298*c8d645caSAndroid Build Coastguard Worker
299*c8d645caSAndroid Build Coastguard Worker# Find nanopb source files
300*c8d645caSAndroid Build Coastguard Workerset(NANOPB_SRCS)
301*c8d645caSAndroid Build Coastguard Workerset(NANOPB_HDRS)
302*c8d645caSAndroid Build Coastguard Workerlist(APPEND _nanopb_srcs pb_decode.c pb_encode.c pb_common.c)
303*c8d645caSAndroid Build Coastguard Workerlist(APPEND _nanopb_hdrs pb_decode.h pb_encode.h pb_common.h pb.h)
304*c8d645caSAndroid Build Coastguard Worker
305*c8d645caSAndroid Build Coastguard Workerforeach(FIL ${_nanopb_srcs})
306*c8d645caSAndroid Build Coastguard Worker  find_file(${FIL}__nano_pb_file NAMES ${FIL} PATHS ${NANOPB_SRC_ROOT_FOLDER} ${NANOPB_INCLUDE_DIRS})
307*c8d645caSAndroid Build Coastguard Worker  list(APPEND NANOPB_SRCS "${${FIL}__nano_pb_file}")
308*c8d645caSAndroid Build Coastguard Worker  mark_as_advanced(${FIL}__nano_pb_file)
309*c8d645caSAndroid Build Coastguard Workerendforeach()
310*c8d645caSAndroid Build Coastguard Worker
311*c8d645caSAndroid Build Coastguard Workerforeach(FIL ${_nanopb_hdrs})
312*c8d645caSAndroid Build Coastguard Worker  find_file(${FIL}__nano_pb_file NAMES ${FIL} PATHS ${NANOPB_INCLUDE_DIRS})
313*c8d645caSAndroid Build Coastguard Worker  mark_as_advanced(${FIL}__nano_pb_file)
314*c8d645caSAndroid Build Coastguard Worker  list(APPEND NANOPB_HDRS "${${FIL}__nano_pb_file}")
315*c8d645caSAndroid Build Coastguard Workerendforeach()
316*c8d645caSAndroid Build Coastguard Worker
317*c8d645caSAndroid Build Coastguard Worker# Find the protoc Executable
318*c8d645caSAndroid Build Coastguard Workerfind_program(PROTOBUF_PROTOC_EXECUTABLE
319*c8d645caSAndroid Build Coastguard Worker    NAMES protoc
320*c8d645caSAndroid Build Coastguard Worker    DOC "The Google Protocol Buffers Compiler"
321*c8d645caSAndroid Build Coastguard Worker    PATHS
322*c8d645caSAndroid Build Coastguard Worker    ${PROTOBUF_SRC_ROOT_FOLDER}/vsprojects/Release
323*c8d645caSAndroid Build Coastguard Worker    ${PROTOBUF_SRC_ROOT_FOLDER}/vsprojects/Debug
324*c8d645caSAndroid Build Coastguard Worker)
325*c8d645caSAndroid Build Coastguard Workermark_as_advanced(PROTOBUF_PROTOC_EXECUTABLE)
326*c8d645caSAndroid Build Coastguard Worker
327*c8d645caSAndroid Build Coastguard Worker# Find nanopb generator source dir
328*c8d645caSAndroid Build Coastguard Workerfind_path(NANOPB_GENERATOR_SOURCE_DIR
329*c8d645caSAndroid Build Coastguard Worker    NAMES nanopb_generator.py
330*c8d645caSAndroid Build Coastguard Worker    DOC "nanopb generator source"
331*c8d645caSAndroid Build Coastguard Worker    PATHS
332*c8d645caSAndroid Build Coastguard Worker    ${NANOPB_SRC_ROOT_FOLDER}/generator
333*c8d645caSAndroid Build Coastguard Worker)
334*c8d645caSAndroid Build Coastguard Workermark_as_advanced(NANOPB_GENERATOR_SOURCE_DIR)
335*c8d645caSAndroid Build Coastguard Worker
336*c8d645caSAndroid Build Coastguard Workerfind_package(PythonInterp REQUIRED)
337*c8d645caSAndroid Build Coastguard Worker
338*c8d645caSAndroid Build Coastguard Workerinclude(FindPackageHandleStandardArgs)
339*c8d645caSAndroid Build Coastguard WorkerFIND_PACKAGE_HANDLE_STANDARD_ARGS(NANOPB DEFAULT_MSG
340*c8d645caSAndroid Build Coastguard Worker  NANOPB_INCLUDE_DIRS
341*c8d645caSAndroid Build Coastguard Worker  NANOPB_SRCS NANOPB_HDRS
342*c8d645caSAndroid Build Coastguard Worker  NANOPB_GENERATOR_SOURCE_DIR
343*c8d645caSAndroid Build Coastguard Worker  PROTOBUF_PROTOC_EXECUTABLE
344*c8d645caSAndroid Build Coastguard Worker  )
345