Patch RapidJSON to make sure it builds on all platforms (#8818)

* patch RapidJSON to make sure it builds on all platforms

* remove unnecessary sed command from Docker recipe

---------

Co-authored-by: ptosco <paolo.tosco@novartis.com>
This commit is contained in:
Paolo Tosco
2025-09-26 05:28:46 +02:00
committed by GitHub
parent 7e9293ed25
commit 053a0283f7
5 changed files with 114 additions and 21 deletions

2
.gitignore vendored
View File

@@ -76,7 +76,7 @@ __pycache__/
/External/RingFamilies/RingDecomposerLib/
/External/YAeHMOP/yaehmop/
/External/catch/catch/
/External/rapidjson*/
/External/rapidjson/rapidjson-*/
/rdkit/RDPaths.py
/rdkit/Chem/inchi.py

View File

@@ -1,24 +1,23 @@
if(NOT EXISTS "${RDKit_ExternalDir}/rapidjson-1.1.0")
if(NOT EXISTS "${RDKit_ExternalDir}/rapidjson/rapidjson-1.1.0")
downloadAndCheckMD5("https://github.com/Tencent/rapidjson/archive/v1.1.0.tar.gz"
"${RDKit_ExternalDir}/rapidjson-1.1.0.tar.gz"
"${RDKit_ExternalDir}/rapidjson/rapidjson-1.1.0.tar.gz"
"badd12c511e081fec6c89c43a7027bce")
execute_process(COMMAND ${CMAKE_COMMAND} -E tar zxf
${RDKit_ExternalDir}/rapidjson-1.1.0.tar.gz
WORKING_DIRECTORY ${RDKit_ExternalDir})
# comment out a line which causes a compilation error on some platforms
${RDKit_ExternalDir}/rapidjson/rapidjson-1.1.0.tar.gz
WORKING_DIRECTORY ${RDKit_ExternalDir}/rapidjson)
# backport some master branch improvements to avoid a compilation error on some platforms
# (based on the change which has already been applied to the RapidJSON master branch, see
# https://github.com/Tencent/rapidjson/blob/ab1842a2dae061284c0a62dca1cc6d5e7e37e346/include/rapidjson/document.h#L414)
file(READ ${RDKit_ExternalDir}/rapidjson-1.1.0/include/rapidjson/document.h RAPIDJSON_DOCUMENT_H)
string(REGEX REPLACE
"( *)(GenericStringRef& operator=\\(const GenericStringRef& rhs\\) { s = rhs\\.s. length = rhs\\.length. })" "\\1//\\2"
RAPIDJSON_DOCUMENT_H "${RAPIDJSON_DOCUMENT_H}")
file(WRITE ${RDKit_ExternalDir}/rapidjson-1.1.0/include/rapidjson/document.h "${RAPIDJSON_DOCUMENT_H}")
# https://github.com/Tencent/rapidjson/blob/24b5e7a8b27f42fa16b96fc70aade9106cf7102f/include/rapidjson/document.h#L414
# and https://patch-diff.githubusercontent.com/raw/Tencent/rapidjson/pull/1698.diff
execute_process(COMMAND git --git-dir= apply
${RDKit_ExternalDir}/rapidjson/patch-rapidjson-1.1.0.diff
WORKING_DIRECTORY ${RDKit_ExternalDir}/rapidjson)
else()
message("-- Found RapidJSON source in ${RDKit_ExternalDir}")
message("-- Found RapidJSON source in ${RDKit_ExternalDir}/rapidjson")
endif()
include_directories(${RDKit_ExternalDir}/rapidjson-1.1.0/include)
include_directories(${RDKit_ExternalDir}/rapidjson/rapidjson-1.1.0/include)
rdkit_library(MolInterchange

View File

@@ -1,5 +1,5 @@
include_directories(${RDKit_ExternalDir})
include_directories(${RDKit_ExternalDir}/rapidjson-1.1.0/include)
include_directories(${RDKit_ExternalDir}/rapidjson/rapidjson-1.1.0/include)
if(RDK_BUILD_MINIMAL_LIB)
set(MINIMAL_LIB_LIBRARIES "MolInterchange;Abbreviations;"

View File

@@ -83,12 +83,6 @@ RUN emcmake cmake -DRDK_BUILD_FREETYPE_SUPPORT=ON -DRDK_BUILD_MINIMAL_LIB=ON \
RUN cp /src/rdkit/External/INCHI-API/src/INCHI_BASE/src/util.c /src/rdkit/External/INCHI-API/src/INCHI_BASE/src/util.c.bak && \
sed 's/&& defined(__APPLE__)//' /src/rdkit/External/INCHI-API/src/INCHI_BASE/src/util.c.bak > /src/rdkit/External/INCHI-API/src/INCHI_BASE/src/util.c
# comment out a line which causes a compilation error on some platforms
# (based on the change which has already been applied to the RapidJSON master branch, see
# https://github.com/Tencent/rapidjson/blob/ab1842a2dae061284c0a62dca1cc6d5e7e37e346/include/rapidjson/document.h#L414)
RUN sed -i 's|^\( *\)\(GenericStringRef\& operator=(const GenericStringRef\& rhs) { s = rhs.s; length = rhs.length; } *\)$|\1//\2|' \
/src/rdkit/External/rapidjson-1.1.0/include/rapidjson/document.h
# build and "install"
RUN make -j2 RDKit_minimal && \
cp Code/MinimalLib/RDKit_minimal.* ../Code/MinimalLib/demo/

View File

@@ -0,0 +1,100 @@
--- a/rapidjson-1.1.0/include/rapidjson/document.h 2016-08-25 09:59:05.000000000 +0200
+++ b/rapidjson-1.1.0/include/rapidjson/document.h 2025-09-25 11:37:06.694007282 +0200
@@ -22,6 +22,8 @@
#include "internal/strfunc.h"
#include "memorystream.h"
#include "encodedstream.h"
+
+#include <algorithm>
#include <new> // placement new
#include <limits>
@@ -68,9 +70,48 @@
https://code.google.com/p/rapidjson/issues/detail?id=64
*/
template <typename Encoding, typename Allocator>
-struct GenericMember {
+class GenericMember {
+public:
+ // Allow default construction as it is needed during copying.
+ GenericMember() {}
+
GenericValue<Encoding, Allocator> name; //!< name of member (must be a string)
GenericValue<Encoding, Allocator> value; //!< value of member.
+
+#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
+ //! Move constructor in C++11
+ GenericMember(GenericMember&& rhs) RAPIDJSON_NOEXCEPT
+ : name(std::move(rhs.name)),
+ value(std::move(rhs.value))
+ {
+ }
+
+ //! Move assignment in C++11
+ GenericMember& operator=(GenericMember&& rhs) RAPIDJSON_NOEXCEPT {
+ return *this = static_cast<GenericMember&>(rhs);
+ }
+#endif
+
+ //! Assignment with move semantics.
+ /*! \param rhs Source of the assignment. Its name and value will become a null value after assignment.
+ */
+ GenericMember& operator=(GenericMember& rhs) RAPIDJSON_NOEXCEPT {
+ if (RAPIDJSON_LIKELY(this != &rhs)) {
+ name = rhs.name;
+ value = rhs.value;
+ }
+ return *this;
+ }
+
+ // swap() for std::sort() and other potential use in STL.
+ friend inline void swap(GenericMember& a, GenericMember& b) RAPIDJSON_NOEXCEPT {
+ a.name.Swap(b.name);
+ a.value.Swap(b.value);
+ }
+
+private:
+ //! Copy constructor is not permitted.
+ GenericMember(const GenericMember& rhs);
};
///////////////////////////////////////////////////////////////////////////////
@@ -316,8 +357,6 @@
GenericStringRef(const GenericStringRef& rhs) : s(rhs.s), length(rhs.length) {}
- GenericStringRef& operator=(const GenericStringRef& rhs) { s = rhs.s; length = rhs.length; }
-
//! implicit conversion to plain CharType pointer
operator const Ch *() const { return s; }
@@ -1934,9 +1973,11 @@
void SetArrayRaw(GenericValue* values, SizeType count, Allocator& allocator) {
data_.f.flags = kArrayFlag;
if (count) {
- GenericValue* e = static_cast<GenericValue*>(allocator.Malloc(count * sizeof(GenericValue)));
- SetElementsPointer(e);
- std::memcpy(e, values, count * sizeof(GenericValue));
+ auto arr = static_cast<GenericValue*>(allocator.Malloc(count * sizeof(GenericValue)));
+ for (SizeType idx = 0; idx < count; ++idx)
+ new (arr + idx) GenericValue;
+ SetElementsPointer(arr);
+ std::copy_n(values, count, arr);
}
else
SetElementsPointer(0);
@@ -1947,9 +1988,11 @@
void SetObjectRaw(Member* members, SizeType count, Allocator& allocator) {
data_.f.flags = kObjectFlag;
if (count) {
- Member* m = static_cast<Member*>(allocator.Malloc(count * sizeof(Member)));
- SetMembersPointer(m);
- std::memcpy(m, members, count * sizeof(Member));
+ auto arr = static_cast<Member*>(allocator.Malloc(count * sizeof(Member)));
+ for (SizeType idx = 0; idx < count; ++idx)
+ new (arr + idx) Member;
+ SetMembersPointer(arr);
+ std::copy_n(members, count, arr);
}
else
SetMembersPointer(0);