diff --git a/.gitignore b/.gitignore index 84aef59b5..6576ba9cd 100644 --- a/.gitignore +++ b/.gitignore @@ -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 diff --git a/Code/GraphMol/MolInterchange/CMakeLists.txt b/Code/GraphMol/MolInterchange/CMakeLists.txt index 171c70e2b..c092d463c 100644 --- a/Code/GraphMol/MolInterchange/CMakeLists.txt +++ b/Code/GraphMol/MolInterchange/CMakeLists.txt @@ -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 diff --git a/Code/MinimalLib/CMakeLists.txt b/Code/MinimalLib/CMakeLists.txt index 53f50e842..3806b7624 100644 --- a/Code/MinimalLib/CMakeLists.txt +++ b/Code/MinimalLib/CMakeLists.txt @@ -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;" diff --git a/Code/MinimalLib/docker/Dockerfile_3_rdkit_build b/Code/MinimalLib/docker/Dockerfile_3_rdkit_build index 772e7fc42..41ba2c036 100644 --- a/Code/MinimalLib/docker/Dockerfile_3_rdkit_build +++ b/Code/MinimalLib/docker/Dockerfile_3_rdkit_build @@ -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/ diff --git a/External/rapidjson/patch-rapidjson-1.1.0.diff b/External/rapidjson/patch-rapidjson-1.1.0.diff new file mode 100644 index 000000000..3c8097ed6 --- /dev/null +++ b/External/rapidjson/patch-rapidjson-1.1.0.diff @@ -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 + #include // placement new + #include + +@@ -68,9 +70,48 @@ + https://code.google.com/p/rapidjson/issues/detail?id=64 + */ + template +-struct GenericMember { ++class GenericMember { ++public: ++ // Allow default construction as it is needed during copying. ++ GenericMember() {} ++ + GenericValue name; //!< name of member (must be a string) + GenericValue 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(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(allocator.Malloc(count * sizeof(GenericValue))); +- SetElementsPointer(e); +- std::memcpy(e, values, count * sizeof(GenericValue)); ++ auto arr = static_cast(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(allocator.Malloc(count * sizeof(Member))); +- SetMembersPointer(m); +- std::memcpy(m, members, count * sizeof(Member)); ++ auto arr = static_cast(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);