diff --git a/.travis_scripts/cmake_builder.sh b/.travis_scripts/cmake_builder.sh index 920985f..9c003d7 100755 --- a/.travis_scripts/cmake_builder.sh +++ b/.travis_scripts/cmake_builder.sh @@ -66,7 +66,7 @@ cmake --version echo ${CXX} ${CXX} --version _COMPILER_NAME=`basename ${CXX}` -if [ "${BUILD_TYPE}" = "shared" ]; then +if [ "${LIB_TYPE}" = "shared" ]; then _CMAKE_BUILD_SHARED_LIBS=ON else _CMAKE_BUILD_SHARED_LIBS=OFF diff --git a/CMakeLists.txt b/CMakeLists.txt index 6993057..5cac788 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -55,7 +55,7 @@ endif() # Note: project(VERSION XX) - the VERSION here is number, but VERSION in meson is string. # Thus, it is better to be consistent. -project(JSONCPP +project(jsoncpp LANGUAGES CXX) # Set variable named ${VAR_NAME} to value ${VALUE} @@ -102,7 +102,9 @@ option(JSONCPP_WITH_STRICT_ISO "Issue all the warnings demanded by strict ISO C option(JSONCPP_WITH_PKGCONFIG_SUPPORT "Generate and install .pc files" ON) option(JSONCPP_WITH_CMAKE_PACKAGE "Generate and install cmake package files" ON) option(JSONCPP_WITH_EXAMPLE "Compile JsonCpp example" OFF) -option(BUILD_SHARED_LIBS "Build jsoncpp_lib as a shared library." OFF) +option(BUILD_SHARED_LIBS "Build jsoncpp_lib as a shared library." ON) +option(BUILD_STATIC_LIBS "Build jsoncpp_lib as a static library." ON) +option(BUILD_OBJECT_LIBS "Build jsoncpp_lib as a object library." ON) option(BUILD_WITH_CXX_11 "Build jsoncpp_lib with C++11 standard." ON) ## To compatible with C++0x and C++1x diff --git a/src/jsontestrunner/CMakeLists.txt b/src/jsontestrunner/CMakeLists.txt index d24aa6f..1fc71ea 100644 --- a/src/jsontestrunner/CMakeLists.txt +++ b/src/jsontestrunner/CMakeLists.txt @@ -19,8 +19,10 @@ if(BUILD_SHARED_LIBS) else() add_definitions(-DJSON_DLL) endif() + target_link_libraries(jsontestrunner_exe jsoncpp_lib) +else() + target_link_libraries(jsontestrunner_exe jsoncpp_static) endif() -target_link_libraries(jsontestrunner_exe jsoncpp_lib) set_target_properties(jsontestrunner_exe PROPERTIES OUTPUT_NAME jsontestrunner_exe) diff --git a/src/lib_json/CMakeLists.txt b/src/lib_json/CMakeLists.txt index 6686c4d..7aca81e 100644 --- a/src/lib_json/CMakeLists.txt +++ b/src/lib_json/CMakeLists.txt @@ -50,7 +50,7 @@ set(PUBLIC_HEADERS source_group("Public API" FILES ${PUBLIC_HEADERS}) -set(jsoncpp_sources +set(JSONCPP_SOURCES json_tool.h json_reader.cpp json_valueiterator.inl @@ -65,6 +65,62 @@ else() set(INSTALL_EXPORT) endif() +# Specify compiler features required when compiling a given target. +# See https://cmake.org/cmake/help/v3.1/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.html#prop_gbl:CMAKE_CXX_KNOWN_FEATURES +# for complete list of features available +function(COMPILE_FEATURES ARG1) + if(CMAKE_CXX_STANDARD EQUAL "11") + target_compile_features(${ARG1} PUBLIC + cxx_std_11 # Compiler mode is aware of C++ 11. + #MSVC 1900 cxx_alignas # Alignment control alignas, as defined in N2341. + #MSVC 1900 cxx_alignof # Alignment control alignof, as defined in N2341. + #MSVC 1900 cxx_attributes # Generic attributes, as defined in N2761. + cxx_auto_type # Automatic type deduction, as defined in N1984. + #MSVC 1900 cxx_constexpr # Constant expressions, as defined in N2235. + cxx_decltype # Decltype, as defined in N2343. + cxx_default_function_template_args # Default template arguments for function templates, as defined in DR226 + cxx_defaulted_functions # Defaulted functions, as defined in N2346. + #MSVC 1900 cxx_defaulted_move_initializers # Defaulted move initializers, as defined in N3053. + cxx_delegating_constructors # Delegating constructors, as defined in N1986. + #MSVC 1900 cxx_deleted_functions # Deleted functions, as defined in N2346. + cxx_enum_forward_declarations # Enum forward declarations, as defined in N2764. + cxx_explicit_conversions # Explicit conversion operators, as defined in N2437. + cxx_extended_friend_declarations # Extended friend declarations, as defined in N1791. + cxx_extern_templates # Extern templates, as defined in N1987. + cxx_final # Override control final keyword, as defined in N2928, N3206 and N3272. + #MSVC 1900 cxx_func_identifier # Predefined __func__ identifier, as defined in N2340. + #MSVC 1900 cxx_generalized_initializers # Initializer lists, as defined in N2672. + #MSVC 1900 cxx_inheriting_constructors # Inheriting constructors, as defined in N2540. + #MSVC 1900 cxx_inline_namespaces # Inline namespaces, as defined in N2535. + cxx_lambdas # Lambda functions, as defined in N2927. + #MSVC 1900 cxx_local_type_template_args # Local and unnamed types as template arguments, as defined in N2657. + cxx_long_long_type # long long type, as defined in N1811. + #MSVC 1900 cxx_noexcept # Exception specifications, as defined in N3050. + #MSVC 1900 cxx_nonstatic_member_init # Non-static data member initialization, as defined in N2756. + cxx_nullptr # Null pointer, as defined in N2431. + cxx_override # Override control override keyword, as defined in N2928, N3206 and N3272. + cxx_range_for # Range-based for, as defined in N2930. + cxx_raw_string_literals # Raw string literals, as defined in N2442. + #MSVC 1900 cxx_reference_qualified_functions # Reference qualified functions, as defined in N2439. + cxx_right_angle_brackets # Right angle bracket parsing, as defined in N1757. + cxx_rvalue_references # R-value references, as defined in N2118. + #MSVC 1900 cxx_sizeof_member # Size of non-static data members, as defined in N2253. + cxx_static_assert # Static assert, as defined in N1720. + cxx_strong_enums # Strongly typed enums, as defined in N2347. + #MSVC 1900 cxx_thread_local # Thread-local variables, as defined in N2659. + cxx_trailing_return_types # Automatic function return type, as defined in N2541. + #MSVC 1900 cxx_unicode_literals # Unicode string literals, as defined in N2442. + cxx_uniform_initialization # Uniform initialization, as defined in N2640. + #MSVC 1900 cxx_unrestricted_unions # Unrestricted unions, as defined in N2544. + #MSVC 1900 cxx_user_literals # User-defined literals, as defined in N2765. + cxx_variadic_macros # Variadic macros, as defined in N1653. + cxx_variadic_templates # Variadic templates, as defined in N2242. + ) + else() + set(CMAKE_CXX_STANDARD 98) + target_compile_features(${ARG1} PUBLIC) + endif() +endfunction() if(BUILD_SHARED_LIBS) if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.12.0) @@ -72,86 +128,98 @@ if(BUILD_SHARED_LIBS) else() add_definitions(-DJSON_DLL_BUILD) endif() + + set(SHARED_LIB ${PROJECT_NAME}_lib) + add_library(${SHARED_LIB} SHARED ${PUBLIC_HEADERS} ${JSONCPP_SOURCES}) + set_target_properties( ${SHARED_LIB} PROPERTIES + OUTPUT_NAME jsoncpp + VERSION ${JSONCPP_VERSION} + SOVERSION ${JSONCPP_SOVERSION} + POSITION_INDEPENDENT_CODE ON + ) + + # Set library's runtime search path on OSX + if(APPLE) + set_target_properties(${SHARED_LIB} PROPERTIES INSTALL_RPATH "@loader_path/.") + endif() + + COMPILE_FEATURES(${SHARED_LIB}) + + if(NOT CMAKE_VERSION VERSION_LESS 2.8.11) + target_include_directories(${SHARED_LIB} PUBLIC + $ + $ + $ + ) + endif() + + list(APPEND CMAKE_TARGETS ${SHARED_LIB}) endif() -add_library(jsoncpp_lib ${PUBLIC_HEADERS} ${jsoncpp_sources}) -set_target_properties( jsoncpp_lib PROPERTIES - OUTPUT_NAME jsoncpp - VERSION ${JSONCPP_VERSION} - SOVERSION ${JSONCPP_SOVERSION} - POSITION_INDEPENDENT_CODE ON -) +if(BUILD_STATIC_LIBS) + set(STATIC_LIB ${PROJECT_NAME}_static) + add_library(${STATIC_LIB} STATIC ${PUBLIC_HEADERS} ${JSONCPP_SOURCES}) -# Set library's runtime search path on OSX -if(APPLE) - set_target_properties(jsoncpp_lib PROPERTIES INSTALL_RPATH "@loader_path/.") + # avoid name clashes on windows as the shared import lib is also named jsoncpp.lib + if(NOT DEFINED STATIC_SUFFIX AND BUILD_SHARED_LIBS) + set(STATIC_SUFFIX "_static") + endif() + + set_target_properties( ${STATIC_LIB} PROPERTIES + OUTPUT_NAME jsoncpp${STATIC_SUFFIX} + VERSION ${JSONCPP_VERSION} + ) + + # Set library's runtime search path on OSX + if(APPLE) + set_target_properties(${STATIC_LIB} PROPERTIES INSTALL_RPATH "@loader_path/.") + endif() + + COMPILE_FEATURES(${STATIC_LIB}) + + if(NOT CMAKE_VERSION VERSION_LESS 2.8.11) + target_include_directories(${STATIC_LIB} PUBLIC + $ + $ + $ + ) + endif() + + list(APPEND CMAKE_TARGETS ${STATIC_LIB}) endif() -# Specify compiler features required when compiling a given target. -# See https://cmake.org/cmake/help/v3.1/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.html#prop_gbl:CMAKE_CXX_KNOWN_FEATURES -# for complete list of features available -if(CMAKE_CXX_STANDARD EQUAL "11") -target_compile_features(jsoncpp_lib PUBLIC - cxx_std_11 # Compiler mode is aware of C++ 11. - #MSVC 1900 cxx_alignas # Alignment control alignas, as defined in N2341. - #MSVC 1900 cxx_alignof # Alignment control alignof, as defined in N2341. - #MSVC 1900 cxx_attributes # Generic attributes, as defined in N2761. - cxx_auto_type # Automatic type deduction, as defined in N1984. - #MSVC 1900 cxx_constexpr # Constant expressions, as defined in N2235. - cxx_decltype # Decltype, as defined in N2343. - cxx_default_function_template_args # Default template arguments for function templates, as defined in DR226 - cxx_defaulted_functions # Defaulted functions, as defined in N2346. - #MSVC 1900 cxx_defaulted_move_initializers # Defaulted move initializers, as defined in N3053. - cxx_delegating_constructors # Delegating constructors, as defined in N1986. - #MSVC 1900 cxx_deleted_functions # Deleted functions, as defined in N2346. - cxx_enum_forward_declarations # Enum forward declarations, as defined in N2764. - cxx_explicit_conversions # Explicit conversion operators, as defined in N2437. - cxx_extended_friend_declarations # Extended friend declarations, as defined in N1791. - cxx_extern_templates # Extern templates, as defined in N1987. - cxx_final # Override control final keyword, as defined in N2928, N3206 and N3272. - #MSVC 1900 cxx_func_identifier # Predefined __func__ identifier, as defined in N2340. - #MSVC 1900 cxx_generalized_initializers # Initializer lists, as defined in N2672. - #MSVC 1900 cxx_inheriting_constructors # Inheriting constructors, as defined in N2540. - #MSVC 1900 cxx_inline_namespaces # Inline namespaces, as defined in N2535. - cxx_lambdas # Lambda functions, as defined in N2927. - #MSVC 1900 cxx_local_type_template_args # Local and unnamed types as template arguments, as defined in N2657. - cxx_long_long_type # long long type, as defined in N1811. - #MSVC 1900 cxx_noexcept # Exception specifications, as defined in N3050. - #MSVC 1900 cxx_nonstatic_member_init # Non-static data member initialization, as defined in N2756. - cxx_nullptr # Null pointer, as defined in N2431. - cxx_override # Override control override keyword, as defined in N2928, N3206 and N3272. - cxx_range_for # Range-based for, as defined in N2930. - cxx_raw_string_literals # Raw string literals, as defined in N2442. - #MSVC 1900 cxx_reference_qualified_functions # Reference qualified functions, as defined in N2439. - cxx_right_angle_brackets # Right angle bracket parsing, as defined in N1757. - cxx_rvalue_references # R-value references, as defined in N2118. - #MSVC 1900 cxx_sizeof_member # Size of non-static data members, as defined in N2253. - cxx_static_assert # Static assert, as defined in N1720. - cxx_strong_enums # Strongly typed enums, as defined in N2347. - #MSVC 1900 cxx_thread_local # Thread-local variables, as defined in N2659. - cxx_trailing_return_types # Automatic function return type, as defined in N2541. - #MSVC 1900 cxx_unicode_literals # Unicode string literals, as defined in N2442. - cxx_uniform_initialization # Uniform initialization, as defined in N2640. - #MSVC 1900 cxx_unrestricted_unions # Unrestricted unions, as defined in N2544. - #MSVC 1900 cxx_user_literals # User-defined literals, as defined in N2765. - cxx_variadic_macros # Variadic macros, as defined in N1653. - cxx_variadic_templates # Variadic templates, as defined in N2242. -) -else() - set(CMAKE_CXX_STANDARD 98) - target_compile_features(jsoncpp_lib PUBLIC) +if(BUILD_OBJECT_LIBS) + set(OBJECT_LIB ${PROJECT_NAME}_object) + add_library(${OBJECT_LIB} OBJECT ${PUBLIC_HEADERS} ${JSONCPP_SOURCES}) + set_target_properties( ${OBJECT_LIB} PROPERTIES + OUTPUT_NAME jsoncpp + VERSION ${JSONCPP_VERSION} + SOVERSION ${JSONCPP_SOVERSION} + POSITION_INDEPENDENT_CODE ON + ) + + # Set library's runtime search path on OSX + if(APPLE) + set_target_properties(${OBJECT_LIB} PROPERTIES INSTALL_RPATH "@loader_path/.") + endif() + + COMPILE_FEATURES(${OBJECT_LIB}) + + if(NOT CMAKE_VERSION VERSION_LESS 2.8.11) + target_include_directories(${OBJECT_LIB} PUBLIC + $ + $ + $ + ) + endif() + + list(APPEND CMAKE_TARGETS ${OBJECT_LIB}) endif() -install(TARGETS jsoncpp_lib ${INSTALL_EXPORT} +install(TARGETS ${CMAKE_TARGETS} ${INSTALL_EXPORT} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + OBJECTS DESTINATION ${CMAKE_INSTALL_LIBDIR} ) -if(NOT CMAKE_VERSION VERSION_LESS 2.8.11) - target_include_directories(jsoncpp_lib PUBLIC - $ - $ - $ - ) -endif() diff --git a/src/test_lib_json/CMakeLists.txt b/src/test_lib_json/CMakeLists.txt index b803db6..1c3fce9 100644 --- a/src/test_lib_json/CMakeLists.txt +++ b/src/test_lib_json/CMakeLists.txt @@ -15,8 +15,10 @@ if(BUILD_SHARED_LIBS) else() add_definitions( -DJSON_DLL ) endif() + target_link_libraries(jsoncpp_test jsoncpp_lib) +else() + target_link_libraries(jsoncpp_test jsoncpp_static) endif() -target_link_libraries(jsoncpp_test jsoncpp_lib) # another way to solve issue #90 #set_target_properties(jsoncpp_test PROPERTIES COMPILE_FLAGS -ffloat-store)