1 cmake_minimum_required(VERSION 2.8.12) 2 3 project(nanopb C) 4 5 set(nanopb_VERSION_STRING nanopb-0.3.9.1) 6 7 string(REPLACE "nanopb-" "" nanopb_VERSION ${nanopb_VERSION_STRING}) 8 9 option(nanopb_BUILD_RUNTIME "Build the headers and libraries needed at runtime" ON) 10 option(nanopb_BUILD_GENERATOR "Build the protoc plugin for code generation" ON) 11 option(nanopb_MSVC_STATIC_RUNTIME "Link static runtime libraries" ON) 12 13 if(NOT DEFINED nanopb_PROTOC_PATH) 14 set(nanopb_PROTOC_PATH "protoc") 15 endif() 16 17 if(NOT DEFINED CMAKE_DEBUG_POSTFIX) 18 set(CMAKE_DEBUG_POSTFIX "d") 19 endif() 20 21 include(GNUInstallDirs) 22 23 if(MSVC AND nanopb_MSVC_STATIC_RUNTIME) 24 foreach(flag_var 25 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE 26 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO) 27 if(${flag_var} MATCHES "/MD") 28 string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") 29 endif(${flag_var} MATCHES "/MD") 30 endforeach(flag_var) 31 endif() 32 33 if(NOT DEFINED CMAKE_INSTALL_CMAKEDIR) 34 set(CMAKE_INSTALL_CMAKEDIR "lib/cmake/nanopb") 35 endif() 36 37 if(nanopb_BUILD_GENERATOR) 38 set(generator_protos nanopb plugin) 39 40 find_package(PythonInterp 2.7 REQUIRED) 41 execute_process( 42 COMMAND ${PYTHON_EXECUTABLE} -c 43 "from distutils import sysconfig; print(sysconfig.get_python_lib(prefix=''))" 44 OUTPUT_VARIABLE PYTHON_INSTDIR 45 OUTPUT_STRIP_TRAILING_WHITESPACE 46 ) 47 48 foreach(generator_proto IN LISTS generator_protos) 49 string(REGEX REPLACE "([^;]+)" "${PROJECT_SOURCE_DIR}/generator/proto/\\1.proto" generator_proto_file "${generator_proto}") 50 string(REGEX REPLACE "([^;]+)" "\\1_pb2.py" generator_proto_py_file "${generator_proto}") 51 add_custom_command( 52 OUTPUT ${generator_proto_py_file} 53 COMMAND ${nanopb_PROTOC_PATH} --python_out=${PROJECT_BINARY_DIR} -I${PROJECT_SOURCE_DIR}/generator/proto ${generator_proto_file} 54 DEPENDS ${generator_proto_file} 55 ) 56 add_custom_target("generate_${generator_proto_py_file}" ALL DEPENDS ${generator_proto_py_file}) 57 install( 58 FILES ${PROJECT_BINARY_DIR}/${generator_proto_py_file} 59 DESTINATION ${PYTHON_INSTDIR} 60 ) 61 endforeach() 62 endif() 63 64 if(nanopb_BUILD_RUNTIME) 65 add_library(protobuf-nanopb STATIC 66 pb.h 67 pb_common.h 68 pb_common.c 69 pb_encode.h 70 pb_encode.c 71 pb_decode.h 72 pb_decode.c) 73 74 target_include_directories(protobuf-nanopb INTERFACE 75 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> 76 ) 77 78 configure_file(extra/nanopb-config-version.cmake.in 79 nanopb-config-version.cmake @ONLY) 80 81 install(TARGETS protobuf-nanopb EXPORT nanopb-targets 82 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) 83 84 install(EXPORT nanopb-targets 85 DESTINATION ${CMAKE_INSTALL_CMAKEDIR} 86 NAMESPACE nanopb::) 87 88 install(FILES extra/nanopb-config.cmake 89 ${CMAKE_CURRENT_BINARY_DIR}/nanopb-config-version.cmake 90 DESTINATION ${CMAKE_INSTALL_CMAKEDIR}) 91 92 install(FILES pb.h pb_common.h pb_encode.h pb_decode.h 93 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) 94 endif() 95