forked from duckdb/duckdb-java
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCMakeLists.txt.in
178 lines (133 loc) · 4.13 KB
/
CMakeLists.txt.in
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# Java and JNI
find_package(Java 1.8)
set(JAVA_AWT_LIBRARY NotNeeded)
set(JAVA_JVM_LIBRARY NotNeeded)
find_package(JNI)
cmake_minimum_required(VERSION 3.11.0)
set(CMAKE_CXX_STANDARD "11" CACHE STRING "C++ standard to enforce")
set(CMAKE_VERBOSE_MAKEFILE OFF)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
if(NOT JNI_FOUND OR NOT Java_FOUND)
message(FATAL_ERROR "No compatible Java/JNI found")
endif()
if(NOT(Java_VERSION_MAJOR STREQUAL "1" AND Java_VERSION_MINOR STREQUAL "8"))
message(WARNING "JDK ${Java_VERSION} is used to compile the Java part of the driver, resulting binaries will NOT be compatible with JDK 8.")
endif()
include(UseJava)
# project definition
project(DuckDBJava C CXX Java)
if (NOT CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "")
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "" FORCE)
endif()
# variables set by vendor.py
set(DUCKDB_INCLUDE_DIRS
${INCLUDES})
set(JEMALLOC_INCLUDE_DIRS
${JEMALLOC_INCLUDES})
set(DUCKDB_DEFINITIONS
${DEFINES})
set(DUCKDB_SRC_FILES
${SOURCES})
set(JEMACLLOC_SRC_FILES
${JEMALLOC_SOURCES})
# a few OS-specific variables
set(OS_NAME "unknown")
set(OS_ARCH "amd64")
string(REGEX MATCH "(arm64|aarch64)" IS_ARM "${CMAKE_SYSTEM_PROCESSOR}")
if(IS_ARM)
set(OS_ARCH "arm64")
elseif(FORCE_32_BIT)
set(OS_ARCH "i386")
endif()
if(APPLE)
set(OS_NAME "osx")
set(OS_ARCH "universal")
SET(CMAKE_OSX_ARCHITECTURES "x86_64;arm64" CACHE STRING "Build architectures for Mac OS X" FORCE)
endif()
if(WIN32)
set(OS_NAME "windows")
endif()
if(UNIX AND NOT APPLE)
set(OS_NAME "linux") # sorry BSD
endif()
if(OVERRIDE_JDBC_OS_ARCH)
set(OS_ARCH ${OVERRIDE_JDBC_OS_ARCH})
endif()
# Java compilation
file(GLOB_RECURSE JAVA_SRC_FILES src/main/java/org/duckdb/*.java)
file(GLOB_RECURSE JAVA_TEST_FILES src/test/java/org/duckdb/*.java)
set(CMAKE_JAVA_COMPILE_FLAGS -encoding utf-8 -g)
add_jar(duckdb_jdbc ${JAVA_SRC_FILES} META-INF/services/java.sql.Driver
GENERATE_NATIVE_HEADERS duckdb-native)
add_jar(duckdb_jdbc_tests ${JAVA_TEST_FILES} INCLUDE_JARS duckdb_jdbc)
# main shared lib compilation
if(MSVC)
list(APPEND DUCKDB_SRC_FILES duckdb_java.def)
else()
list(APPEND DUCKDB_SRC_FILES ${JEMACLLOC_SRC_FILES})
endif()
add_library(duckdb_java SHARED
src/jni/config.cpp
src/jni/duckdb_java.cpp
src/jni/functions.cpp
src/jni/refs.cpp
src/jni/util.cpp
${DUCKDB_SRC_FILES})
target_include_directories(duckdb_java PRIVATE
${JAVA_INCLUDE_PATH}
${JAVA_INCLUDE_PATH2}
${DUCKDB_INCLUDE_DIRS})
if (NOT MSVC)
target_include_directories(duckdb_java PRIVATE
${JEMALLOC_INCLUDE_DIRS})
endif()
target_link_libraries(duckdb_java PRIVATE
duckdb-native
${CMAKE_DL_LIBS})
if(MSVC)
target_link_libraries(duckdb_java PRIVATE
ws2_32
rstrtmgr
bcrypt)
endif()
if(MSVC)
target_compile_options(duckdb_java PRIVATE
/bigobj)
else()
target_compile_options(duckdb_java PRIVATE
-fexceptions)
endif()
target_compile_definitions(duckdb_java PRIVATE
${DUCKDB_DEFINITIONS}
-DDUCKDB_BUILD_LIBRARY
-DDUCKDB_STATIC_BUILD
-DDUCKDB_EXTENSION_AUTOLOAD_DEFAULT
-DDUCKDB_EXTENSION_AUTOINSTALL_DEFAULT)
if(MSVC)
target_compile_definitions(duckdb_java PRIVATE
-D_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR)
else()
target_compile_definitions(duckdb_java PRIVATE
-DDUCKDB_EXTENSION_JEMALLOC_LINKED)
endif()
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
target_link_options(duckdb_java PRIVATE
-Bsymbolic
-Bsymbolic-functions
-fvisibility=hidden
-Wl,--version-script=${CMAKE_CURRENT_LIST_DIR}/duckdb_java.map)
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
target_link_options(duckdb_java PRIVATE
-fvisibility=hidden
-Wl,-exported_symbols_list,${CMAKE_CURRENT_LIST_DIR}/duckdb_java.exp)
endif()
string(JOIN "_" LIB_SUFFIX ".so" ${OS_NAME} ${OS_ARCH})
set_target_properties(duckdb_java PROPERTIES SUFFIX ${LIB_SUFFIX})
set_target_properties(duckdb_java PROPERTIES PREFIX "lib")
# JAR packing
add_custom_command(
OUTPUT dummy_jdbc_target
DEPENDS duckdb_java duckdb_jdbc duckdb_jdbc_tests
COMMAND ${Java_JAR_EXECUTABLE} uf duckdb_jdbc.jar -C
$<TARGET_FILE_DIR:duckdb_java> $<TARGET_FILE_NAME:duckdb_java>)
add_custom_target(jdbc ALL DEPENDS dummy_jdbc_target)