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