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