PgSQL: preserve toolchain LDFLAGS on macOS (#9285)

The previous `set(CMAKE_EXE_LINKER_FLAGS ...)` replaced the variable
wholesale, which clobbers any toolchain-supplied linker flags. In
particular, conda-forge's clang_osx-64 / clangxx_osx-64 packages set
`-stdlib=libc++ -L${PREFIX}/lib -Wl,-rpath,${PREFIX}/lib` via
`CMAKE_EXE_LINKER_FLAGS`. Losing those flags causes the postgres
extension link to pick up the wrong libc++ and fail to resolve
ABI-tagged symbols on libc++ 19+:

    [ 94%] Linking CXX executable rdkit.dylib
    Undefined symbols for architecture x86_64:
      "VTT for std::__1::basic_stringstream<...>"
      "vtable for std::__1::basic_stringbuf<...>"
      "vtable for std::__1::basic_stringstream<...>"
      "vtable for std::__1::basic_istringstream<...>"
    ld: symbol(s) not found for architecture x86_64

The missing symbols carry the `[abi:ne190107]` ABI tag introduced by
libc++ 19+ — references that only resolve against the conda-forge
libc++, not the system one the link was falling back to.

Append to `CMAKE_EXE_LINKER_FLAGS` instead so the toolchain flags
survive. The other rdkit `.dylib`s in the same build are linked via
the standard cmake toolchain path and were never affected.

Verified by building rdkit-postgresql on osx-64 + osx-arm64 via the
conda-forge feedstock (https://github.com/conda-forge/rdkit-feedstock)
with this fix applied as a downstream patch.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Steven Kearnes
2026-05-16 01:00:01 -04:00
committed by greg landrum
parent 8120d418fb
commit e8e9dc2a13

View File

@@ -94,8 +94,13 @@ if(MSVC)
endif()
endif(MSVC)
if(APPLE)
set(CMAKE_EXE_LINKER_FLAGS "-bundle -multiply_defined suppress"
"-Wl,-dead_strip_dylibs -bundle_loader ${PG_BINDIR}/postgres")
# Append (rather than replace) so any toolchain-provided flags survive --
# in particular `-stdlib=libc++ -L${PREFIX}/lib -Wl,-rpath,${PREFIX}/lib`
# from conda-forge's clang_osx-64 / clangxx_osx-64 packages. Without these,
# the link picks up the wrong libc++ and fails to resolve ABI-tagged symbols
# (e.g. `vtable for std::__1::basic_stringstream` with `[abi:ne190107]`)
# on libc++ 19+ toolchains.
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -bundle -multiply_defined suppress -Wl,-dead_strip_dylibs -bundle_loader ${PG_BINDIR}/postgres")
add_executable("${EXTENSION}${EXTENSION_SUFFIX}"
adapter.cpp bfp_op.c cache.c guc.c low_gist.c mol_op.c
rdkit_gist.c bfp_gist.c bfp_gin.c bitstring.c rdkit_io.c rxn_op.c sfp_op.c)