Fixes #4681 and a few Windows PgSQL build problems (#4692)

* fixes #4681

* fixes a few Windows build problems

* added comments to adapter.cpp to explain the changes

* get PostgreSQL to build on Windows with both MSVC and MinGW compilers

Co-authored-by: Tosco, Paolo <paolo.tosco@novartis.com>
This commit is contained in:
Paolo Tosco
2021-11-20 04:28:49 +01:00
committed by GitHub
parent 42c8e011e1
commit 9ed1fecc3a
4 changed files with 104 additions and 30 deletions

View File

@@ -2302,7 +2302,7 @@ TEST_CASE("conformer details") {
CHECK(conf->getId() == cid);
}
#if !defined(_MSC_VER) || !defined(RDKIT_DYN_LINK)
#if !defined(_WIN32) || !defined(RDKIT_DYN_LINK)
namespace RDKit {
namespace Canon {
namespace details {
@@ -2459,4 +2459,4 @@ TEST_CASE("Github #4535: operator<< for AtomPDBResidue", "[PDB]") {
)FOO";
CHECK(oss.str() == tgt);
}
}
}

View File

@@ -1,10 +1,24 @@
if(APPLE)
set (EXTENSION_PREFIX "")
set (EXTENSION_SUFFIX ".so")
else(APPLE)
set (EXTENSION_DEST_SUFFIX ".so")
elseif(WIN32)
set(REGEX_SEPARATOR "\\\\")
if(MSVC)
set (EXTENSION_PREFIX "")
set (EXTENSION_SUFFIX "")
set (EXTENSION_DEST_SUFFIX ".dll")
else()
set(REGEX_SEPARATOR "${REGEX_SEPARATOR}${REGEX_SEPARATOR}")
set (EXTENSION_PREFIX "lib")
set (EXTENSION_SUFFIX "")
set (EXTENSION_DEST_SUFFIX ".dll")
endif()
else()
set (EXTENSION_PREFIX "lib")
set (EXTENSION_SUFFIX "")
endif(APPLE)
set (EXTENSION_DEST_SUFFIX ".so")
endif()
find_package(PostgreSQL REQUIRED)
@@ -19,11 +33,12 @@ endif(NOT DEFINED Boost_INCLUDE_DIRS)
include_directories(${Boost_INCLUDE_DIRS})
message("postgres: ${PostgreSQL_INCLUDE_DIRS}")
add_definitions(-DRDK_TOOLKIT_VERSION="${RDKit_RELEASENAME}")
include_directories(${RDKit_CodeDir})
include_directories(${PostgreSQL_INCLUDE_DIRS})
if(WIN32)
include_directories(${PostgreSQL_INCLUDE_DIR}/server/port/win32)
include_directories(${PostgreSQL_TYPE_INCLUDE_DIR}/port/win32)
if(MSVC)
include_directories(${PostgreSQL_INCLUDE_DIR}/server/port/win32_msvc)
include_directories(${PostgreSQL_TYPE_INCLUDE_DIR}/port/win32_msvc)
endif(MSVC)
endif(WIN32)
if(RDK_BUILD_AVALON_SUPPORT)
@@ -67,8 +82,11 @@ run_pg_config (--sharedir PG_SHAREDIR)
run_pg_config (--pkglibdir PG_PKGLIBDIR)
set(PG_PKGLIBDIR "${PG_PKGLIBDIR}/")
set(PG_EXTENSIONDIR "${PG_SHAREDIR}/extension")
if(WIN32)
add_definitions(-DWIN32)
endif()
if(MSVC)
add_definitions(-DWIN32 -DBUILDING_MODULE -DNOMINMAX)
add_definitions(-DBUILDING_MODULE -DNOMINMAX)
if(NOT (MSVC_VERSION LESS 1700))
add_definitions(-DHAVE_RINT)
endif()
@@ -126,23 +144,31 @@ set(pgRDKitLibList "${pgRDKitLibList}"
if(RDK_USE_URF)
set(pgRDKitLibList "${pgRDKitLibList};${RDK_URF_LIBS}")
endif(RDK_USE_URF)
set (pgRDKitLibs "")
foreach(pgRDKitLib ${pgRDKitLibList})
set(pgRDKitLibs "${pgRDKitLibs}${pgRDKitLib}${pgRDKitLibSuffix};")
if (NOT pgRDKitLibs STREQUAL "")
set(pgRDKitLibs "${pgRDKitLibs};")
endif()
set(pgRDKitLibs "${pgRDKitLibs}${pgRDKitLib}${pgRDKitLibSuffix}")
endforeach()
target_link_libraries(${EXTENSION}${EXTENSION_SUFFIX} ${pgRDKitLibs})
if(RDK_BUILD_THREADSAFE_SSS)
target_link_libraries(${EXTENSION}${EXTENSION_SUFFIX} ${RDKit_THREAD_LIBS})
endif(RDK_BUILD_THREADSAFE_SSS)
if(WIN32 AND NOT UNIX)
set(PGREGRESS_BINARY "${PG_BINDIR}\\pg_regress.exe")
string(REGEX REPLACE "/" "\\\\" PG_EXTENSIONDIR ${PG_EXTENSIONDIR})
string(REGEX REPLACE "/" "\\\\" PGREGRESS_BINARY ${PGREGRESS_BINARY})
else(WIN32 AND NOT UNIX)
if(MSVC)
set(PGREGRESS_BINARY "${PG_BINDIR}/pg_regress")
string(REGEX REPLACE "/" ${REGEX_SEPARATOR} PGREGRESS_BINARY ${PGREGRESS_BINARY})
string(REGEX REPLACE "/" ${REGEX_SEPARATOR} PG_EXTENSIONDIR ${PG_EXTENSIONDIR})
string(REGEX REPLACE "/" ${REGEX_SEPARATOR} PGREGRESS_BINARY ${PGREGRESS_BINARY})
else()
run_pg_config (--pgxs PG_MAKEFILE)
get_filename_component(PG_MAKEFILESDIR ${PG_MAKEFILE} PATH)
set(PGREGRESS_BINARY "${PG_MAKEFILESDIR}/../test/regress/pg_regress")
endif(WIN32 AND NOT UNIX)
endif()
if(WIN32)
set(PGREGRESS_BINARY "${PGREGRESS_BINARY}.exe")
endif()
if(NOT EXISTS ${PGREGRESS_BINARY})
message(FATAL_ERROR "${PGREGRESS_BINARY} does not exist")
endif()
@@ -170,26 +196,30 @@ set(testPgSQLName "${CMAKE_CURRENT_BINARY_DIR}/pgsql_regress")
set(installPgSQLName "${CMAKE_CURRENT_BINARY_DIR}/pgsql_install")
set(PG_CURRENT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/")
set(PG_CURRENT_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/")
if(WIN32 AND NOT UNIX)
set(PG_RDKIT_LIB_SRC "${EXTENSION_PREFIX}${EXTENSION}${EXTENSION_DEST_SUFFIX}")
set(PG_RDKIT_LIB_DEST "${EXTENSION}${EXTENSION_DEST_SUFFIX}")
if(MSVC)
set(testPgSQLCommand "")
set(testPgSQLName "${testPgSQLName}.bat")
set(installPgSQLName "${installPgSQLName}.bat")
set(installCopyCommand "copy /Y")
set(installPgSQLCopyCommand "copy /Y")
set(installPgSQLSeparator "\\")
set(installPgSQLBody "")
set(PG_RDKIT_LIB_SRC "${EXTENSION}.dll")
set(PG_RDKIT_LIB_DEST "${EXTENSION}.dll")
string(REGEX REPLACE "/" "\\\\" PG_CURRENT_SOURCE_DIR ${PG_CURRENT_SOURCE_DIR})
string(REGEX REPLACE "/" "\\\\" PG_CURRENT_BINARY_DIR ${PG_CURRENT_BINARY_DIR})
string(REGEX REPLACE "/" "\\\\" PG_PKGLIBDIR ${PG_PKGLIBDIR})
else(WIN32 AND NOT UNIX)
set(BAT_QUOTE "\"")
set(SH_QUOTE "")
string(REGEX REPLACE "/" ${REGEX_SEPARATOR} PG_CURRENT_SOURCE_DIR ${PG_CURRENT_SOURCE_DIR})
string(REGEX REPLACE "/" ${REGEX_SEPARATOR} PG_CURRENT_BINARY_DIR ${PG_CURRENT_BINARY_DIR})
string(REGEX REPLACE "/" ${REGEX_SEPARATOR} PG_PKGLIBDIR ${PG_PKGLIBDIR})
else()
set(testPgSQLCommand "sh")
set(testPgSQLName "${testPgSQLName}.sh")
set(installPgSQLName "${installPgSQLName}.sh")
set(installCopyCommand "cp")
set(installPgSQLCopyCommand "cp")
set(installPgSQLSeparator "/")
set(installPgSQLBody "set -x\n")
set(PG_RDKIT_LIB_SRC "${EXTENSION_PREFIX}${EXTENSION}.so")
set(PG_RDKIT_LIB_DEST "${EXTENSION}.so")
endif(WIN32 AND NOT UNIX)
set(BAT_QUOTE "")
set(SH_QUOTE "\"")
endif()
set(testPgSQLBody "cd \"${PG_CURRENT_BINARY_DIR}\"\n"
"\"${PGREGRESS_BINARY}\" --inputdir=sql "
"${PGREGRESS_BINDIR_SWITCH} rdkit-91 "
@@ -234,10 +264,10 @@ foreach(file ${files})
configure_file(${file} ${output_name})
endforeach()
set(installPgSQLBody "${installPgSQLBody}"
"${installCopyCommand} \"${PG_CURRENT_BINARY_DIR}${EXTENSION}--${PG_EXTVERSION}.sql\" \"${PG_EXTENSIONDIR}\"\n"
"${installCopyCommand} \"${PG_CURRENT_SOURCE_DIR}${EXTENSION}.control\" \"${PG_EXTENSIONDIR}\"\n"
"${installCopyCommand} \"${PG_CURRENT_SOURCE_DIR}update_sql/\"*.sql \"${PG_EXTENSIONDIR}\"\n"
"${installCopyCommand} \"${PG_CURRENT_BINARY_DIR}${PG_RDKIT_LIB_SRC}\" "
"${installPgSQLCopyCommand} \"${PG_CURRENT_BINARY_DIR}${EXTENSION}--${PG_EXTVERSION}.sql\" \"${PG_EXTENSIONDIR}\"\n"
"${installPgSQLCopyCommand} \"${PG_CURRENT_SOURCE_DIR}${EXTENSION}.control\" \"${PG_EXTENSIONDIR}\"\n"
"${installPgSQLCopyCommand} \"${PG_CURRENT_SOURCE_DIR}update_sql${installPgSQLSeparator}${SH_QUOTE}*.sql${BAT_QUOTE} \"${PG_EXTENSIONDIR}\"\n"
"${installPgSQLCopyCommand} \"${PG_CURRENT_BINARY_DIR}${PG_RDKIT_LIB_SRC}\" "
"\"${PG_PKGLIBDIR}${PG_RDKIT_LIB_DEST}\"\n")
file(WRITE ${testPgSQLName} ${testPgSQLBody})
file(WRITE ${installPgSQLName} ${installPgSQLBody})

View File

@@ -30,6 +30,22 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// PostgreSQL 14 on Windows uses a hack to redefine the stat struct
// The hack assumes that sys/stat.h will be imported for the first
// time by win32_port.h, which is not necessarily the case
// So we need to set the stage for the hack or it will fail
#ifdef _WIN32
#define fstat microsoft_native_fstat
#define stat microsoft_native_stat
#include <sys/stat.h>
#ifdef __MINGW32__
#ifndef HAVE_GETTIMEOFDAY
#define HAVE_GETTIMEOFDAY 1
#endif
#endif
#endif
#include <GraphMol/RDKitBase.h>
#include <GraphMol/MolPickler.h>
#include <GraphMol/ChemReactions/ReactionPickler.h>
@@ -76,6 +92,12 @@
#include <GraphMol/MolInterchange/MolInterchange.h>
#endif
// see above comment on the PostgreSQL hack
#ifdef _WIN32
#undef fstat
#undef stat
#endif
#include "rdkit.h"
#include "guc.h"
#include "bitstring.h"

View File

@@ -54,7 +54,12 @@ macro(rdkit_library)
if(RDK_INSTALL_STATIC_LIBS)
add_library(${RDKLIB_NAME}_static ${RDKLIB_SOURCES})
set(skipNext FALSE)
foreach(linkLib ${RDKLIB_LINK_LIBRARIES})
if(skipNext)
set(skipNext FALSE)
continue()
endif()
if(TARGET "${linkLib}")
get_target_property(linkLib_IMPORTED "${linkLib}" IMPORTED)
if (linkLib_IMPORTED)
@@ -66,6 +71,23 @@ macro(rdkit_library)
# linkLib is a file, so keep it as-is
target_link_libraries(${RDKLIB_NAME}_static PUBLIC "${linkLib}")
continue()
# cmake prepends the special keywords debug, optimized, general
# before the library name depending on whether they should be
# linked in Debug, Release or generic builds. Therefore we need
# to skip those, and also skip the library that follows if it
# is not relevant for the current build type
elseif ("${linkLib}" STREQUAL "debug")
if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
set(skipNext TRUE)
endif()
continue()
elseif ("${linkLib}" STREQUAL "optimized")
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(skipNext TRUE)
endif()
continue()
elseif ("${linkLib}" STREQUAL "general")
continue()
endif()
# We haven't seen linkLib yet. This probably means it is a target