- New CMake based build system. Based in part on contribution from
Igor Okulist and Damien Buhl (Patch #14). Added support for running
tests and building with DLL on Windows.
- added missing JSON_API
- Visual Studio DLL: suppressed warning "C4251: <data member>: <type>
needs to have dll-interface to be used by..." via pragma push/pop
in json-cpp headers.
- New header json/version.h now contains version number macros
(JSONCPP_VERSION_MAJOR, JSONCPP_VERSION_MINOR, JSONCPP_VERSION_PATCH
and JSONCPP_VERSION_HEXA). While this header is generated by CMake,
it is committed to ease build with alternate build system
(CMake only update the file when it changes avoid issues with VCS).
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..21c0ebe
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,71 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+PROJECT(jsoncpp)
+ENABLE_TESTING()
+
+OPTION(JSONCPP_WITH_TESTS "Compile and run JsonCpp test executables" ON)
+OPTION(JSONCPP_WITH_POST_BUILD_UNITTEST "Automatically run unit-tests as a post build step" ON)
+
+# Ensures that CMAKE_BUILD_TYPE is visible in cmake-gui on Unix
+IF(NOT WIN32)
+ IF(NOT CMAKE_BUILD_TYPE)
+ SET(CMAKE_BUILD_TYPE Release CACHE STRING
+ "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel Coverage."
+ FORCE)
+ ENDIF(NOT CMAKE_BUILD_TYPE)
+ENDIF(NOT WIN32)
+
+# This ensures shared DLL are in the same dir as executable on Windows.
+# Put all executables / libraries are in a project global directory.
+SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib
+ CACHE PATH "Single directory for all static libraries.")
+SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib
+ CACHE PATH "Single directory for all dynamic libraries on Unix.")
+SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin
+ CACHE PATH "Single directory for all executable and dynamic libraries on Windows.")
+MARK_AS_ADVANCED( CMAKE_RUNTIME_OUTPUT_DIRECTORY CMAKE_LIBRARY_OUTPUT_DIRECTORY CMAKE_ARCHIVE_OUTPUT_DIRECTORY )
+
+# Set variable named ${VAR_NAME} to value ${VALUE}
+FUNCTION(set_using_dynamic_name VAR_NAME VALUE)
+ SET( "${VAR_NAME}" "${VALUE}" PARENT_SCOPE)
+ENDFUNCTION(set_using_dynamic_name)
+
+# Extract major, minor, patch and qualifier from version text
+# Parse a version string "X.Y.Z[-qualifier]" and outputs
+# version parts in ${OUPUT_PREFIX}_MAJOR, _MINOR, _PATCH, _QUALIFIER.
+# If parse succed then ${OUPUT_PREFIX}_FOUND is TRUE.
+MACRO(jsoncpp_parse_version VERSION_TEXT OUPUT_PREFIX)
+ SET(VERSION_REGEX "[0-9]+\\.[0-9]+\\.[0-9]+(-[a-zA-Z0-9_]+)?")
+ IF( ${VERSION_TEXT} MATCHES ${VERSION_REGEX} )
+ STRING(REGEX MATCHALL "[0-9]+|-([A-Za-z0-9_]+)" VERSION_PARTS ${VERSION_TEXT})
+ list(APPEND VERSION_PARTS "") # empty qualifier to handle no qualifier case
+ LIST(GET VERSION_PARTS 0 ${OUPUT_PREFIX}_MAJOR)
+ LIST(GET VERSION_PARTS 1 ${OUPUT_PREFIX}_MINOR)
+ LIST(GET VERSION_PARTS 2 ${OUPUT_PREFIX}_PATCH)
+ LIST(GET VERSION_PARTS 3 ${OUPUT_PREFIX}_QUALIFIER)
+ set_using_dynamic_name( "${OUPUT_PREFIX}_FOUND" TRUE )
+ ELSE( ${VERSION_TEXT} MATCHES ${VERSION_REGEX} )
+ set_using_dynamic_name( "${OUPUT_PREFIX}_FOUND" FALSE )
+ ENDIF( ${VERSION_TEXT} MATCHES ${VERSION_REGEX} )
+ENDMACRO(jsoncpp_parse_version)
+
+# Read out version from "version" file
+FILE(STRINGS "version" JSONCPP_VERSION)
+
+jsoncpp_parse_version( ${JSONCPP_VERSION} JSONCPP_VERSION )
+IF(NOT JSONCPP_VERSION_FOUND)
+ MESSAGE(FATAL_ERROR "Failed to parse version string properly. Expect X.Y.Z[-qualifier]")
+ENDIF(NOT JSONCPP_VERSION_FOUND)
+
+MESSAGE(STATUS "JsonCpp Version: ${JSONCPP_VERSION_MAJOR}.${JSONCPP_VERSION_MINOR}.${JSONCPP_VERSION_PATCH}${JSONCPP_VERSION_QUALIFIER}")
+# File version.h is only regenerated on CMake configure step
+CONFIGURE_FILE( "${PROJECT_SOURCE_DIR}/src/lib_json/version.h.in"
+ "${PROJECT_SOURCE_DIR}/include/json/version.h" )
+
+# Include our configuration header
+INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/include )
+
+# Build the different applications
+ADD_SUBDIRECTORY( src )
+
+#install the includes
+ADD_SUBDIRECTORY( include )
diff --git a/NEWS.txt b/NEWS.txt
index ae4005d..193d166 100644
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -32,21 +32,32 @@
maxInt64 to figure out whether it is approximately representable.
* Value
- - Patch #3393345: BOOST_FOREACH compatibility. Made Json::iterator more
+ - Patch #10: BOOST_FOREACH compatibility. Made Json::iterator more
standard compliant, added missing iterator_category and value_type
typedefs (contribued by Robert A. Iannucci).
* Compilation
- - Patch #3474563: added missing JSON_API on some classes causing link issues
+ - New CMake based build system. Based in part on contribution from
+ Igor Okulist and Damien Buhl (Patch #14).
+
+ - New header json/version.h now contains version number macros
+ (JSONCPP_VERSION_MAJOR, JSONCPP_VERSION_MINOR, JSONCPP_VERSION_PATCH
+ and JSONCPP_VERSION_HEXA).
+
+ - Patch #11: added missing JSON_API on some classes causing link issues
when building as a dynamic library on Windows
(contributed by Francis Bolduc).
+
+ - Visual Studio DLL: suppressed warning "C4251: <data member>: <type>
+ needs to have dll-interface to be used by..." via pragma push/pop
+ in json-cpp headers.
* Bug fixes
- - Patch #3539678: Copy constructor does not initialize allocated_ for stringValue
+ - Patch #15: Copy constructor does not initialize allocated_ for stringValue
(contributed by rmongia).
- - Patch #3600941: Missing field copy in Json::Value::iterator causing infinite
+ - Patch #16: Missing field copy in Json::Value::iterator causing infinite
loop when using experimental internal map (#define JSON_VALUE_USE_INTERNAL_MAP)
(contributed by Ming-Lin Kao).
diff --git a/README.txt b/README.txt
index 88c1178..ca3a486 100644
--- a/README.txt
+++ b/README.txt
@@ -13,9 +13,65 @@
Unserialization parsing is user friendly and provides precise error reports.
+* Using json-cpp in your project:
+ ===============================
-* Building/Testing:
- =================
+The recommended approach to integrate json-cpp in your project is to
+build the the amalgamated source (a single .cpp) with your own build
+system. This ensures compilation flags consistency and ABI compatibility.
+
+See section "Generating amalgamated source and header" to generate them
+from the source distribution.
+
+Directory include/ should be added to your compiler include path.
+json-cpp headers should be included as follow:
+
+ #include <json/json.h>
+
+If json-cpp was build as a dynamic library on Windows, then your project
+need to define macro "JSON_DLL" to JSON_API should import exported symbols.
+
+* Building/Testing with new CMake build system:
+ =============================================
+
+CMake is a C++ Makefiles/Solution generator that can be downloaded from:
+ http://www.cmake.org
+
+It is usually available on most Linux system as package. On Ubuntu:
+ sudo apt-get install cmake
+
+Notes that python is also required to run JSON reader/writer tests. If
+missing, the build will skip running those tests.
+
+When running CMake, a few parameters are required:
+- a build directory where the makefiles/solution are generated. It is
+ also used to store objects, libraries and executables files.
+- the generator to use: makefiles or Visual Studio solution? What version
+ or Visual Studio, 32 or 64 bits solution?
+
+Generating solution/makefiles using cmake-gui:
+- Makes "source code" points the source directory
+- Makes "where to build the binary" points to the directory to use for
+ the build.
+- Click on the "Grouped" check box
+- Review JsonCpp build option (tick JSONCPP_LIB_BUILD_SHARED to build as
+ a dynamic library)
+- Click configure button at the bottom, then the generate button.
+- The generated solution/makefiles can be found in the binary directory.
+
+Alternatively, from the command-line on Unix in the source directory:
+
+ mkdir -p ../build/debug
+ cmake -DCMAKE_BUILD_TYPE=debug -DJSONCPP_LIB_BUILD_SHARED=OFF -G "Unix Makefiles" ../build/debug
+ (cd ../build/debug && make)
+
+Running "cmake -h" will display the list of available generators (passed as -G option).
+
+By default CMake hides compilation command-line. This can be modified by specifying:
+-DCMAKE_VERBOSE_MAKEFILE=true when generating makefiles.
+
+* Building/Testing with the legacy build system based on SCons:
+ =============================================================
JsonCpp uses Scons (http://www.scons.org) as a build system. Scons requires
python to be installed (http://www.python.org).
@@ -47,7 +103,6 @@
and TARGET may be:
check: build library and run unit tests.
-
* Running the test manually:
==========================
@@ -115,15 +170,6 @@
correct order and defining macro JSON_IS_AMALGAMATION to prevent inclusion
of other headers.
-* Using json-cpp in your project:
- ===============================
-
-include/ should be added to your compiler include path. jsoncpp headers
-should be included as follow:
-
-#include <json/json.h>
-
-
* Adding a reader/writer test:
============================
diff --git a/amalgamate.py b/amalgamate.py
index 2ced51b..5222655 100644
--- a/amalgamate.py
+++ b/amalgamate.py
@@ -66,6 +66,7 @@
header.add_text( '/// If defined, indicates that the source file is amalgated' )
header.add_text( '/// to prevent private header inclusion.' )
header.add_text( '#define JSON_IS_AMALGAMATION' )
+ header.add_file( 'include/json/version.h' )
header.add_file( 'include/json/config.h' )
header.add_file( 'include/json/forwards.h' )
header.add_file( 'include/json/features.h' )
diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt
new file mode 100644
index 0000000..7d832a0
--- /dev/null
+++ b/include/CMakeLists.txt
@@ -0,0 +1,2 @@
+FILE(GLOB INCLUDE_FILES "json/*.h")
+INSTALL(FILES ${INCLUDE_FILES} DESTINATION include/json)
diff --git a/include/json/config.h b/include/json/config.h
index 72437c4..c9b298d 100644
--- a/include/json/config.h
+++ b/include/json/config.h
@@ -46,10 +46,17 @@
# ifdef JSON_IN_CPPTL
# define JSON_API CPPTL_API
# elif defined(JSON_DLL_BUILD)
-# define JSON_API __declspec(dllexport)
+# if defined(_MSC_VER)
+# define JSON_API __declspec(dllexport)
+# define JSONCPP_DISABLE_DLL_INTERFACE_WARNING
+# endif // if defined(_MSC_VER)
# elif defined(JSON_DLL)
-# define JSON_API __declspec(dllimport)
-# else
+# if defined(_MSC_VER)
+# define JSON_API __declspec(dllimport)
+# define JSONCPP_DISABLE_DLL_INTERFACE_WARNING
+# endif // if defined(_MSC_VER)
+# endif // ifdef JSON_IN_CPPTL
+# if !defined(JSON_API)
# define JSON_API
# endif
diff --git a/include/json/reader.h b/include/json/reader.h
index a3023b3..189da57 100644
--- a/include/json/reader.h
+++ b/include/json/reader.h
@@ -14,6 +14,13 @@
# include <stack>
# include <string>
+// Disable warning C4251: <data member>: <type> needs to have dll-interface to be used by...
+#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
+# pragma warning(push)
+# pragma warning(disable:4251)
+#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
+
+
namespace Json {
/** \brief Unserialize a <a HREF="http://www.json.org">JSON</a> document into a Value.
@@ -206,8 +213,13 @@
\throw std::exception on parse error.
\see Json::operator<<()
*/
- std::istream& operator>>( std::istream&, Value& );
+ JSON_API std::istream& operator>>( std::istream&, Value& );
} // namespace Json
+#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
+# pragma warning(pop)
+#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
+
+
#endif // CPPTL_JSON_READER_H_INCLUDED
diff --git a/include/json/value.h b/include/json/value.h
index 6daa8d1..bd7f181 100644
--- a/include/json/value.h
+++ b/include/json/value.h
@@ -21,6 +21,13 @@
# include <cpptl/forwards.h>
# endif
+// Disable warning C4251: <data member>: <type> needs to have dll-interface to be used by...
+#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
+# pragma warning(push)
+# pragma warning(disable:4251)
+#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
+
+
/** \brief JSON (JavaScript Object Notation).
*/
namespace Json {
@@ -1109,4 +1116,9 @@
} // namespace Json
+#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
+# pragma warning(pop)
+#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
+
+
#endif // CPPTL_JSON_H_INCLUDED
diff --git a/include/json/version.h b/include/json/version.h
new file mode 100644
index 0000000..9e1efcc
--- /dev/null
+++ b/include/json/version.h
@@ -0,0 +1,14 @@
+// DO NOT EDIT. This file is generated by CMake from "version"
+// and "version.h.in" files.
+// Run CMake configure step to update it.
+#ifndef JSON_VERSION_H_INCLUDED
+# define JSON_VERSION_H_INCLUDED
+
+# define JSONCPP_VERSION_STRING "0.6.0-dev"
+# define JSONCPP_VERSION_MAJOR 0
+# define JSONCPP_VERSION_MINOR 6
+# define JSONCPP_VERSION_PATCH 0
+# define JSONCPP_VERSION_QUALIFIER -dev
+# define JSONCPP_VERSION_HEXA ((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) | (JSONCPP_VERSION_PATCH << 8))
+
+#endif // JSON_VERSION_H_INCLUDED
diff --git a/include/json/writer.h b/include/json/writer.h
index 46d5ccc..23ebd50 100644
--- a/include/json/writer.h
+++ b/include/json/writer.h
@@ -12,6 +12,13 @@
# include <vector>
# include <string>
+// Disable warning C4251: <data member>: <type> needs to have dll-interface to be used by...
+#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
+# pragma warning(push)
+# pragma warning(disable:4251)
+#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
+
+
namespace Json {
class Value;
@@ -183,10 +190,14 @@
/// \brief Output using the StyledStreamWriter.
/// \see Json::operator>>()
- std::ostream& operator<<( std::ostream&, const Value &root );
+ JSON_API std::ostream& operator<<( std::ostream&, const Value &root );
} // namespace Json
+#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
+# pragma warning(pop)
+#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
+
#endif // JSON_WRITER_H_INCLUDED
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
new file mode 100644
index 0000000..608d3f7
--- /dev/null
+++ b/src/CMakeLists.txt
@@ -0,0 +1,5 @@
+ADD_SUBDIRECTORY(lib_json)
+IF(JSONCPP_WITH_TESTS)
+ ADD_SUBDIRECTORY(jsontestrunner)
+ ADD_SUBDIRECTORY(test_lib_json)
+ENDIF(JSONCPP_WITH_TESTS)
diff --git a/src/jsontestrunner/CMakeLists.txt b/src/jsontestrunner/CMakeLists.txt
new file mode 100644
index 0000000..7ab2f00
--- /dev/null
+++ b/src/jsontestrunner/CMakeLists.txt
@@ -0,0 +1,23 @@
+FIND_PACKAGE(PythonInterp 2.6 REQUIRED)
+
+IF(JSONCPP_LIB_BUILD_SHARED)
+ ADD_DEFINITIONS( -DJSON_DLL )
+ENDIF(JSONCPP_LIB_BUILD_SHARED)
+
+ADD_EXECUTABLE(jsontestrunner_exe
+ main.cpp
+ )
+TARGET_LINK_LIBRARIES(jsontestrunner_exe jsoncpp_lib)
+SET_TARGET_PROPERTIES(jsontestrunner_exe PROPERTIES OUTPUT_NAME jsontestrunner_exe)
+
+IF(PYTHONINTERP_FOUND)
+ # Run end to end parser/writer tests
+ GET_PROPERTY(JSONTESTRUNNER_EXE_PATH TARGET jsontestrunner_exe PROPERTY LOCATION)
+ SET(TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../test)
+ SET(RUNJSONTESTS_PATH ${TEST_DIR}/runjsontests.py)
+ ADD_CUSTOM_TARGET(jsoncpp_readerwriter_tests ALL
+ "${PYTHON_EXECUTABLE}" -B "${RUNJSONTESTS_PATH}" "${JSONTESTRUNNER_EXE_PATH}" "${TEST_DIR}/data"
+ DEPENDS jsontestrunner_exe jsoncpp_test
+ )
+ ADD_CUSTOM_TARGET(jsoncpp_check DEPENDS jsoncpp_readerwriter_tests)
+ENDIF(PYTHONINTERP_FOUND)
diff --git a/src/lib_json/CMakeLists.txt b/src/lib_json/CMakeLists.txt
new file mode 100644
index 0000000..39aa0b3
--- /dev/null
+++ b/src/lib_json/CMakeLists.txt
@@ -0,0 +1,43 @@
+OPTION(JSONCPP_LIB_BUILD_SHARED "Build jsoncpp_lib as a shared library." OFF)
+IF(JSONCPP_LIB_BUILD_SHARED)
+ SET(JSONCPP_LIB_TYPE SHARED)
+ ADD_DEFINITIONS( -DJSON_DLL_BUILD )
+ELSE(JSONCPP_LIB_BUILD_SHARED)
+ SET(JSONCPP_LIB_TYPE STATIC)
+ENDIF(JSONCPP_LIB_BUILD_SHARED)
+
+
+SET( JSONCPP_INCLUDE_DIR ../../include )
+
+SET( PUBLIC_HEADERS
+ ${JSONCPP_INCLUDE_DIR}/json/config.h
+ ${JSONCPP_INCLUDE_DIR}/json/forwards.h
+ ${JSONCPP_INCLUDE_DIR}/json/features.h
+ ${JSONCPP_INCLUDE_DIR}/json/value.h
+ ${JSONCPP_INCLUDE_DIR}/json/reader.h
+ ${JSONCPP_INCLUDE_DIR}/json/writer.h
+ ${JSONCPP_INCLUDE_DIR}/json/assertions.h
+ ${JSONCPP_INCLUDE_DIR}/json/version.h
+ )
+
+SOURCE_GROUP( "Public API" FILES ${PUBLIC_HEADERS} )
+
+ADD_LIBRARY( jsoncpp_lib ${JSONCPP_LIB_TYPE}
+ ${PUBLIC_HEADERS}
+ json_tool.h
+ json_reader.cpp
+ json_batchallocator.h
+ json_valueiterator.inl
+ json_value.cpp
+ json_writer.cpp
+ version.h.in
+ )
+SET_TARGET_PROPERTIES( jsoncpp_lib PROPERTIES OUTPUT_NAME jsoncpp )
+SET_TARGET_PROPERTIES( jsoncpp_lib PROPERTIES VERSION ${JSON_CPP_VERSION} SOVERSION ${JSON_CPP_VERSION} )
+
+# Install instructions for this target
+INSTALL( TARGETS jsoncpp_lib
+ RUNTIME DESTINATION bin
+ LIBRARY DESTINATION lib
+ ARCHIVE DESTINATION lib
+)
diff --git a/src/lib_json/version.h.in b/src/lib_json/version.h.in
new file mode 100644
index 0000000..217bcff
--- /dev/null
+++ b/src/lib_json/version.h.in
@@ -0,0 +1,14 @@
+// DO NOT EDIT. This file is generated by CMake from "version"
+// and "version.h.in" files.
+// Run CMake configure step to update it.
+#ifndef JSON_VERSION_H_INCLUDED
+# define JSON_VERSION_H_INCLUDED
+
+# define JSONCPP_VERSION_STRING "@JSONCPP_VERSION@"
+# define JSONCPP_VERSION_MAJOR @JSONCPP_VERSION_MAJOR@
+# define JSONCPP_VERSION_MINOR @JSONCPP_VERSION_MINOR@
+# define JSONCPP_VERSION_PATCH @JSONCPP_VERSION_PATCH@
+# define JSONCPP_VERSION_QUALIFIER @JSONCPP_VERSION_QUALIFIER@
+# define JSONCPP_VERSION_HEXA ((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) | (JSONCPP_VERSION_PATCH << 8))
+
+#endif // JSON_VERSION_H_INCLUDED
diff --git a/src/test_lib_json/CMakeLists.txt b/src/test_lib_json/CMakeLists.txt
new file mode 100644
index 0000000..563f713
--- /dev/null
+++ b/src/test_lib_json/CMakeLists.txt
@@ -0,0 +1,21 @@
+
+IF(JSONCPP_LIB_BUILD_SHARED)
+ ADD_DEFINITIONS( -DJSON_DLL )
+ENDIF(JSONCPP_LIB_BUILD_SHARED)
+
+ADD_EXECUTABLE( jsoncpp_test
+ jsontest.cpp
+ main.cpp
+ )
+
+TARGET_LINK_LIBRARIES(jsoncpp_test jsoncpp_lib)
+
+# Run unit tests in post-build
+# (default cmake workflow hides away the test result into a file, resulting in poor dev workflow?!?)
+IF(JSONCPP_WITH_POST_BUILD_UNITTEST)
+ ADD_CUSTOM_COMMAND( TARGET jsoncpp_test
+ POST_BUILD
+ COMMAND jsoncpp_test)
+ENDIF(JSONCPP_WITH_POST_BUILD_UNITTEST)
+
+SET_TARGET_PROPERTIES(jsoncpp_test PROPERTIES OUTPUT_NAME jsoncpp_test)