| 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(use_context "Use context pointer for CBOR functions" OFF) |
| option(verbose "Produce verbose makefile output" OFF) |
| option(optimize "Optimize for size" OFF) |
| option(fatal_warnings "Treat build warnings as errors" ON) |
| option(coveralls "Generate coveralls data" ON) |
| option(coveralls_send "Send data to coveralls site" OFF) |
| option(build_docs "Create docs using Doxygen" OFF) |
| option(build_tests "Create tests" ON) |
| option(no_floats "Build without floating point support" OFF) |
| option(align_reads "Use memcpy in ntoh*p()" OFF) |
| |
| include(GNUInstallDirs) |
| |
| 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(optimize) |
| set(CMAKE_BUILD_TYPE MinSizeRel) |
| set(coveralls OFF) |
| set(coveralls_send OFF) |
| else() |
| set(CMAKE_BUILD_TYPE Debug) |
| endif() |
| endif() |
| |
| if(MSVC) |
| set(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(fatal_warnings) |
| add_definitions(-Werror) |
| endif() |
| if(optimize) |
| add_definitions(-Os) |
| endif() |
| elseif(MSVC) |
| add_definitions(/W3) |
| if(fatal_warnings) |
| add_definitions(/WX) |
| endif() |
| else() |
| message(FATAL_ERROR "unhandled compiler id: ${CMAKE_C_COMPILER_ID}") |
| endif() |
| |
| if(no_floats) |
| add_definitions(-DCBOR_NO_FLOAT) |
| endif() |
| |
| if(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(align_reads) |
| add_definitions(-DCBOR_ALIGN_READS) |
| endif() |
| if(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("verbose: ${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(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}" ${coveralls_send} # If we should upload. |
| ) |
| |
| # add_dependencies(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(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() |
| |
| # ############################################################################## |
| # TESTS |
| # ############################################################################## |
| |
| if(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) |