Home | History | Annotate | Download | only in nanopb-c
      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