blob: b5f7f55b08799faa3574136a8cf0cfbd44547ece [file] [log] [blame] [edit]
# /****************************************************************************
# **
# ** Copyright (C) 2015 Intel Corporation
# **
# ** Permission is hereby granted, free of charge, to any person obtaining a copy
# ** of this software and associated documentation files (the "Software"), to deal
# ** in the Software without restriction, including without limitation the rights
# ** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# ** copies of the Software, and to permit persons to whom the Software is
# ** furnished to do so, subject to the following conditions:
# **
# ** The above copyright notice and this permission notice shall be included in
# ** all copies or substantial portions of the Software.
# **
# ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# ** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# ** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# ** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# ** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# ** THE SOFTWARE.
# **
# ****************************************************************************/
cmake_minimum_required(VERSION 3.10)
project(tinycbor LANGUAGES C CXX VERSION 7.0)
# Set path to additional cmake scripts
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
set(TARGETS_EXPORT_NAME "TinyCBOR-targets")
option(WITH_CBOR2JSON "Compile code to convert from CBOR to JSON" ON)
option(WITH_FREESTANDING "Compile TinyCBOR in C freestanding mode" OFF)
if(WITH_FLOATING_POINT AND NOT WITH_FREESTANDING)
option(WITH_FLOATING_POINT "Use floating point code in TinyCBOR" ON)
option(WITH_TOOLS "Compile the TinyCBOR tools" ON)
endif()
# Include additional modules that are used unconditionally
include(GNUInstallDirs)
include(GenerateExportHeader)
include(CheckLinkerFlag)
include(CheckSymbolExists)
add_library(tinycbor
src/cborencoder.c
src/cborencoder_close_container_checked.c
src/cborerrorstrings.c
src/cborparser.c
src/cborpretty.c
src/cborvalidation.c
src/cbor.h
)
if(WITH_FREESTANDING)
target_compile_options(tinycbor PUBLIC
$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-ffreestanding>
)
else()
target_sources(tinycbor PRIVATE
src/cborparser_dup_string.c
src/cborpretty_stdio.c
)
if(WITH_CBOR2JSON)
target_sources(tinycbor PRIVATE
src/cbortojson.c
)
endif()
endif()
if(WITH_FLOATING_POINT)
target_sources(tinycbor PRIVATE
src/cborencoder_float.c
src/cborparser_float.c
)
if(NOT WIN32)
target_link_libraries(tinycbor m)
endif()
else()
target_compile_definitions(tinycbor PUBLIC CBOR_NO_FLOATING_POINT)
endif()
set_target_properties(tinycbor PROPERTIES
# Force this library to link as C and compile as C99, to ensure we
# don't use something of a newer language level.
LINKER_LANGUAGE C
C_EXTENSIONS OFF
C_STANDARD 99
# Set version and output name
VERSION "0.${PROJECT_VERSION}"
SOVERSION "0"
)
if(BUILD_SHARED_LIBS)
set_target_properties(tinycbor PROPERTIES C_VISIBILITY_PRESET hidden)
# Check if the linker supports "-z defs" (a.k.a "--no-undefined")
check_linker_flag(C "-Wl,-z,defs" HAVE_NO_UNDEFINED)
if(HAVE_NO_UNDEFINED)
target_link_options(tinycbor PRIVATE "-Wl,-z,defs")
endif()
else()
target_compile_definitions(tinycbor PUBLIC CBOR_STATIC_DEFINE)
endif()
# Enable warnings
target_compile_options(tinycbor PRIVATE
$<$<CXX_COMPILER_ID:MSVC>:-W3>
$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:
-Wall -Wextra
-Werror=format-security
-Werror=incompatible-pointer-types
-Werror=implicit-function-declaration
-Werror=int-conversion
>
)
# Generate export macros
generate_export_header(tinycbor
BASE_NAME "cbor"
EXPORT_MACRO_NAME "CBOR_API"
EXPORT_FILE_NAME "tinycbor-export.h"
)
# Generate version header
configure_file(src/tinycbor-version.h.in tinycbor-version.h)
# Check for open_memstream and store the result in HAVE_OPEN_MEMSTREAM
check_symbol_exists(open_memstream stdio.h HAVE_OPEN_MEMSTREAM)
check_symbol_exists(funopen stdio.h HAVE_OPEN_FUNOPEN)
check_symbol_exists(fopencookie stdio.h HAVE_OPEN_FOPENCOOKIE)
if(NOT HAVE_OPEN_MEMSTREAM)
if (HAVE_OPEN_FUNOPEN AND HAVE_OPEN_FOPENCOOKIE)
message(STATUS "using open_memstream implementation")
target_sources(tinycbor PRIVATE src/open_memstream.c)
else()
target_compile_definitions(tinycbor PRIVATE WITHOUT_OPEN_MEMSTREAM)
message(WARNING "funopen and fopencookie unavailable, open_memstream can not be implemented and conversion to JSON will not work properly!")
endif()
endif()
target_include_directories(tinycbor
PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>"
PUBLIC "$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>"
PUBLIC "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
)
install(FILES
${PROJECT_SOURCE_DIR}/src/cbor.h
${PROJECT_BINARY_DIR}/tinycbor-version.h
${PROJECT_BINARY_DIR}/tinycbor-export.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/tinycbor
)
install(
TARGETS tinycbor
EXPORT "${TARGETS_EXPORT_NAME}"
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} # import library
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} # .so files are libraries
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} # .dll files are binaries
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} # this does not actually install anything (but used by downstream projects)
)
set(PROJECT_LIBRARIES TinyCBOR)
include(PackageConfig)
if(BUILD_TESTING)
enable_testing()
add_subdirectory(tests)
endif()
if(WITH_TOOLS)
add_subdirectory(tools)
endif()