Cleanup versioning strategy relanding (#989) (#997)

* 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....
This commit is contained in:
Jordan Bayles 2019-08-13 22:41:43 -07:00 committed by GitHub
parent 0d27381acf
commit 7b28698c5c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 81 additions and 85 deletions

2
.gitignore vendored
View File

@ -10,8 +10,6 @@
/libs/ /libs/
/doc/doxyfile /doc/doxyfile
/dist/ /dist/
#/version
#/include/json/version.h
# MSVC project files: # MSVC project files:
*.sln *.sln

View File

@ -63,11 +63,18 @@ if(NOT DEFINED CMAKE_BUILD_TYPE)
endif() endif()
project(JSONCPP 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) LANGUAGES CXX)
message(STATUS "JsonCpp Version: ${JSONCPP_VERSION_MAJOR}.${JSONCPP_VERSION_MINOR}.${JSONCPP_VERSION_PATCH}") 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_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) option(JSONCPP_WITH_POST_BUILD_UNITTEST "Automatically run unit-tests as a post build step" ON)
@ -89,10 +96,6 @@ set(DEBUG_LIBNAME_SUFFIX "" CACHE STRING "Optional suffix to append to the libra
set(JSONCPP_USE_SECURE_MEMORY "0" CACHE STRING "-D...=1 to use memory-wiping allocator for STL" ) 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" configure_file( "${PROJECT_SOURCE_DIR}/version.in"
"${PROJECT_BINARY_DIR}/version" "${PROJECT_BINARY_DIR}/version"
NEWLINE_STYLE UNIX ) NEWLINE_STYLE UNIX )

View File

@ -26,7 +26,6 @@ Then,
LIB_TYPE=shared LIB_TYPE=shared
#LIB_TYPE=static #LIB_TYPE=static
meson --buildtype ${BUILD_TYPE} --default-library ${LIB_TYPE} . build-${LIB_TYPE} 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} ninja -v -C build-${LIB_TYPE}
cd build-${LIB_TYPE} cd build-${LIB_TYPE}
meson test --no-rebuild --print-errorlogs meson test --no-rebuild --print-errorlogs

38
amalgamate.py Normal file → Executable file
View File

@ -1,3 +1,5 @@
#!/usr/bin/env python
"""Amalgamate json-cpp library sources into a single source and header file. """Amalgamate json-cpp library sources into a single source and header file.
Works with python2.6+ and python3.4+. Works with python2.6+ and python3.4+.
@ -9,6 +11,9 @@ import os
import os.path import os.path
import sys import sys
INCLUDE_PATH = "include/json"
SRC_PATH = "src/lib_json"
class AmalgamationFile: class AmalgamationFile:
def __init__(self, top_dir): def __init__(self, top_dir):
self.top_dir = top_dir self.top_dir = top_dir
@ -66,15 +71,15 @@ def amalgamate_source(source_top_dir=None,
header.add_text("/// If defined, indicates that the source file is amalgamated") header.add_text("/// If defined, indicates that the source file is amalgamated")
header.add_text("/// to prevent private header inclusion.") header.add_text("/// to prevent private header inclusion.")
header.add_text("#define JSON_IS_AMALGAMATION") header.add_text("#define JSON_IS_AMALGAMATION")
header.add_file("include/json/version.h") header.add_file(os.path.join(INCLUDE_PATH, "version.h"))
header.add_file("include/json/allocator.h") header.add_file(os.path.join(INCLUDE_PATH, "allocator.h"))
header.add_file("include/json/config.h") header.add_file(os.path.join(INCLUDE_PATH, "config.h"))
header.add_file("include/json/forwards.h") header.add_file(os.path.join(INCLUDE_PATH, "forwards.h"))
header.add_file("include/json/features.h") header.add_file(os.path.join(INCLUDE_PATH, "features.h"))
header.add_file("include/json/value.h") header.add_file(os.path.join(INCLUDE_PATH, "value.h"))
header.add_file("include/json/reader.h") header.add_file(os.path.join(INCLUDE_PATH, "reader.h"))
header.add_file("include/json/writer.h") header.add_file(os.path.join(INCLUDE_PATH, "writer.h"))
header.add_file("include/json/assertions.h") header.add_file(os.path.join(INCLUDE_PATH, "assertions.h"))
header.add_text("#endif //ifndef JSON_AMALGAMATED_H_INCLUDED") header.add_text("#endif //ifndef JSON_AMALGAMATED_H_INCLUDED")
target_header_path = os.path.join(os.path.dirname(target_source_path), header_include_path) target_header_path = os.path.join(os.path.dirname(target_source_path), header_include_path)
@ -94,8 +99,8 @@ def amalgamate_source(source_top_dir=None,
header.add_text("/// If defined, indicates that the source file is amalgamated") header.add_text("/// If defined, indicates that the source file is amalgamated")
header.add_text("/// to prevent private header inclusion.") header.add_text("/// to prevent private header inclusion.")
header.add_text("#define JSON_IS_AMALGAMATION") header.add_text("#define JSON_IS_AMALGAMATION")
header.add_file("include/json/config.h") header.add_file(os.path.join(INCLUDE_PATH, "config.h"))
header.add_file("include/json/forwards.h") header.add_file(os.path.join(INCLUDE_PATH, "forwards.h"))
header.add_text("#endif //ifndef JSON_FORWARD_AMALGAMATED_H_INCLUDED") header.add_text("#endif //ifndef JSON_FORWARD_AMALGAMATED_H_INCLUDED")
target_forward_header_path = os.path.join(os.path.dirname(target_source_path), target_forward_header_path = os.path.join(os.path.dirname(target_source_path),
@ -116,12 +121,11 @@ def amalgamate_source(source_top_dir=None,
#endif #endif
""") """)
source.add_text("") source.add_text("")
lib_json = "src/lib_json" source.add_file(os.path.join(SRC_PATH, "json_tool.h"))
source.add_file(os.path.join(lib_json, "json_tool.h")) source.add_file(os.path.join(SRC_PATH, "json_reader.cpp"))
source.add_file(os.path.join(lib_json, "json_reader.cpp")) source.add_file(os.path.join(SRC_PATH, "json_valueiterator.inl"))
source.add_file(os.path.join(lib_json, "json_valueiterator.inl")) source.add_file(os.path.join(SRC_PATH, "json_value.cpp"))
source.add_file(os.path.join(lib_json, "json_value.cpp")) source.add_file(os.path.join(SRC_PATH, "json_writer.cpp"))
source.add_file(os.path.join(lib_json, "json_writer.cpp"))
print("Writing amalgamated source to %r" % target_source_path) print("Writing amalgamated source to %r" % target_source_path)
source.write_to(target_source_path) source.write_to(target_source_path)

View File

@ -3,7 +3,7 @@
\section _intro Introduction \section _intro Introduction
<a HREF="http://www.json.org/">JSON (JavaScript Object Notation)</a> <a HREF="http://www.json.org/">JSON (JavaScript Object Notation)</a>
is a lightweight data-interchange format. is a lightweight data-interchange format.
Here is an example of JSON data: Here is an example of JSON data:
\verbatim \verbatim
@ -23,14 +23,14 @@ Here is an example of JSON data:
{ {
// Default encoding for text // Default encoding for text
"encoding" : "UTF-8", "encoding" : "UTF-8",
// Plug-ins loaded at start-up // Plug-ins loaded at start-up
"plug-ins" : [ "plug-ins" : [
"python", "python",
"c++", // trailing comment "c++", // trailing comment
"ruby" "ruby"
], ],
// Tab indent size // Tab indent size
// (multi-line comment) // (multi-line comment)
"indent" : { /*embedded comment*/ "length" : 3, "use_space": true } "indent" : { /*embedded comment*/ "length" : 3, "use_space": true }
@ -67,7 +67,7 @@ const Json::Value plugins = root["plug-ins"];
// Iterate over the sequence elements. // Iterate over the sequence elements.
for ( int index = 0; index < plugins.size(); ++index ) for ( int index = 0; index < plugins.size(); ++index )
loadPlugIn( plugins[index].asString() ); loadPlugIn( plugins[index].asString() );
// Try other datatypes. Some are auto-convertible to others. // Try other datatypes. Some are auto-convertible to others.
foo::setIndentLength( root["indent"].get("length", 3).asInt() ); foo::setIndentLength( root["indent"].get("length", 3).asInt() );
foo::setIndentUseSpace( root["indent"].get("use_space", true).asBool() ); foo::setIndentUseSpace( root["indent"].get("use_space", true).asBool() );
@ -124,7 +124,7 @@ reader->parse(start, stop, &value2, &errs);
\endcode \endcode
\section _pbuild Build instructions \section _pbuild Build instructions
The build instructions are located in the file The build instructions are located in the file
<a HREF="https://github.com/open-source-parsers/jsoncpp/blob/master/README.md">README.md</a> in the top-directory of the project. <a HREF="https://github.com/open-source-parsers/jsoncpp/blob/master/README.md">README.md</a> in the top-directory of the project.
The latest version of the source is available in the project's GitHub repository: The latest version of the source is available in the project's GitHub repository:
@ -132,7 +132,7 @@ The latest version of the source is available in the project's GitHub repository
jsoncpp</a> jsoncpp</a>
\section _news What's New? \section _news What's New?
The description of latest changes can be found in The description of latest changes can be found in
<a HREF="https://github.com/open-source-parsers/jsoncpp/wiki/NEWS"> <a HREF="https://github.com/open-source-parsers/jsoncpp/wiki/NEWS">
the NEWS wiki the NEWS wiki
</a>. </a>.
@ -152,7 +152,7 @@ The description of latest changes can be found in
\section _license License \section _license License
See file <a href="https://github.com/open-source-parsers/jsoncpp/blob/master/LICENSE"><code>LICENSE</code></a> in the top-directory of the project. See file <a href="https://github.com/open-source-parsers/jsoncpp/blob/master/LICENSE"><code>LICENSE</code></a> in the top-directory of the project.
Basically JsonCpp is licensed under MIT license, or public domain if desired Basically JsonCpp is licensed under MIT license, or public domain if desired
and recognized in your jurisdiction. and recognized in your jurisdiction.
\author Baptiste Lepilleur <blep@users.sourceforge.net> (originator) \author Baptiste Lepilleur <blep@users.sourceforge.net> (originator)

View File

@ -1,6 +1,5 @@
file(GLOB INCLUDE_FILES "json/*.h") file(GLOB INCLUDE_FILES "json/*.h")
install(FILES install(FILES
${INCLUDE_FILES} ${INCLUDE_FILES}
${PROJECT_BINARY_DIR}/include/json/version.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/json) DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/json)

View File

@ -378,7 +378,7 @@ bool JSON_API parseFromStream(CharReader::Factory const&,
/** \brief Read from 'sin' into 'root'. /** \brief Read from 'sin' into 'root'.
* *
* Always keep comments from the input JSON. * Always keep comments from the input JSON.
* *
* This can be used to read a file into a particular sub-object. * This can be used to read a file into a particular sub-object.
* For example: * For example:
* \code * \code

28
include/json/version.h Normal file
View File

@ -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

View File

@ -1,7 +1,15 @@
project( project(
'jsoncpp', 'jsoncpp',
'cpp', '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 : [ default_options : [
'buildtype=release', 'buildtype=release',
'cpp_std=c++11', 'cpp_std=c++11',
@ -9,25 +17,6 @@ project(
license : 'Public Domain', license : 'Public Domain',
meson_version : '>= 0.50.0') 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 = [ jsoncpp_headers = [
'include/json/allocator.h', 'include/json/allocator.h',
@ -39,6 +28,7 @@ jsoncpp_headers = [
'include/json/json.h', 'include/json/json.h',
'include/json/reader.h', 'include/json/reader.h',
'include/json/value.h', 'include/json/value.h',
'include/json/version.h',
'include/json/writer.h'] 'include/json/writer.h']
jsoncpp_include_directories = include_directories('include') jsoncpp_include_directories = include_directories('include')
@ -56,13 +46,12 @@ endif
jsoncpp_lib = library( jsoncpp_lib = library(
'jsoncpp', 'jsoncpp',
[ jsoncpp_gen_sources, [ jsoncpp_headers,
jsoncpp_headers,
'src/lib_json/json_tool.h', 'src/lib_json/json_tool.h',
'src/lib_json/json_reader.cpp', 'src/lib_json/json_reader.cpp',
'src/lib_json/json_value.cpp', 'src/lib_json/json_value.cpp',
'src/lib_json/json_writer.cpp'], 'src/lib_json/json_writer.cpp'],
soversion : 21, soversion : 22,
install : true, install : true,
include_directories : jsoncpp_include_directories, include_directories : jsoncpp_include_directories,
cpp_args: dll_export_flag) cpp_args: dll_export_flag)
@ -79,7 +68,7 @@ jsoncpp_dep = declare_dependency(
include_directories : jsoncpp_include_directories, include_directories : jsoncpp_include_directories,
link_with : jsoncpp_lib, link_with : jsoncpp_lib,
version : meson.project_version(), version : meson.project_version(),
sources : jsoncpp_gen_sources) )
# tests # tests
python = import('python3').find_python() python = import('python3').find_python()

View File

@ -45,9 +45,9 @@ set( PUBLIC_HEADERS
${JSONCPP_INCLUDE_DIR}/json/features.h ${JSONCPP_INCLUDE_DIR}/json/features.h
${JSONCPP_INCLUDE_DIR}/json/value.h ${JSONCPP_INCLUDE_DIR}/json/value.h
${JSONCPP_INCLUDE_DIR}/json/reader.h ${JSONCPP_INCLUDE_DIR}/json/reader.h
${JSONCPP_INCLUDE_DIR}/json/version.h
${JSONCPP_INCLUDE_DIR}/json/writer.h ${JSONCPP_INCLUDE_DIR}/json/writer.h
${JSONCPP_INCLUDE_DIR}/json/assertions.h ${JSONCPP_INCLUDE_DIR}/json/assertions.h
${PROJECT_BINARY_DIR}/include/json/version.h
) )
source_group( "Public API" FILES ${PUBLIC_HEADERS} ) source_group( "Public API" FILES ${PUBLIC_HEADERS} )
@ -57,8 +57,7 @@ set(jsoncpp_sources
json_reader.cpp json_reader.cpp
json_valueiterator.inl json_valueiterator.inl
json_value.cpp json_value.cpp
json_writer.cpp json_writer.cpp)
version.h.in)
# Install instructions for this target # Install instructions for this target
if(JSONCPP_WITH_CMAKE_PACKAGE) if(JSONCPP_WITH_CMAKE_PACKAGE)

View File

@ -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

View File

@ -1 +0,0 @@
1.8.4