-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
192 lines (158 loc) · 6.99 KB
/
CMakeLists.txt
File metadata and controls
192 lines (158 loc) · 6.99 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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
cmake_minimum_required(VERSION 3.15)
project(spark_connect_cpp VERSION 0.0.1 LANGUAGES CXX)
option(ENABLE_COVERAGE "Enable coverage reporting" OFF)
if(ENABLE_COVERAGE)
message(STATUS "Coverage enabled")
add_compile_options(--coverage -O0 -g)
add_link_options(--coverage)
endif()
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_BUILD_TYPE Debug)
#########################################################################
# DEPENDENCIES
#########################################################################
find_package(PkgConfig REQUIRED)
# ---------------------------------
# Arrow & Parquet
# ---------------------------------
pkg_check_modules(ARROW REQUIRED IMPORTED_TARGET
arrow parquet arrow-dataset arrow-flight arrow-flight-sql gandiva)
# ---------------------------------
# gRPC, Protobuf & Threads
# ---------------------------------
find_package(Protobuf REQUIRED)
find_package(gRPC REQUIRED)
find_package(Threads REQUIRED)
# ---------------------------------
# Google Test
# ---------------------------------
find_package(GTest REQUIRED)
# ---------------------------------
# UUID & Abseil
# ---------------------------------
pkg_check_modules(UUID REQUIRED IMPORTED_TARGET uuid)
pkg_check_modules(ABSL REQUIRED IMPORTED_TARGET absl_synchronization)
# ---------------------------------
# Protobuf/gRPC Generation
# ---------------------------------
find_program(PROTOC_EXECUTABLE NAMES protoc)
find_program(GRPC_CPP_PLUGIN NAMES grpc_cpp_plugin)
set(PROTO_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src/spark/connect")
set(GEN_DIR "${CMAKE_CURRENT_BINARY_DIR}/gen")
file(MAKE_DIRECTORY ${GEN_DIR})
file(GLOB PROTO_SRCS "${PROTO_DIR}/*.proto")
set(PROTO_GENERATED_FILES)
foreach(proto_file ${PROTO_SRCS})
get_filename_component(proto_name ${proto_file} NAME_WE)
set(gen_pb_cc "${GEN_DIR}/spark/connect/${proto_name}.pb.cc")
set(gen_pb_h "${GEN_DIR}/spark/connect/${proto_name}.pb.h")
set(gen_grpc_cc "${GEN_DIR}/spark/connect/${proto_name}.grpc.pb.cc")
set(gen_grpc_h "${GEN_DIR}/spark/connect/${proto_name}.grpc.pb.h")
add_custom_command(
OUTPUT "${gen_pb_cc}" "${gen_pb_h}" "${gen_grpc_cc}" "${gen_grpc_h}"
COMMAND ${PROTOC_EXECUTABLE}
ARGS --cpp_out "${GEN_DIR}"
--grpc_out "${GEN_DIR}"
--plugin=protoc-gen-grpc=${GRPC_CPP_PLUGIN}
--experimental_allow_proto3_optional
-I "${CMAKE_CURRENT_SOURCE_DIR}/src"
"${proto_file}"
DEPENDS "${proto_file}"
COMMENT "Running gRPC/Protobuf compiler on ${proto_file}"
VERBATIM
)
list(APPEND PROTO_GENERATED_FILES "${gen_pb_cc}" "${gen_pb_h}" "${gen_grpc_cc}" "${gen_grpc_h}")
endforeach()
add_custom_target(proto DEPENDS ${PROTO_GENERATED_FILES})
#########################################################################
# Library Target
#########################################################################
file(GLOB_RECURSE LIB_SOURCES "src/*.cpp")
list(FILTER LIB_SOURCES EXCLUDE REGEX "src/main.cpp")
add_library(spark_connect_cpp STATIC ${LIB_SOURCES} ${PROTO_GENERATED_FILES})
# add_library(spark_connect_cpp SHARED ${LIB_SOURCES} ${PROTO_GENERATED_FILES})
target_include_directories(spark_connect_cpp PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
$<BUILD_INTERFACE:${GEN_DIR}>
$<INSTALL_INTERFACE:include/spark_connect_cpp>
)
target_link_libraries(spark_connect_cpp PUBLIC
PkgConfig::ARROW
PkgConfig::UUID
PkgConfig::ABSL
gRPC::grpc++
protobuf::libprotobuf
Threads::Threads
)
set_target_properties(spark_connect_cpp PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION 1
)
#########################################################################
# Testing Configuration
#########################################################################
enable_testing()
# -------------------------------------------------------
# Helper macro to reduce boilerplate for adding gTests
# -------------------------------------------------------
macro(add_spark_test TEST_NAME SOURCE_FILE)
add_executable(${TEST_NAME} ${SOURCE_FILE})
target_link_libraries(${TEST_NAME} PRIVATE
spark_connect_cpp
GTest::gtest
GTest::gmock
GTest::gtest_main
)
add_test(NAME ${TEST_NAME} COMMAND ${TEST_NAME})
# -------------------------------------------------------
# Automatically tag databricks tests as "dbrx"
# -------------------------------------------------------
if(${TEST_NAME} MATCHES "databricks")
set_tests_properties(${TEST_NAME} PROPERTIES LABELS "dbrx")
endif()
set_tests_properties(${TEST_NAME} PROPERTIES ENVIRONMENT "GTEST_COLOR=1")
endmacro()
######################################################
# Test Suite Definitions
######################################################
add_spark_test(test_configuration tests/configuration.cpp)
add_spark_test(test_dataframe tests/dataframe.cpp)
add_spark_test(test_graphframes tests/graphframes.cpp)
add_spark_test(test_risk_management tests/risk_management.cpp)
add_spark_test(test_dataframe_columns tests/dataframe_columns.cpp)
add_spark_test(test_dataframe_reader tests/dataframe_reader.cpp)
add_spark_test(test_dataframe_writer tests/dataframe_writer.cpp)
add_spark_test(test_expressions tests/expressions.cpp)
add_spark_test(test_aggregations tests/aggregations.cpp)
# -----------------------------------------------------------------------
# The following tests will be labeled "dbrx" automatically
# Since these specifically require an active Databricks connection,
# we can conditionally exclude them.
# -----------------------------------------------------------------------
add_spark_test(test_traditional_databricks_cluster tests/traditional_databricks_cluster.cpp)
add_spark_test(test_serverless_databricks_cluster tests/serverless_databricks_cluster.cpp)
#########################################################################
# Installation
#########################################################################
include(GNUInstallDirs)
install(TARGETS spark_connect_cpp
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
install(DIRECTORY src/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/spark_connect_cpp)
install(DIRECTORY ${GEN_DIR}/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/spark_connect_cpp)
configure_file(spark_connect_cpp.pc.in spark_connect_cpp.pc @ONLY)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/spark_connect_cpp.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
#########################################################################
# CPack
#########################################################################
set(CPACK_GENERATOR "TGZ")
set(CPACK_PACKAGE_NAME "spark-connect-cpp")
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Spark Connect C++ Static Library")
set(CPACK_PACKAGE_VENDOR "Irfan M. Ghat")
set(CPACK_PACKAGE_FILE_NAME "spark-connect-cpp-${PROJECT_VERSION}-linux-amd64")
include(CPack)