Cleanup versioning strategy (#989)
* Cleanup versioning strategy
Currently, versioning is a mess. CMake and Meson have seperate build
version number storage locations, with no way of knowing you need to
have both. Plus, due to recent revisions the amalgamate script is broken
unless you build first, and may still be broken afterwards.
This PR fixes some issues with versioning, and adds comments clarifying
what has to be done when doing a release.
* Run clang format
* Update SOVERSION....
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 381d08b..b4eb830 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -63,11 +63,18 @@
endif()
project(JSONCPP
- VERSION 1.9.0 # <major>[.<minor>[.<patch>[.<tweak>]]]
+ # Note: version must be updated in three places when doing a release. This
+ # annoying process ensures that amalgamate, CMake, and meson all report the
+ # correct version.
+ # 1. /meson.build
+ # 2. /include/json/version.h
+ # 3. /CMakeLists.txt
+ # IMPORTANT: also update the SOVERSION!!
+ VERSION 1.9.2 # <major>[.<minor>[.<patch>[.<tweak>]]]
LANGUAGES CXX)
message(STATUS "JsonCpp Version: ${JSONCPP_VERSION_MAJOR}.${JSONCPP_VERSION_MINOR}.${JSONCPP_VERSION_PATCH}")
-set( JSONCPP_SOVERSION 21 )
+set( JSONCPP_SOVERSION 22 )
option(JSONCPP_WITH_TESTS "Compile and (for jsoncpp_check) run JsonCpp test executables" ON)
option(JSONCPP_WITH_POST_BUILD_UNITTEST "Automatically run unit-tests as a post build step" ON)
@@ -89,10 +96,6 @@
set(JSONCPP_USE_SECURE_MEMORY "0" CACHE STRING "-D...=1 to use memory-wiping allocator for STL" )
-# File version.h is only regenerated on CMake configure step
-configure_file( "${PROJECT_SOURCE_DIR}/src/lib_json/version.h.in"
- "${PROJECT_BINARY_DIR}/include/json/version.h"
- NEWLINE_STYLE UNIX )
configure_file( "${PROJECT_SOURCE_DIR}/version.in"
"${PROJECT_BINARY_DIR}/version"
NEWLINE_STYLE UNIX )
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index b7e4ab7..3e14b2b 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -26,7 +26,6 @@
LIB_TYPE=shared
#LIB_TYPE=static
meson --buildtype ${BUILD_TYPE} --default-library ${LIB_TYPE} . build-${LIB_TYPE}
- #ninja -v -C build-${LIB_TYPE} test # This stopped working on my Mac.
ninja -v -C build-${LIB_TYPE}
cd build-${LIB_TYPE}
meson test --no-rebuild --print-errorlogs
diff --git a/amalgamate.py b/amalgamate.py
old mode 100644
new mode 100755
index c12215a..7b41e2e
--- a/amalgamate.py
+++ b/amalgamate.py
@@ -1,3 +1,5 @@
+#!/usr/bin/env python
+
"""Amalgamate json-cpp library sources into a single source and header file.
Works with python2.6+ and python3.4+.
@@ -9,6 +11,9 @@
import os.path
import sys
+INCLUDE_PATH = "include/json"
+SRC_PATH = "src/lib_json"
+
class AmalgamationFile:
def __init__(self, top_dir):
self.top_dir = top_dir
@@ -66,15 +71,15 @@
header.add_text("/// If defined, indicates that the source file is amalgamated")
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/allocator.h")
- header.add_file("include/json/config.h")
- header.add_file("include/json/forwards.h")
- header.add_file("include/json/features.h")
- header.add_file("include/json/value.h")
- header.add_file("include/json/reader.h")
- header.add_file("include/json/writer.h")
- header.add_file("include/json/assertions.h")
+ header.add_file(os.path.join(INCLUDE_PATH, "version.h"))
+ header.add_file(os.path.join(INCLUDE_PATH, "allocator.h"))
+ header.add_file(os.path.join(INCLUDE_PATH, "config.h"))
+ header.add_file(os.path.join(INCLUDE_PATH, "forwards.h"))
+ header.add_file(os.path.join(INCLUDE_PATH, "features.h"))
+ header.add_file(os.path.join(INCLUDE_PATH, "value.h"))
+ header.add_file(os.path.join(INCLUDE_PATH, "reader.h"))
+ header.add_file(os.path.join(INCLUDE_PATH, "writer.h"))
+ header.add_file(os.path.join(INCLUDE_PATH, "assertions.h"))
header.add_text("#endif //ifndef JSON_AMALGAMATED_H_INCLUDED")
target_header_path = os.path.join(os.path.dirname(target_source_path), header_include_path)
@@ -94,8 +99,8 @@
header.add_text("/// If defined, indicates that the source file is amalgamated")
header.add_text("/// to prevent private header inclusion.")
header.add_text("#define JSON_IS_AMALGAMATION")
- header.add_file("include/json/config.h")
- header.add_file("include/json/forwards.h")
+ header.add_file(os.path.join(INCLUDE_PATH, "config.h"))
+ header.add_file(os.path.join(INCLUDE_PATH, "forwards.h"))
header.add_text("#endif //ifndef JSON_FORWARD_AMALGAMATED_H_INCLUDED")
target_forward_header_path = os.path.join(os.path.dirname(target_source_path),
@@ -116,12 +121,11 @@
#endif
""")
source.add_text("")
- lib_json = "src/lib_json"
- source.add_file(os.path.join(lib_json, "json_tool.h"))
- source.add_file(os.path.join(lib_json, "json_reader.cpp"))
- source.add_file(os.path.join(lib_json, "json_valueiterator.inl"))
- source.add_file(os.path.join(lib_json, "json_value.cpp"))
- source.add_file(os.path.join(lib_json, "json_writer.cpp"))
+ source.add_file(os.path.join(SRC_PATH, "json_tool.h"))
+ source.add_file(os.path.join(SRC_PATH, "json_reader.cpp"))
+ source.add_file(os.path.join(SRC_PATH, "json_valueiterator.inl"))
+ source.add_file(os.path.join(SRC_PATH, "json_value.cpp"))
+ source.add_file(os.path.join(SRC_PATH, "json_writer.cpp"))
print("Writing amalgamated source to %r" % target_source_path)
source.write_to(target_source_path)
diff --git a/include/json/reader.h b/include/json/reader.h
index f8158cf..adbe299 100644
--- a/include/json/reader.h
+++ b/include/json/reader.h
@@ -378,7 +378,7 @@
/** \brief Read from 'sin' into 'root'.
*
* Always keep comments from the input JSON.
- *
+ *
* This can be used to read a file into a particular sub-object.
* For example:
* \code
diff --git a/include/json/version.h b/include/json/version.h
new file mode 100644
index 0000000..ff94372
--- /dev/null
+++ b/include/json/version.h
@@ -0,0 +1,28 @@
+#ifndef JSON_VERSION_H_INCLUDED
+#define JSON_VERSION_H_INCLUDED
+
+// Note: version must be updated in three places when doing a release. This
+// annoying process ensures that amalgamate, CMake, and meson all report the
+// correct version.
+// 1. /meson.build
+// 2. /include/json/version.h
+// 3. /CMakeLists.txt
+// IMPORTANT: also update the SOVERSION!!
+
+#define JSONCPP_VERSION_STRING "1.9.2"
+#define JSONCPP_VERSION_MAJOR 1
+#define JSONCPP_VERSION_MINOR 9
+#define JSONCPP_VERSION_PATCH 2
+#define JSONCPP_VERSION_QUALIFIER
+#define JSONCPP_VERSION_HEXA \
+ ((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) | \
+ (JSONCPP_VERSION_PATCH << 8))
+
+#ifdef JSONCPP_USING_SECURE_MEMORY
+#undef JSONCPP_USING_SECURE_MEMORY
+#endif
+#define JSONCPP_USING_SECURE_MEMORY 0
+// If non-zero, the library zeroes any memory that it has allocated before
+// it frees its memory.
+
+#endif // JSON_VERSION_H_INCLUDED
diff --git a/meson.build b/meson.build
index 8de947c..d1f4989 100644
--- a/meson.build
+++ b/meson.build
@@ -1,7 +1,15 @@
project(
'jsoncpp',
'cpp',
- version : '1.9.0',
+
+ # Note: version must be updated in three places when doing a release. This
+ # annoying process ensures that amalgamate, CMake, and meson all report the
+ # correct version.
+ # 1. /meson.build
+ # 2. /include/json/version.h
+ # 3. /CMakeLists.txt
+ # IMPORTANT: also update the SOVERSION!!
+ version : '1.9.2',
default_options : [
'buildtype=release',
'cpp_std=c++11',
@@ -9,25 +17,6 @@
license : 'Public Domain',
meson_version : '>= 0.50.0')
-jsoncpp_ver_arr = meson.project_version().split('.')
-jsoncpp_major_version = jsoncpp_ver_arr[0]
-jsoncpp_minor_version = jsoncpp_ver_arr[1]
-jsoncpp_patch_version = jsoncpp_ver_arr[2]
-
-jsoncpp_cdata = configuration_data()
-jsoncpp_cdata.set('JSONCPP_VERSION', meson.project_version())
-jsoncpp_cdata.set('JSONCPP_VERSION_MAJOR', jsoncpp_major_version)
-jsoncpp_cdata.set('JSONCPP_VERSION_MINOR', jsoncpp_minor_version)
-jsoncpp_cdata.set('JSONCPP_VERSION_PATCH', jsoncpp_patch_version)
-jsoncpp_cdata.set('JSONCPP_USE_SECURE_MEMORY',0)
-
-jsoncpp_gen_sources = configure_file(
- input : 'src/lib_json/version.h.in',
- output : 'version.h',
- configuration : jsoncpp_cdata,
- install : true,
- install_dir : join_paths(get_option('prefix'), get_option('includedir'), 'json')
-)
jsoncpp_headers = [
'include/json/allocator.h',
@@ -39,6 +28,7 @@
'include/json/json.h',
'include/json/reader.h',
'include/json/value.h',
+ 'include/json/version.h',
'include/json/writer.h']
jsoncpp_include_directories = include_directories('include')
@@ -56,13 +46,12 @@
jsoncpp_lib = library(
'jsoncpp',
- [ jsoncpp_gen_sources,
- jsoncpp_headers,
+ [ jsoncpp_headers,
'src/lib_json/json_tool.h',
'src/lib_json/json_reader.cpp',
'src/lib_json/json_value.cpp',
'src/lib_json/json_writer.cpp'],
- soversion : 21,
+ soversion : 22,
install : true,
include_directories : jsoncpp_include_directories,
cpp_args: dll_export_flag)
@@ -79,7 +68,7 @@
include_directories : jsoncpp_include_directories,
link_with : jsoncpp_lib,
version : meson.project_version(),
- sources : jsoncpp_gen_sources)
+ )
# tests
python = import('python3').find_python()
diff --git a/src/lib_json/CMakeLists.txt b/src/lib_json/CMakeLists.txt
index 2392092..0fa2f59 100644
--- a/src/lib_json/CMakeLists.txt
+++ b/src/lib_json/CMakeLists.txt
@@ -45,9 +45,9 @@
${JSONCPP_INCLUDE_DIR}/json/features.h
${JSONCPP_INCLUDE_DIR}/json/value.h
${JSONCPP_INCLUDE_DIR}/json/reader.h
+ ${JSONCPP_INCLUDE_DIR}/json/version.h
${JSONCPP_INCLUDE_DIR}/json/writer.h
${JSONCPP_INCLUDE_DIR}/json/assertions.h
- ${PROJECT_BINARY_DIR}/include/json/version.h
)
source_group( "Public API" FILES ${PUBLIC_HEADERS} )
@@ -57,8 +57,7 @@
json_reader.cpp
json_valueiterator.inl
json_value.cpp
- json_writer.cpp
- version.h.in)
+ json_writer.cpp)
# Install instructions for this target
if(JSONCPP_WITH_CMAKE_PACKAGE)
diff --git a/src/lib_json/version.h.in b/src/lib_json/version.h.in
deleted file mode 100644
index 4cf439c..0000000
--- a/src/lib_json/version.h.in
+++ /dev/null
@@ -1,22 +0,0 @@
-// DO NOT EDIT. This file (and "version") is a template used by the build system
-// (either CMake or Meson) to generate a "version.h" header file.
-#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
-#define JSONCPP_VERSION_HEXA ((JSONCPP_VERSION_MAJOR << 24) \
- | (JSONCPP_VERSION_MINOR << 16) \
- | (JSONCPP_VERSION_PATCH << 8))
-
-#ifdef JSONCPP_USING_SECURE_MEMORY
-#undef JSONCPP_USING_SECURE_MEMORY
-#endif
-#define JSONCPP_USING_SECURE_MEMORY @JSONCPP_USE_SECURE_MEMORY@
-// If non-zero, the library zeroes any memory that it has allocated before
-// it frees its memory.
-
-#endif // JSON_VERSION_H_INCLUDED
diff --git a/version.txt b/version.txt
deleted file mode 100644
index bfa363e..0000000
--- a/version.txt
+++ /dev/null
@@ -1 +0,0 @@
-1.8.4