Archived
Also a best practice from "How To Write Shared Libraries"[1] [1] https://akkadia.org/drepper/dsohowto.pdf Signed-off-by: Thiago Macieira <thiago.macieira@intel.com>
145 lines
5.0 KiB
CMake
145 lines
5.0 KiB
CMake
# /****************************************************************************
|
|
# **
|
|
# ** 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 VERSION 7.0)
|
|
|
|
# Set path to additional cmake scripts
|
|
set(CMAKE_MODULE_PATH ${CMAKE_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)
|
|
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
|
|
src/tinycbor-version.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.
|
|
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()
|
|
|
|
# Generate export macros
|
|
generate_export_header(tinycbor BASE_NAME "cbor" EXPORT_MACRO_NAME "CBOR_API" EXPORT_FILE_NAME "tinycbor-export.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:${CMAKE_BINARY_DIR}>"
|
|
PUBLIC "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
|
|
|
|
install(FILES src/cbor.h src/tinycbor-version.h ${CMAKE_BINARY_DIR}/tinycbor-export.h TYPE INCLUDE)
|
|
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()
|