CMAKE_MINIMUM_REQUIRED(VERSION 2.8.6) PROJECT(msgpack) FILE(READ ${CMAKE_CURRENT_SOURCE_DIR}/include/msgpack/version_master.h contents) STRING( REGEX MATCH "#define MSGPACK_VERSION_MAJOR *([0-9a-zA-Z_]*)" NULL_OUT ${contents} ) SET(VERSION_MAJOR ${CMAKE_MATCH_1}) STRING( REGEX MATCH "#define MSGPACK_VERSION_MINOR *([0-9a-zA-Z_]*)" NULL_OUT ${contents} ) SET(VERSION_MINOR ${CMAKE_MATCH_1}) STRING( REGEX MATCH "#define MSGPACK_VERSION_REVISION *([0-9a-zA-Z_]*)" NULL_OUT ${contents} ) SET(VERSION_REVISION ${CMAKE_MATCH_1}) SET(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}) SET(prefix ${CMAKE_INSTALL_PREFIX}) SET(exec_prefix "\${prefix}") SET(libdir "\${exec_prefix}/lib") SET(includedir "\${prefix}/include") SET(GNUCXX_STD_SUPPORT_VERSION "4.3") SET(GNUCXX_NO_MISMATCHED_TAGS_SUPPORT_VERSION "4.4") OPTION(MSGPACK_CXX11 "Using c++11 compiler" OFF) OPTION(MSGPACK_32BIT "32bit compile" OFF) OPTION(MSGPACK_BOOST "Using boost libraries" OFF) SET(CMAKE_CXX_FLAGS "-DMSGPACK_DISABLE_LEGACY_NIL ${CMAKE_CXX_FLAGS}") SET(CMAKE_CXX_FLAGS "-DMSGPACK_DISABLE_LEGACY_CONVERT ${CMAKE_CXX_FLAGS}") IF(APPLE) SET(CMAKE_MACOSX_RPATH ON) SET(CMAKE_SKIP_BUILD_RPATH FALSE) SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir) IF("${isSystemDir}" STREQUAL "-1") SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") ENDIF() ENDIF() IF(MSGPACK_CXX11) IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") SET(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}") ELSEIF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") SET(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}") ELSEIF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") IF(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19) MESSAGE(FATAL_ERROR "MSVC doesn't support C++11.") ENDIF() ENDIF() ELSE() IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") IF( (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER ${GNUCXX_STD_SUPPORT_VERSION}) OR (CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL ${GNUCXX_STD_SUPPORT_VERSION}) ) SET(CMAKE_CXX_FLAGS "-std=c++03 ${CMAKE_CXX_FLAGS}") ENDIF() ELSEIF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") SET(CMAKE_CXX_FLAGS "-std=c++03 ${CMAKE_CXX_FLAGS}") ELSEIF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") IF(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 18) SET(CMAKE_CXX_FLAGS "-DMSGPACK_USE_CPP03 ${CMAKE_CXX_FLAGS}") ENDIF() ENDIF() ENDIF() IF(MSGPACK_32BIT) IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") SET(CMAKE_CXX_FLAGS "-m32 ${CMAKE_CXX_FLAGS}") SET(CMAKE_C_FLAGS "-m32 ${CMAKE_C_FLAGS}") SET(CMAKE_EXE_LINKER_FLAGS "-m32 ${CMAKE_EXE_LINKER_FLAGS}") ELSEIF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") SET(CMAKE_CXX_FLAGS "-m32 ${CMAKE_CXX_FLAGS}") SET(CMAKE_C_FLAGS "-m32 ${CMAKE_C_FLAGS}") SET(CMAKE_EXE_LINKER_FLAGS "-m32 ${CMAKE_EXE_LINKER_FLAGS}") ENDIF() ENDIF() IF(MSGPACK_BOOST) SET(CMAKE_CXX_FLAGS "-DMSGPACK_USE_BOOST ${CMAKE_CXX_FLAGS}") SET(Boost_USE_STATIC_LIBS ON) # only find static libs SET(Boost_USE_MULTITHREADED ON) SET(Boost_USE_STATIC_RUNTIME OFF) FIND_PACKAGE(Boost COMPONENTS chrono timer system) INCLUDE_DIRECTORIES(${MSGPACK_BOOST_DIR}) ENDIF() IF(MSGPACK_CHAR_SIGN) SET(CMAKE_C_FLAGS "-f${MSGPACK_CHAR_SIGN}-char ${CMAKE_C_FLAGS}") SET(CMAKE_CXX_FLAGS "-f${MSGPACK_CHAR_SIGN}-char ${CMAKE_CXX_FLAGS}") ENDIF() FILE( GLOB_RECURSE PREDEF_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/external/boost/predef/include/boost ${CMAKE_CURRENT_SOURCE_DIR}/external/boost/predef/include/boost/*.h ) FOREACH(F ${PREDEF_FILES}) SET(M "Converting ${F}") MESSAGE(STATUS ${M}) FILE(READ ${CMAKE_CURRENT_SOURCE_DIR}/external/boost/predef/include/boost/${F} CONTENT) STRING( REPLACE "BOOST_" "MSGPACK_" CONTENT ${CONTENT} ) STRING( REPLACE "boost/" "msgpack/" CONTENT ${CONTENT} ) FILE(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/include/msgpack/${F} ${CONTENT}) ENDFOREACH() FILE( GLOB_RECURSE PREPROCESSOR_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/external/boost/preprocessor/include/boost ${CMAKE_CURRENT_SOURCE_DIR}/external/boost/preprocessor/include/boost/*.hpp ) FOREACH(F ${PREPROCESSOR_FILES}) SET(M "Converting ${F}") MESSAGE(STATUS ${M}) FILE(READ ${CMAKE_CURRENT_SOURCE_DIR}/external/boost/preprocessor/include/boost/${F} CONTENT) STRING( REPLACE "BOOST_" "MSGPACK_" CONTENT ${CONTENT} ) STRING( REPLACE "boost/" "msgpack/" CONTENT ${CONTENT} ) FILE(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/include/msgpack/${F} ${CONTENT}) ENDFOREACH() FIND_PACKAGE(GTest) FIND_PACKAGE(ZLIB) FIND_PACKAGE(Threads) IF(GTEST_FOUND AND ZLIB_FOUND AND THREADS_FOUND) OPTION(MSGPACK_BUILD_TESTS "Build msgpack tests." ON) ENDIF() OPTION(MSGPACK_BUILD_EXAMPLES "Build msgpack examples." ON) OPTION(MSGPACK_ENABLE_CXX "Enable C++ interface." ON) OPTION(MSGPACK_ENABLE_SHARED "Build shared libaries in addition to static libraries." ON) INCLUDE(CheckCXXSourceCompiles) CHECK_CXX_SOURCE_COMPILES(" #include int atomic_sub(int i) { return __gnu_cxx::__exchange_and_add(&i, -1) - 1; } int atomic_add(int i) { return __gnu_cxx::__exchange_and_add(&i, 1) + 1; } int main(int argc, char * argv[]) { atomic_sub(1); atomic_add(1); } " MSGPACK_ENABLE_GCC_CXX_ATOMIC) LIST( APPEND msgpackc_SOURCES src/unpack.c src/objectc.c src/version.c src/vrefbuffer.c src/zone.c ) LIST( APPEND msgpackc_HEADERS include/msgpack/pack_define.h include/msgpack/pack_template.h include/msgpack/unpack_define.h include/msgpack/unpack_template.h include/msgpack/util.h include/msgpack/sysdep.h include/msgpack/gcc_atomic.h include/msgpack.h include/msgpack/sbuffer.h include/msgpack/version.h include/msgpack/version_master.h include/msgpack/vrefbuffer.h include/msgpack/zbuffer.h include/msgpack/fbuffer.h include/msgpack/pack.h include/msgpack/unpack.h include/msgpack/object.h include/msgpack/zone.h ) FILE( GLOB_RECURSE PREDEF_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include/msgpack/predef/*.h ) LIST(APPEND msgpackc_HEADERS ${PREDEF_FILES}) LIST(APPEND msgpackc_HEADERS include/msgpack/predef.h) IF(MSGPACK_ENABLE_CXX) LIST( APPEND msgpack_HEADERS include/msgpack.hpp include/msgpack/adaptor/adaptor_base.hpp include/msgpack/adaptor/array_ref.hpp include/msgpack/adaptor/bool.hpp include/msgpack/adaptor/boost/fusion.hpp include/msgpack/adaptor/boost/msgpack_variant.hpp include/msgpack/adaptor/boost/optional.hpp include/msgpack/adaptor/boost/string_ref.hpp include/msgpack/adaptor/char_ptr.hpp include/msgpack/adaptor/check_container_size.hpp include/msgpack/adaptor/cpp11/array.hpp include/msgpack/adaptor/cpp11/array_char.hpp include/msgpack/adaptor/cpp11/array_unsigned_char.hpp include/msgpack/adaptor/cpp11/forward_list.hpp include/msgpack/adaptor/cpp11/reference_wrapper.hpp include/msgpack/adaptor/cpp11/shared_ptr.hpp include/msgpack/adaptor/cpp11/tuple.hpp include/msgpack/adaptor/cpp11/unique_ptr.hpp include/msgpack/adaptor/cpp11/unordered_map.hpp include/msgpack/adaptor/cpp11/unordered_set.hpp include/msgpack/adaptor/define.hpp include/msgpack/adaptor/deque.hpp include/msgpack/adaptor/detail/cpp03_define_array.hpp include/msgpack/adaptor/detail/cpp03_define_map.hpp include/msgpack/adaptor/detail/cpp03_msgpack_tuple.hpp include/msgpack/adaptor/detail/cpp11_define_array.hpp include/msgpack/adaptor/detail/cpp11_define_map.hpp include/msgpack/adaptor/detail/cpp11_msgpack_tuple.hpp include/msgpack/adaptor/ext.hpp include/msgpack/adaptor/fixint.hpp include/msgpack/adaptor/float.hpp include/msgpack/adaptor/int.hpp include/msgpack/adaptor/list.hpp include/msgpack/adaptor/map.hpp include/msgpack/adaptor/msgpack_tuple.hpp include/msgpack/adaptor/nil.hpp include/msgpack/adaptor/pair.hpp include/msgpack/adaptor/raw.hpp include/msgpack/adaptor/v4raw.hpp include/msgpack/adaptor/set.hpp include/msgpack/adaptor/string.hpp include/msgpack/adaptor/tr1/unordered_map.hpp include/msgpack/adaptor/tr1/unordered_set.hpp include/msgpack/adaptor/vector.hpp include/msgpack/adaptor/vector_bool.hpp include/msgpack/adaptor/vector_char.hpp include/msgpack/adaptor/vector_unsigned_char.hpp include/msgpack/cpp_config.hpp include/msgpack/detail/cpp03_zone.hpp include/msgpack/detail/cpp11_zone.hpp include/msgpack/fbuffer.hpp include/msgpack/iterator.hpp include/msgpack/meta.hpp include/msgpack/object.hpp include/msgpack/object_fwd.hpp include/msgpack/pack.hpp include/msgpack/sbuffer.hpp include/msgpack/type.hpp include/msgpack/unpack.hpp include/msgpack/version.hpp include/msgpack/versioning.hpp include/msgpack/vrefbuffer.hpp include/msgpack/zbuffer.hpp include/msgpack/zone.hpp ) FILE( GLOB_RECURSE PREPROCESSOR_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include/msgpack/preprocessor/*.hpp ) LIST(APPEND msgpackc_HEADERS ${PREPROCESSOR_FILES}) LIST(APPEND msgpackc_HEADERS include/msgpack/preprocessor.hpp) ENDIF() EXECUTE_PROCESS( COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/src/msgpack ) CONFIGURE_FILE(msgpack.pc.in msgpack.pc @ONLY) INCLUDE_DIRECTORIES(./ include/ ${CMAKE_CURRENT_BINARY_DIR}/include/) IF(MSGPACK_ENABLE_SHARED) ADD_LIBRARY(msgpackc SHARED ${msgpackc_SOURCES} ${msgpackc_HEADERS}) ENDIF() ADD_LIBRARY(msgpackc-static STATIC ${msgpackc_SOURCES} ${msgpackc_HEADERS}) SET_TARGET_PROPERTIES(msgpackc-static PROPERTIES OUTPUT_NAME "msgpackc") IF(MSGPACK_ENABLE_SHARED) SET_TARGET_PROPERTIES(msgpackc PROPERTIES IMPORT_SUFFIX "_import.lib") SET_TARGET_PROPERTIES( msgpackc PROPERTIES SOVERSION 2 VERSION 2.0.0 ) ENDIF() IF(MSGPACK_BUILD_TESTS) ENABLE_TESTING() # MEMORYCHECK_COMMAND_OPTIONS needs to place prior to CTEST_MEMORYCHECK_COMMAND SET( MEMORYCHECK_COMMAND_OPTIONS "--leak-check=full --show-leak-kinds=definite,possible --error-exitcode=1" ) FIND_PROGRAM(CTEST_MEMORYCHECK_COMMAND NAMES valgrind) INCLUDE(Dart) ADD_SUBDIRECTORY(test) ENDIF() IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") IF(MSGPACK_ENABLE_SHARED) SET_PROPERTY( TARGET msgpackc APPEND_STRING PROPERTY COMPILE_FLAGS "-Wall -Wextra -Werror -g -O3 -DPIC" ) ENDIF() SET_PROPERTY( TARGET msgpackc-static APPEND_STRING PROPERTY COMPILE_FLAGS "-Wall -Wextra -Werror -g -O3" ) ENDIF() IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") SET_PROPERTY(TARGET msgpackc APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags") ENDIF() IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") IF( (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER ${GNUCXX_NO_MISMATCHED_TAGS_SUPPORT_VERSION}) OR (CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL ${GNUCXX_NO_MISMATCHED_TAGS_SUPPORT_VERSION}) ) SET_PROPERTY(TARGET msgpackc APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags") ENDIF() ENDIF() IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") IF(CMAKE_CXX_FLAGS MATCHES "/W[0-4]") STRING( REGEX REPLACE "/W[0-4]" "/W3 /WX" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" ) ELSE() SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX") ENDIF() ENDIF() IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC90" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC10") SET_SOURCE_FILES_PROPERTIES(${msgpackc_SOURCES} PROPERTIES LANGUAGE CXX) ENDIF() IF(NOT DEFINED CMAKE_INSTALL_LIBDIR) SET(CMAKE_INSTALL_LIBDIR lib) ENDIF() IF(MSGPACK_BUILD_EXAMPLES) ADD_SUBDIRECTORY(example) ENDIF() IF(MSGPACK_ENABLE_SHARED) SET(MSGPACK_INSTALLTARGETS msgpackc msgpackc-static) ELSE() SET(MSGPACK_INSTALLTARGETS msgpackc-static) ENDIF() INSTALL(TARGETS ${MSGPACK_INSTALLTARGETS} DESTINATION ${CMAKE_INSTALL_LIBDIR}) INSTALL(DIRECTORY include DESTINATION ${CMAKE_INSTALL_PREFIX}) IF(NOT MSVC) INSTALL( FILES ${CMAKE_CURRENT_BINARY_DIR}/msgpack.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig ) ENDIF() # Doxygen FIND_PACKAGE(Doxygen) IF(DOXYGEN_FOUND) LIST( APPEND Doxyfile_c_CONTENT COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c COMMAND ${CMAKE_COMMAND} -E echo "FILE_PATTERNS = *.h" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c COMMAND ${CMAKE_COMMAND} -E echo "OUTPUT_DIRECTORY = doc_c" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c COMMAND ${CMAKE_COMMAND} -E echo "INPUT = ${CMAKE_CURRENT_SOURCE_DIR}/include" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c COMMAND ${CMAKE_COMMAND} -E echo "EXTRACT_ALL = YES" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c COMMAND ${CMAKE_COMMAND} -E echo "PROJECT_NAME = \"MessagePack for C\"" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c ) IF(DOXYGEN_DOT_FOUND) LIST( APPEND Doxyfile_c_CONTENT COMMAND ${CMAKE_COMMAND} -E echo "HAVE_DOT = YES" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c ) ENDIF() ADD_CUSTOM_TARGET( doxygen_c ${Doxyfile_c_CONTENT} COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c VERBATIM ) LIST( APPEND Doxyfile_cpp_CONTENT COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp COMMAND ${CMAKE_COMMAND} -E echo "FILE_PATTERNS = *.hpp" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp COMMAND ${CMAKE_COMMAND} -E echo "OUTPUT_DIRECTORY = doc_cpp" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp COMMAND ${CMAKE_COMMAND} -E echo "INPUT = ${CMAKE_CURRENT_SOURCE_DIR}/include" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp COMMAND ${CMAKE_COMMAND} -E echo "EXTRACT_ALL = YES" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp ) IF(DOXYGEN_DOT_FOUND) LIST( APPEND Doxyfile_cpp_CONTENT COMMAND ${CMAKE_COMMAND} -E echo "HAVE_DOT = YES" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp ) ENDIF() ADD_CUSTOM_TARGET( doxygen_cpp ${Doxyfile_cpp_CONTENT} COMMAND ${CMAKE_COMMAND} -E echo "PROJECT_NAME = \"MessagePack for C++\"" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp VERBATIM ) ADD_CUSTOM_TARGET(doxygen DEPENDS doxygen_c doxygen_cpp) ENDIF()