| cmake_minimum_required(VERSION 3.0.0) |
| |
| set(VERSION_MAJOR |
| 1 |
| CACHE STRING "Project major version number") |
| set(VERSION_MINOR |
| "1" |
| CACHE STRING "Project minor version number") |
| set(VERSION_PATCH |
| "0" |
| CACHE STRING "Project patch version number") |
| set(CN_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") |
| mark_as_advanced(VERSION_MAJOR VERSION_MINOR VERSION_PATCH CN_VERSION) |
| |
| project("cn-cbor" VERSION "${CN_VERSION}") |
| |
| # ############################################################################## |
| # OPTIONS |
| # ############################################################################## |
| |
| option(CN_CBOR_USE_CONTEXT "Use context pointer for CBOR functions" OFF) |
| option(CN_CBOR_VERBOSE "Produce verbose makefile output" OFF) |
| option(CN_CBOR_OPTIMIZE "Optimize for size" OFF) |
| option(CN_CBOR_FATAL_WARNINGS "Treat build warnings as errors" ON) |
| option(CN_CBOR_COVERALLS "Generate coveralls data" ON) |
| option(CN_CBOR_COVERALLS_SEND "Send data to coveralls site" OFF) |
| option(CN_CBOR_BUILD_DOCS "Create docs using Doxygen" OFF) |
| option(CN_CBOR_BUILD_TESTS "Create tests" ON) |
| option(CN_CBOR_NO_FLOATS "Build without floating point support" OFF) |
| option(CN_CBOR_ALIGN_READS "Use memcpy in ntoh*p()" OFF) |
| option(CN_CBOR_RUN_CLANG_TIDY "Use Clang-Tidy for static analysis" OFF) |
| |
| set(dist_dir ${CMAKE_BINARY_DIR}/dist) |
| set(prefix ${CMAKE_INSTALL_PREFIX}) |
| set(exec_prefix ${CMAKE_INSTALL_PREFIX}/bin) |
| set(libdir ${CMAKE_INSTALL_PREFIX}/lib) |
| set(includedir ${CMAKE_INSTALL_PREFIX}/include) |
| configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cn-cbor.pc.in |
| ${CMAKE_CURRENT_BINARY_DIR}/cn-cbor.pc @ONLY) |
| install(FILES ${CMAKE_CURRENT_BINARY_DIR}/cn-cbor.pc DESTINATION lib/pkgconfig) |
| |
| set(package_prefix "${CMAKE_PACKAGE_NAME}-${CMAKE_SYSTEM_NAME}") |
| |
| set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${dist_dir}/bin) |
| set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${dist_dir}/lib) |
| set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${dist_dir}/lib) |
| |
| if(NOT CMAKE_BUILD_TYPE) |
| if(CN_CBOR_OPTIMIZE) |
| set(CMAKE_BUILD_TYPE MinSizeRel) |
| set(CN_CBOR_COVERALLS OFF) |
| set(CN_CBOR_COVERALLS_SEND OFF) |
| else() |
| set(CMAKE_BUILD_TYPE Debug) |
| endif() |
| endif() |
| |
| if(MSVC) |
| set(CN_CBOR_COVERALLS OFF) |
| endif() |
| |
| message("Build type: ${CMAKE_BUILD_TYPE}") |
| |
| if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang") |
| message(STATUS "adding GCC/Clang options ") |
| add_definitions(-std=gnu99 -Wall -Wextra -pedantic) |
| if(CN_CBOR_FATAL_WARNINGS) |
| add_definitions(-Werror) |
| endif() |
| if(CN_CBOR_OPTIMIZE) |
| add_definitions(-Os) |
| endif() |
| elseif(MSVC) |
| add_definitions(/W3) |
| if(CN_CBOR_FATAL_WARNINGS) |
| add_definitions(/WX) |
| endif() |
| else() |
| message(FATAL_ERROR "unhandled compiler id: ${CMAKE_C_COMPILER_ID}") |
| endif() |
| |
| if(CN_CBOR_NO_FLOATS) |
| add_definitions(-DCBOR_NO_FLOAT) |
| endif() |
| |
| if(CN_CBOR_VERBOSE) |
| set(CMAKE_VERBOSE_MAKEFILE ON) |
| endif() |
| |
| # ############################################################################## |
| # LIBRARY |
| # ############################################################################## |
| |
| set(cbor_srcs src/cn-cbor.c src/cn-create.c src/cn-encoder.c src/cn-error.c |
| src/cn-get.c src/cn-print.c) |
| |
| if(CN_CBOR_ALIGN_READS) |
| add_definitions(-DCBOR_ALIGN_READS) |
| endif() |
| if(CN_CBOR_USE_CONTEXT) |
| add_definitions(-DUSE_CBOR_CONTEXT) |
| endif() |
| # default is static, can be shared if -DBUILD_SHARED_LIBS=ON passed to cmake |
| add_library(${PROJECT_NAME}) |
| target_sources(${PROJECT_NAME} PRIVATE include/cn-cbor/cn-cbor.h ${cbor_srcs}) |
| target_include_directories( |
| ${PROJECT_NAME} |
| PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include> |
| PRIVATE ${CMAKE_CURRENT_LIST_DIR}/src) |
| if(MSVC) |
| message("test: ${BUILD_SHARED_LIBS}") |
| message("CN_CBOR_VERBOSE: ${CN_CBOR_VERBOSE}") |
| target_link_libraries(${PROJECT_NAME} ws2_32) |
| endif() |
| add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME}) |
| |
| set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake) |
| if(CN_CBOR_COVERALLS) |
| include(Coveralls) |
| coveralls_turn_on_coverage() |
| |
| set(COVERAGE_SRCS "") |
| foreach(S ${cbor_srcs}) |
| get_filename_component(S_ABS ${S} ABSOLUTE) |
| list(APPEND COVERAGE_SRCS ${S_ABS}) |
| endforeach() |
| |
| # Create the coveralls target. |
| coveralls_setup("${COVERAGE_SRCS}" ${CN_CBOR_COVERALLS_SEND} # If we should upload. |
| ) |
| |
| # add_dependencies(CN_CBOR_COVERALLS, all) |
| endif() |
| |
| if(NOT MSVC) |
| add_custom_target( |
| size |
| COMMAND echo "${CMAKE_BINARY_DIR}/src/CMakeFiles/cn-cbor.dir/cn-cbor.c.o" |
| COMMAND size "${CMAKE_BINARY_DIR}/src/CMakeFiles/cn-cbor.dir/cn-cbor.c.o" |
| COMMAND size -m "${CMAKE_BINARY_DIR}/src/CMakeFiles/cn-cbor.dir/cn-cbor.c.o" |
| DEPENDS cn-cbor |
| COMMENT "Output the size of the parse routine") |
| endif(NOT MSVC) |
| |
| # ############################################################################## |
| # DOCS |
| # ############################################################################## |
| |
| if(CN_CBOR_BUILD_DOCS) |
| find_package(Doxygen) |
| |
| if(NOT DOXYGEN_FOUND) |
| message(WARNING "Doxygen is needed to build the documentation.") |
| else() |
| set(doxyfile_in ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in) |
| set(doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile) |
| |
| configure_file(${doxyfile_in} ${doxyfile} @ONLY) |
| |
| add_custom_target( |
| doc |
| COMMAND ${DOXYGEN_EXECUTABLE} ${doxyfile} |
| WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} |
| COMMENT "Generating API documentation with Doxygen" |
| VERBATIM) |
| |
| install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html DESTINATION share/doc) |
| endif() |
| endif() |
| |
| ############################################################################### |
| # DEPENDENCIES |
| ############################################################################### |
| |
| if(CN_CBOR_RUN_CLANG_TIDY) |
| find_program( |
| CLANG_TIDY_EXE |
| NAMES "clang-tidy" |
| DOC "/usr/bin/clang-tidy") |
| if(NOT CLANG_TIDY_EXE) |
| message(WARNING "clang-tidy not found.") |
| endif() |
| set_target_properties(${PROJECT_NAME} PROPERTIES C_CLANG_TIDY "${CLANG_TIDY_EXE}") |
| endif(CN_CBOR_RUN_CLANG_TIDY) |
| |
| # ############################################################################## |
| # TESTS |
| # ############################################################################## |
| |
| if(CN_CBOR_BUILD_TESTS) |
| include(CTest) |
| add_subdirectory(test) |
| set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake) |
| include(LCov) |
| endif() |
| |
| # ############################################################################## |
| # PACKAGING |
| # ############################################################################## |
| |
| set(CPACK_GENERATOR "TGZ") |
| set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION}") |
| set(CPACK_SOURCE_GENERATOR "TGZ") |
| set(CPACK_SOURCE_IGNORE_FILES "/\\\\.git/") |
| file(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/.gitignore igs) |
| foreach(ig IN ITEMS ${igs}) |
| # remove comments |
| string(REGEX REPLACE "^\\s*#.*" "" ig "${ig}") |
| # remove any other whitespace |
| string(STRIP "${ig}" ig) |
| # anything left? |
| if(ig) |
| # dots are literal |
| string(REPLACE "." "\\\\." ig "${ig}") |
| # stars are on thars |
| string(REPLACE "*" ".*" ig "${ig}") |
| list(APPEND CPACK_SOURCE_IGNORE_FILES "/${ig}/") |
| endif() |
| endforeach() |
| |
| set(CPACK_PACKAGE_DESCRIPTION_FILE ${CMAKE_CURRENT_SOURCE_DIR}/README.md) |
| set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") |
| |
| include(CPack) |
| |
| # ############################################################################## |
| # INSTALL |
| # ############################################################################## |
| |
| include(GNUInstallDirs) |
| include(CMakePackageConfigHelpers) |
| |
| install(FILES LICENSE README.md DESTINATION .) |
| set(CN_CBOR_CONFIG_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) |
| |
| install( |
| TARGETS ${PROJECT_NAME} |
| EXPORT ${PROJECT_NAME}Targets |
| LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT lib |
| ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT lib) |
| |
| install( |
| EXPORT ${PROJECT_NAME}Targets |
| DESTINATION ${CN_CBOR_CONFIG_INSTALL_DIR} |
| NAMESPACE ${PROJECT_NAME}:: |
| COMPONENT dev) |
| |
| configure_package_config_file(cmake/Config.cmake.in ${PROJECT_NAME}Config.cmake |
| INSTALL_DESTINATION ${CN_CBOR_CONFIG_INSTALL_DIR}) |
| write_basic_package_version_file(${PROJECT_NAME}ConfigVersion.cmake |
| COMPATIBILITY SameMajorVersion) |
| install( |
| FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake |
| ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake |
| DESTINATION ${CN_CBOR_CONFIG_INSTALL_DIR} |
| COMPONENT dev) |
| |
| install( |
| DIRECTORY include/ |
| DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} |
| COMPONENT dev |
| FILES_MATCHING |
| PATTERN "*.h") |
| install( |
| TARGETS cn-cbor |
| LIBRARY DESTINATION lib |
| ARCHIVE DESTINATION lib |
| RUNTIME DESTINATION bin) |
| |
| ############################################################################### |
| # PRINT CONFIG |
| ############################################################################### |
| |
| message(STATUS "CN_CBOR_USE_CONTEXT:..............${CN_CBOR_USE_CONTEXT}") |
| message(STATUS "CN_CBOR_FATAL_WARNINGS:...........${CN_CBOR_FATAL_WARNINGS}") |
| message(STATUS "CN_CBOR_BUILD_TESTS:..............${CN_CBOR_BUILD_TESTS}") |
| message(STATUS "CN_CBOR_BUILD_DOCS:...............${CN_CBOR_BUILD_DOCS}") |
| message(STATUS "CMAKE_BUILD_TYPE:................${CMAKE_BUILD_TYPE}") |
| message(STATUS "BUILD_SHARED_LIBS:...............${BUILD_SHARED_LIBS}") |
| message(STATUS "CN_VERSION:....................${CN_VERSION}") |
| message(STATUS "CMAKE_VERSION:...................${CMAKE_VERSION}") |
| message(STATUS "CMAKE_C_COMPILER:................${CMAKE_C_COMPILER}") |
| message(STATUS "CMAKE_CXX_COMPILER:..............${CMAKE_CXX_COMPILER}") |
| message(STATUS "CLANG_TIDY_EXE:..................${CLANG_TIDY_EXE}") |