-
Notifications
You must be signed in to change notification settings - Fork 705
Expand file tree
/
Copy pathCMakeLists.pg.cmake
More file actions
154 lines (127 loc) · 5.31 KB
/
CMakeLists.pg.cmake
File metadata and controls
154 lines (127 loc) · 5.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
option(BUILD_PG_17 "Build PostgreSQL 17 extension" OFF)
option(BUILD_PG_18 "Build PostgreSQL 18 extension" ON)
option(USE_DEEPLAKE_SHARED "Use shared library for deeplake_api (default: auto-detect)" OFF)
set(PG_MODULE deeplake_pg)
set(PG_VERSIONS)
if(BUILD_PG_17)
list(APPEND PG_VERSIONS 17)
endif()
if(BUILD_PG_18)
list(APPEND PG_VERSIONS 18)
endif()
project(${PG_MODULE})
file(GLOB_RECURSE PG_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/${PG_MODULE}/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/${PG_MODULE}/*.c")
message(STATUS "PG_MODULE sources found: ${PG_SOURCES}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-register -Wno-deprecated-declarations -Wno-unused-parameter -Wno-unused-variable")
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/FindPostgres.cmake)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
if(NOT WIN32)
add_compile_options(-fno-omit-frame-pointer)
endif()
if(NOT WIN32)
# OpenSSL
find_package(OpenSSL REQUIRED)
list(APPEND DEEPLAKE_STATIC_LINK_LIBS OpenSSL::SSL OpenSSL::Crypto)
endif()
# Z
find_package(ZLIB REQUIRED)
list(APPEND DEEPLAKE_STATIC_LINK_LIBS ZLIB::ZLIB)
find_package(CURL CONFIG REQUIRED)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/FindDuckDB.cmake)
# Find DeepLake API library
set(CMAKE_PREFIX_PATH ${CMAKE_CURRENT_SOURCE_DIR}/.ext/deeplake_api ${CMAKE_PREFIX_PATH})
find_package(DeepLakeAPI REQUIRED PATHS ${CMAKE_CURRENT_SOURCE_DIR}/.ext/deeplake_api/lib/cmake/deeplake_api NO_DEFAULT_PATH)
# }
include_directories(${DEFAULT_PARENT_DIR}/.ext/duckdb/src/include)
set(POSTGRES_DIR "${DEFAULT_PARENT_DIR}/../postgres")
foreach(PG_VERSION ${PG_VERSIONS})
set(PG_LIB "pg_deeplake_${PG_VERSION}")
message(STATUS "Creating library ${PG_LIB} with sources: ${PG_SOURCES}")
ADD_LIBRARY(${PG_LIB} SHARED ${PG_SOURCES})
set(PG_TARGET_NAME "configure_postgres_REL_${PG_VERSION}_0")
if(TARGET ${PG_TARGET_NAME})
add_dependencies(${PG_LIB} ${PG_TARGET_NAME})
endif()
if (TARGET duckdb_ep)
add_dependencies(${PG_LIB} duckdb_ep)
endif()
set(PG_SERVER_INCLUDE_DIR "${postgres_INSTALL_DIR_REL_${PG_VERSION}_0}/include/server")
set(PG_INCLUDE_DIR "${postgres_INSTALL_DIR_REL_${PG_VERSION}_0}/include")
set(PG_PKGLIBDIR "${postgres_INSTALL_DIR_REL_${PG_VERSION}_0}/lib")
set(PG_SHAREDIR "${postgres_INSTALL_DIR_REL_${PG_VERSION}_0}/share")
set_target_properties(${PG_LIB} PROPERTIES
PREFIX ""
POSITION_INDEPENDENT_CODE ON
)
target_include_directories(${PG_LIB}
SYSTEM PRIVATE ${PG_SERVER_INCLUDE_DIR} ${PG_INCLUDE_DIR}
PRIVATE
${indicators_INCLUDE_DIRS}
)
get_filename_component(DUCKDB_LIB_DIR "${DUCKDB_LIB_PATH}" DIRECTORY)
target_link_directories(${PG_LIB} PUBLIC ${postgres_INSTALL_DIR_REL_${PG_VERSION}_0}/lib/ ${CMAKE_CURRENT_SOURCE_DIR}/../lib ${DUCKDB_LIB_DIR})
target_link_directories(${PG_LIB} PUBLIC ${PNG_LIBRARIES_DIR})
# Link DeepLake API using the appropriate target (static or shared)
if(USE_DEEPLAKE_SHARED)
message(STATUS "Linking ${PG_LIB} with DeepLake API shared library")
target_link_libraries(${PG_LIB} PUBLIC
pq ecpg ecpg_compat pgcommon_shlib pgfeutils pgport_shlib pgtypes pgcommon pgport
DeepLakeAPI::deeplake_api_shared
${3RD_PARTY_LIBS}
PRIVATE ${DEEPLAKE_STATIC_LINK_LIBS}
)
else()
message(STATUS "Linking ${PG_LIB} with DeepLake API static library")
target_link_libraries(${PG_LIB} PUBLIC
pq ecpg ecpg_compat pgcommon_shlib pgfeutils pgport_shlib pgtypes pgcommon pgport
-Wl,--whole-archive
DeepLakeAPI::deeplake_api_static
-Wl,--no-whole-archive
${3RD_PARTY_LIBS}
PRIVATE ${DEEPLAKE_STATIC_LINK_LIBS}
# Allow multiple definitions due to duplicate object files in unified library
-Wl,--allow-multiple-definition
)
endif()
target_link_libraries(${PG_LIB} PRIVATE
fmt::fmt-header-only OpenSSL::SSL
)
# Link DuckDB libraries by name (not path) so they're found via link_directories
# This works whether DuckDB is pre-built or being built by external project
target_link_libraries(${PG_LIB} PUBLIC
duckdb_static
core_functions_extension
duckdb_fastpforlib
duckdb_fmt
duckdb_fsst
duckdb_hyperloglog
duckdb_mbedtls
duckdb_miniz
duckdb_pg_query
duckdb_re2
duckdb_skiplistlib
duckdb_utf8proc
duckdb_yyjson
duckdb_zstd
jemalloc_extension
parquet_extension
)
set(PG_DEFAULT_LIB_NAME "pg_deeplake${CMAKE_SHARED_LIBRARY_SUFFIX}")
install(TARGETS ${PG_LIB}
LIBRARY DESTINATION ${PG_PKGLIBDIR}
)
install(CODE "
execute_process(COMMAND \${CMAKE_COMMAND} -E rename
${PG_PKGLIBDIR}/${PG_LIB}${CMAKE_SHARED_LIBRARY_SUFFIX}
${PG_PKGLIBDIR}/${PG_DEFAULT_LIB_NAME})
")
install(FILES
${POSTGRES_DIR}/pg_deeplake.control
${POSTGRES_DIR}/pg_deeplake--1.0.sql
DESTINATION ${PG_SHAREDIR}/extension
)
add_custom_command(TARGET ${PG_LIB} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${PG_LIB}${CMAKE_SHARED_LIBRARY_SUFFIX} "${POSTGRES_DIR}/"
COMMENT "Copied ${CMAKE_BINARY_DIR}/${PG_LIB}${CMAKE_SHARED_LIBRARY_SUFFIX} to ${POSTGRES_DIR}/"
)
endforeach()