1- cmake_minimum_required (VERSION 3.5 )
1+ cmake_minimum_required (VERSION 3.17 )
22
33# Set extension name here
44set (TARGET_NAME paimon)
@@ -15,6 +15,20 @@ include_directories(src/include)
1515# Import paimon-cpp as a subproject
1616include (ExternalProject )
1717
18+ # JindoSDK: the installed filename differs by platform, but we always bundle
19+ # using the short name that matches the dylib's install_name.
20+ file (STRINGS third_party/paimon-cpp/third_party/versions.txt
21+ _jindosdk_ver REGEX "^PAIMON_JINDOSDK_C_BUILD_VERSION=" )
22+ string (REGEX REPLACE ".*=" "" _jindosdk_ver "${_jindosdk_ver} " )
23+ string (REGEX REPLACE "([0-9]+)\\ ..*" "\\ 1" _jindosdk_major "${_jindosdk_ver} " )
24+ if (APPLE )
25+ set (JINDOSDK_C_INSTALLED_NAME "libjindosdk_c.${_jindosdk_ver} .dylib" )
26+ set (JINDOSDK_C_RUNTIME_NAME "libjindosdk_c.${_jindosdk_major} .dylib" )
27+ else ()
28+ set (JINDOSDK_C_INSTALLED_NAME "libjindosdk_c.so" )
29+ set (JINDOSDK_C_RUNTIME_NAME "libjindosdk_c.so.${_jindosdk_major} " )
30+ endif ()
31+
1832set (PAIMON_CPP_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR } /third_party/paimon-cpp)
1933set (PAIMON_CPP_PREFIX ${CMAKE_CURRENT_BINARY_DIR } /paimon-cpp-install)
2034set (PAIMON_CPP_INCLUDE ${PAIMON_CPP_PREFIX} /include)
@@ -23,8 +37,7 @@ file(MAKE_DIRECTORY ${PAIMON_CPP_INCLUDE})
2337
2438set (PAIMON_CPP_PATCHES
2539 ${CMAKE_CURRENT_SOURCE_DIR } /patches/paimon-cpp-install-arrow-headers.patch
26- ${CMAKE_CURRENT_SOURCE_DIR } /patches/paimon-cpp-link-arrow-brotli-libs.patch
27- ${CMAKE_CURRENT_SOURCE_DIR } /patches/paimon-cpp-disable-glog-unwind.patch)
40+ ${CMAKE_CURRENT_SOURCE_DIR } /patches/paimon-cpp-macos-ndebug-for-checked-cast.patch)
2841
2942# Build patch command: apply each patch idempotently
3043set (PAIMON_CPP_PATCH_SCRIPT "" )
@@ -43,6 +56,7 @@ ExternalProject_Add(paimon_cpp_ep
4356 -DCMAKE_INSTALL_PREFIX=${PAIMON_CPP_PREFIX}
4457 -DCMAKE_INSTALL_LIBDIR=lib64
4558 -DLIBUNWIND_LIBRARY=FALSE
59+ -DPAIMON_DEPENDENCY_SOURCE=BUNDLED
4660 -DPAIMON_BUILD_TESTS=OFF
4761 -DPAIMON_BUILD_SHARED=ON
4862 -DPAIMON_BUILD_STATIC=OFF
@@ -52,16 +66,29 @@ ExternalProject_Add(paimon_cpp_ep
5266 -DPAIMON_ENABLE_LUMINA=OFF
5367 -DPAIMON_ENABLE_LUCENE=OFF
5468 BUILD_BYPRODUCTS
55- ${PAIMON_CPP_LIB} /libpaimon.so
56- ${PAIMON_CPP_LIB} /libpaimon_local_file_system.so
57- ${PAIMON_CPP_LIB} /libpaimon_jindo_file_system.so
58- ${PAIMON_CPP_LIB} /libjindosdk_c.so
59- ${PAIMON_CPP_LIB} /libpaimon_parquet_file_format.so
60- ${PAIMON_CPP_LIB} /libpaimon_orc_file_format.so
61- ${PAIMON_CPP_LIB} /libpaimon_avro_file_format.so
62- ${PAIMON_CPP_LIB} /libpaimon_blob_file_format.so
69+ ${PAIMON_CPP_LIB} /libpaimon${ CMAKE_SHARED_LIBRARY_SUFFIX }
70+ ${PAIMON_CPP_LIB} /libpaimon_local_file_system${ CMAKE_SHARED_LIBRARY_SUFFIX }
71+ ${PAIMON_CPP_LIB} /libpaimon_jindo_file_system${ CMAKE_SHARED_LIBRARY_SUFFIX }
72+ ${PAIMON_CPP_LIB} /${JINDOSDK_C_INSTALLED_NAME}
73+ ${PAIMON_CPP_LIB} /libpaimon_parquet_file_format${ CMAKE_SHARED_LIBRARY_SUFFIX }
74+ ${PAIMON_CPP_LIB} /libpaimon_orc_file_format${ CMAKE_SHARED_LIBRARY_SUFFIX }
75+ ${PAIMON_CPP_LIB} /libpaimon_avro_file_format${ CMAKE_SHARED_LIBRARY_SUFFIX }
76+ ${PAIMON_CPP_LIB} /libpaimon_blob_file_format${ CMAKE_SHARED_LIBRARY_SUFFIX }
6377)
6478
79+ # On macOS, paimon-cpp installs the JindoSDK dylib with a versioned filename
80+ # (e.g. libjindosdk_c.6.10.2.dylib) but its install_name uses the short
81+ # version (libjindosdk_c.6.dylib). Add a post-install step to provide the
82+ # short-named copy that runtime lookup expects.
83+ if (APPLE )
84+ ExternalProject_Add_Step (paimon_cpp_ep jindosdk_short_name
85+ DEPENDEES install
86+ BYPRODUCTS ${PAIMON_CPP_LIB} /${JINDOSDK_C_RUNTIME_NAME}
87+ COMMAND ${CMAKE_COMMAND } -E copy_if_different
88+ ${PAIMON_CPP_LIB} /${JINDOSDK_C_INSTALLED_NAME}
89+ ${PAIMON_CPP_LIB} /${JINDOSDK_C_RUNTIME_NAME} )
90+ endif ()
91+
6592# Extension sources
6693set (EXTENSION_SOURCES
6794 src/paimon_extension.cpp
@@ -90,30 +117,38 @@ add_dependencies(${TARGET_NAME}_loadable_extension paimon_cpp_ep)
90117
91118# Link with paimon-cpp
92119set (PAIMON_CPP_LIBS
93- ${PAIMON_CPP_LIB} /libpaimon.so
94- -Wl,--no -as-needed
95- ${PAIMON_CPP_LIB} /libpaimon_local_file_system.so
96- ${PAIMON_CPP_LIB} /libpaimon_jindo_file_system.so
97- ${PAIMON_CPP_LIB} /libjindosdk_c.so
98- ${PAIMON_CPP_LIB} /libpaimon_parquet_file_format.so
99- ${PAIMON_CPP_LIB} /libpaimon_orc_file_format.so
100- ${PAIMON_CPP_LIB} /libpaimon_avro_file_format.so
101- ${PAIMON_CPP_LIB} /libpaimon_blob_file_format.so
102- -Wl,--as-needed
120+ ${PAIMON_CPP_LIB} /libpaimon${ CMAKE_SHARED_LIBRARY_SUFFIX }
121+ $<$< NOT :$< PLATFORM_ID : Darwin >>: -Wl ,--no -as -needed >
122+ ${PAIMON_CPP_LIB} /libpaimon_local_file_system${ CMAKE_SHARED_LIBRARY_SUFFIX }
123+ ${PAIMON_CPP_LIB} /libpaimon_jindo_file_system${ CMAKE_SHARED_LIBRARY_SUFFIX }
124+ ${PAIMON_CPP_LIB} /${JINDOSDK_C_INSTALLED_NAME}
125+ ${PAIMON_CPP_LIB} /libpaimon_parquet_file_format${ CMAKE_SHARED_LIBRARY_SUFFIX }
126+ ${PAIMON_CPP_LIB} /libpaimon_orc_file_format${ CMAKE_SHARED_LIBRARY_SUFFIX }
127+ ${PAIMON_CPP_LIB} /libpaimon_avro_file_format${ CMAKE_SHARED_LIBRARY_SUFFIX }
128+ ${PAIMON_CPP_LIB} /libpaimon_blob_file_format${ CMAKE_SHARED_LIBRARY_SUFFIX }
129+ $<$< NOT :$< PLATFORM_ID : Darwin >>: -Wl ,--as -needed >
103130)
104131target_link_libraries (${EXTENSION_NAME} ${PAIMON_CPP_LIBS} )
105132target_link_libraries (${TARGET_NAME} _loadable_extension ${PAIMON_CPP_LIBS} )
106133
134+ if (APPLE )
135+ # Propagate rpath so unittest/shell can find paimon-cpp shared libraries.
136+ target_link_options (${EXTENSION_NAME} INTERFACE "LINKER:-rpath,${PAIMON_CPP_LIB} " )
137+ set (PAIMON_RPATH "@loader_path" )
138+ else ()
139+ set (PAIMON_RPATH "\$ ORIGIN" )
140+ endif ()
141+
107142# Bundle paimon-cpp runtime dependencies next to paimon.duckdb_extension.
108143set (PAIMON_CPP_RUNTIME_BUNDLE_LIBS
109- ${PAIMON_CPP_LIB} /libpaimon.so
110- ${PAIMON_CPP_LIB} /libpaimon_local_file_system.so
111- ${PAIMON_CPP_LIB} /libpaimon_jindo_file_system.so
112- ${PAIMON_CPP_LIB} /libjindosdk_c.so.6
113- ${PAIMON_CPP_LIB} /libpaimon_parquet_file_format.so
114- ${PAIMON_CPP_LIB} /libpaimon_orc_file_format.so
115- ${PAIMON_CPP_LIB} /libpaimon_avro_file_format.so
116- ${PAIMON_CPP_LIB} /libpaimon_blob_file_format.so
144+ ${PAIMON_CPP_LIB} /libpaimon${ CMAKE_SHARED_LIBRARY_SUFFIX }
145+ ${PAIMON_CPP_LIB} /libpaimon_local_file_system${ CMAKE_SHARED_LIBRARY_SUFFIX }
146+ ${PAIMON_CPP_LIB} /libpaimon_jindo_file_system${ CMAKE_SHARED_LIBRARY_SUFFIX }
147+ ${PAIMON_CPP_LIB} /${JINDOSDK_C_RUNTIME_NAME}
148+ ${PAIMON_CPP_LIB} /libpaimon_parquet_file_format${ CMAKE_SHARED_LIBRARY_SUFFIX }
149+ ${PAIMON_CPP_LIB} /libpaimon_orc_file_format${ CMAKE_SHARED_LIBRARY_SUFFIX }
150+ ${PAIMON_CPP_LIB} /libpaimon_avro_file_format${ CMAKE_SHARED_LIBRARY_SUFFIX }
151+ ${PAIMON_CPP_LIB} /libpaimon_blob_file_format${ CMAKE_SHARED_LIBRARY_SUFFIX }
117152)
118153foreach (lib IN LISTS PAIMON_CPP_RUNTIME_BUNDLE_LIBS)
119154 add_custom_command (
@@ -124,11 +159,9 @@ foreach(lib IN LISTS PAIMON_CPP_RUNTIME_BUNDLE_LIBS)
124159 $<TARGET_FILE_DIR :${TARGET_NAME} _loadable_extension >
125160 )
126161endforeach ()
127-
128- # Make runtime library lookup relocatable for the shipped loadable extension.
129162set_target_properties (${TARGET_NAME} _loadable_extension PROPERTIES
130- BUILD_RPATH "\$ ORIGIN "
131- INSTALL_RPATH "\$ ORIGIN "
163+ BUILD_RPATH "${PAIMON_RPATH} "
164+ INSTALL_RPATH "${PAIMON_RPATH} "
132165 BUILD_WITH_INSTALL_RPATH ON
133166 INSTALL_RPATH_USE_LINK_PATH OFF
134167)
0 commit comments