Home | History | Annotate | Download | only in extra
      1 # This is an example script for use with CMake projects for locating and configuring
      2 # the nanopb library.
      3 #
      4 # The following varialbes have to be set:
      5 #
      6 #   NANOPB_SRC_ROOT_FOLDER  - Path to nanopb source folder
      7 #
      8 # The following variables can be set and are optional:
      9 #
     10 #
     11 #   PROTOBUF_SRC_ROOT_FOLDER - When compiling with MSVC, if this cache variable is set
     12 #                              the protobuf-default VS project build locations
     13 #                              (vsprojects/Debug & vsprojects/Release) will be searched
     14 #                              for libraries and binaries.
     15 #
     16 #   NANOPB_IMPORT_DIRS       - List of additional directories to be searched for
     17 #                              imported .proto files.
     18 #
     19 #   NANOPB_GENERATE_CPP_APPEND_PATH - By default -I will be passed to protoc
     20 #                                     for each directory where a proto file is referenced.
     21 #                                     Set to FALSE if you want to disable this behaviour.
     22 #
     23 # Defines the following variables:
     24 #
     25 #   NANOPB_FOUND - Found the nanopb library (source&header files, generator tool, protoc compiler tool)
     26 #   NANOPB_INCLUDE_DIRS - Include directories for Google Protocol Buffers
     27 #
     28 # The following cache variables are also available to set or use:
     29 #   NANOPB_GENERATOR_EXECUTABLE - The nanopb generator
     30 #   PROTOBUF_PROTOC_EXECUTABLE - The protoc compiler
     31 #
     32 #  ====================================================================
     33 #
     34 # NANOPB_GENERATE_CPP (public function)
     35 #   SRCS = Variable to define with autogenerated
     36 #          source files
     37 #   HDRS = Variable to define with autogenerated
     38 #          header files
     39 #   ARGN = proto files
     40 #
     41 #  ====================================================================
     42 #  Example:
     43 #
     44 #   set(NANOPB_SRC_ROOT_FOLDER "/path/to/nanopb")
     45 #   set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${NANOPB_SRC_ROOT_FOLDER}/cmake)
     46 #   find_package( Nanopb REQUIRED )
     47 #   include_directories(${NANOPB_INCLUDE_DIRS})
     48 #
     49 #   NANOPB_GENERATE_CPP(PROTO_SRCS PROTO_HDRS foo.proto)
     50 #
     51 #   include_directories(${CMAKE_CURRENT_BINARY_DIR})
     52 #   add_executable(bar bar.cc ${PROTO_SRCS} ${PROTO_HDRS})
     53 #
     54 #  ====================================================================
     55 
     56 #=============================================================================
     57 # Copyright 2009 Kitware, Inc.
     58 # Copyright 2009-2011 Philip Lowman <philip (a] yhbt.com>
     59 # Copyright 2008 Esben Mose Hansen, Ange Optimization ApS
     60 #
     61 # Redistribution and use in source and binary forms, with or without
     62 # modification, are permitted provided that the following conditions
     63 # are met:
     64 #
     65 # * Redistributions of source code must retain the above copyright
     66 #   notice, this list of conditions and the following disclaimer.
     67 #
     68 # * Redistributions in binary form must reproduce the above copyright
     69 #   notice, this list of conditions and the following disclaimer in the
     70 #   documentation and/or other materials provided with the distribution.
     71 #
     72 # * Neither the names of Kitware, Inc., the Insight Software Consortium,
     73 #   nor the names of their contributors may be used to endorse or promote
     74 #   products derived from this software without specific prior written
     75 #   permission.
     76 #
     77 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     78 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     79 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     80 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     81 # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     82 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     83 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     84 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     85 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     86 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     87 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     88 #
     89 #=============================================================================
     90 #
     91 # Changes
     92 # 2013.01.31 - Pavlo Ilin - used Modules/FindProtobuf.cmake from cmake 2.8.10 to
     93 #                           write FindNanopb.cmake
     94 #
     95 #=============================================================================
     96 
     97 
     98 function(NANOPB_GENERATE_CPP SRCS HDRS)
     99   if(NOT ARGN)
    100     return()
    101   endif()
    102 
    103   if(NANOPB_GENERATE_CPP_APPEND_PATH)
    104     # Create an include path for each file specified
    105     foreach(FIL ${ARGN})
    106       get_filename_component(ABS_FIL ${FIL} ABSOLUTE)
    107       get_filename_component(ABS_PATH ${ABS_FIL} PATH)
    108 
    109       list(FIND _nanobp_include_path ${ABS_PATH} _contains_already)
    110       if(${_contains_already} EQUAL -1)
    111           list(APPEND _nanobp_include_path -I ${ABS_PATH})
    112       endif()
    113     endforeach()
    114   else()
    115     set(_nanobp_include_path -I ${CMAKE_CURRENT_SOURCE_DIR})
    116   endif()
    117 
    118   if(DEFINED NANOPB_IMPORT_DIRS)
    119     foreach(DIR ${NANOPB_IMPORT_DIRS})
    120       get_filename_component(ABS_PATH ${DIR} ABSOLUTE)
    121       list(FIND _nanobp_include_path ${ABS_PATH} _contains_already)
    122       if(${_contains_already} EQUAL -1)
    123           list(APPEND _nanobp_include_path -I ${ABS_PATH})
    124       endif()
    125     endforeach()
    126   endif()
    127 
    128   set(${SRCS})
    129   set(${HDRS})
    130   get_filename_component(GENERATOR_PATH ${NANOPB_GENERATOR_EXECUTABLE} PATH)
    131 
    132   foreach(FIL ${ARGN})
    133     get_filename_component(ABS_FIL ${FIL} ABSOLUTE)
    134     get_filename_component(FIL_WE ${FIL} NAME_WE)
    135 
    136     list(APPEND ${SRCS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.c")
    137     list(APPEND ${HDRS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h")
    138 
    139     add_custom_command(
    140       OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb"
    141       COMMAND  ${PROTOBUF_PROTOC_EXECUTABLE}
    142       ARGS -I${GENERATOR_PATH} -I${CMAKE_CURRENT_BINARY_DIR} ${_nanobp_include_path} -o${FIL_WE}.pb ${ABS_FIL}
    143       DEPENDS ${ABS_FIL}
    144       COMMENT "Running C++ protocol buffer compiler on ${FIL}"
    145       VERBATIM )
    146 
    147     add_custom_command(
    148       OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.c"
    149              "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h"
    150       COMMAND python
    151       ARGS ${NANOPB_GENERATOR_EXECUTABLE} ${FIL_WE}.pb
    152       DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb"
    153       COMMENT "Running nanopb generator on ${FIL_WE}.pb"
    154       VERBATIM )
    155   endforeach()
    156 
    157   set_source_files_properties(${${SRCS}} ${${HDRS}} PROPERTIES GENERATED TRUE)
    158   set(${SRCS} ${${SRCS}} ${NANOPB_SRCS} PARENT_SCOPE)
    159   set(${HDRS} ${${HDRS}} ${NANOPB_HDRS} PARENT_SCOPE)
    160 
    161 endfunction()
    162 
    163 
    164 
    165 #
    166 # Main.
    167 #
    168 
    169 # By default have NANOPB_GENERATE_CPP macro pass -I to protoc
    170 # for each directory where a proto file is referenced.
    171 if(NOT DEFINED NANOPB_GENERATE_CPP_APPEND_PATH)
    172   set(NANOPB_GENERATE_CPP_APPEND_PATH TRUE)
    173 endif()
    174 
    175 # Find the include directory
    176 find_path(NANOPB_INCLUDE_DIRS
    177     pb.h
    178     PATHS ${NANOPB_SRC_ROOT_FOLDER}
    179 )
    180 mark_as_advanced(NANOPB_INCLUDE_DIRS)
    181 
    182 # Find nanopb source files
    183 set(NANOPB_SRCS)
    184 set(NANOPB_HDRS)
    185 list(APPEND _nanopb_srcs pb_decode.c pb_encode.c)
    186 list(APPEND _nanopb_hdrs pb_decode.h pb_encode.h pb.h)
    187 
    188 foreach(FIL ${_nanopb_srcs})
    189   find_file(${FIL}__nano_pb_file NAMES ${FIL} PATHS ${NANOPB_SRC_ROOT_FOLDER} ${NANOPB_INCLUDE_DIRS})
    190   list(APPEND NANOPB_SRCS "${${FIL}__nano_pb_file}")
    191   mark_as_advanced(${FIL}__nano_pb_file)
    192 endforeach()
    193 
    194 foreach(FIL ${_nanopb_hdrs})
    195   find_file(${FIL}__nano_pb_file NAMES ${FIL} PATHS ${NANOPB_INCLUDE_DIRS})
    196   mark_as_advanced(${FIL}__nano_pb_file)
    197   list(APPEND NANOPB_HDRS "${${FIL}__nano_pb_file}")
    198 endforeach()
    199 
    200 # Find the protoc Executable
    201 find_program(PROTOBUF_PROTOC_EXECUTABLE
    202     NAMES protoc
    203     DOC "The Google Protocol Buffers Compiler"
    204     PATHS
    205     ${PROTOBUF_SRC_ROOT_FOLDER}/vsprojects/Release
    206     ${PROTOBUF_SRC_ROOT_FOLDER}/vsprojects/Debug
    207 )
    208 mark_as_advanced(PROTOBUF_PROTOC_EXECUTABLE)
    209 
    210 # Find nanopb generator
    211 find_file(NANOPB_GENERATOR_EXECUTABLE
    212     NAMES nanopb_generator.py
    213     DOC "nanopb generator"
    214     PATHS
    215     ${NANOPB_SRC_ROOT_FOLDER}/generator
    216 )
    217 mark_as_advanced(NANOPB_GENERATOR_EXECUTABLE)
    218 
    219 include(FindPackageHandleStandardArgs)
    220 FIND_PACKAGE_HANDLE_STANDARD_ARGS(NANOPB DEFAULT_MSG
    221   NANOPB_INCLUDE_DIRS
    222   NANOPB_SRCS NANOPB_HDRS
    223   NANOPB_GENERATOR_EXECUTABLE
    224   PROTOBUF_PROTOC_EXECUTABLE
    225   )
    226