@@ -34,9 +34,15 @@ set(NANOARROW_VERSION_PATCH "${nanoarrow_VERSION_PATCH}")
34
34
35
35
# Feature options
36
36
option (NANOARROW_IPC "Build IPC extension" OFF )
37
+ option (NANOARROW_FLATCC_ROOT_DIR "Root directory for flatcc include and lib directories"
38
+ OFF )
39
+ option (NANOARROW_FLATCC_INCLUDE_DIR "Include directory for flatcc includes" OFF )
40
+ option (NANOARROW_FLATCC_LIB_DIR "Library directory that contains libflatccrt.a" OFF )
41
+
37
42
option (NANOARROW_DEVICE "Build device extension" OFF )
38
43
39
44
# Development options
45
+ option (NANOARROW_BUILD_APPS "Build utility applications" OFF )
40
46
option (NANOARROW_BUILD_TESTS "Build tests" OFF )
41
47
option (NANOARROW_BUILD_BENCHMARKS "Build benchmarks" OFF )
42
48
option (NANOARROW_BUILD_INTEGRATION_TESTS
@@ -47,6 +53,10 @@ option(NANOARROW_NAMESPACE "A prefix for exported symbols" OFF)
47
53
option (NANOARROW_ARROW_STATIC
48
54
"Use a statically-linked Arrow C++ build when linking tests" OFF )
49
55
56
+ if (NANOARROW_IPC)
57
+ add_library (ipc_coverage_config INTERFACE )
58
+ endif ()
59
+
50
60
if (NANOARROW_NAMESPACE)
51
61
set (NANOARROW_NAMESPACE_DEFINE "#define NANOARROW_NAMESPACE ${NANOARROW_NAMESPACE} " )
52
62
else ()
@@ -63,6 +73,46 @@ endif()
63
73
64
74
configure_file (src/nanoarrow/nanoarrow_config.h.in generated /nanoarrow_config.h)
65
75
76
+ if (NANOARROW_IPC AND (NANOARROW_BUILD_TESTS OR NOT NANOARROW_BUNDLE))
77
+ # Add the flatcc (runtime) dependency
78
+ set (FLATCC_RTONLY
79
+ ON
80
+ CACHE INTERNAL "" )
81
+ set (FLATCC_REFLECTION
82
+ OFF
83
+ CACHE INTERNAL "" )
84
+
85
+ # A flatcc installation is unlikely, so default to building the vendored one
86
+ if (NOT NANOARROW_FLATCC_INCLUDE_DIR AND NOT NANOARROW_FLATCC_ROOT_DIR)
87
+ add_library (flatccrt STATIC
88
+ thirdparty/flatcc/src/runtime/builder.c
89
+ thirdparty/flatcc/src/runtime/emitter.c
90
+ thirdparty/flatcc/src/runtime/verifier.c
91
+ thirdparty/flatcc/src/runtime/refmap.c)
92
+
93
+ set (NANOARROW_FLATCC_INCLUDE_DIR ${CMAKE_CURRENT_LIST_DIR} /thirdparty/flatcc/include )
94
+ target_include_directories (flatccrt
95
+ PUBLIC $<BUILD_INTERFACE:${NANOARROW_FLATCC_INCLUDE_DIR} >
96
+ $<INSTALL_INTERFACE:include >)
97
+ elseif (NOT NANOARROW_FLATCC_ROOT_DIR)
98
+ add_library (flatccrt STATIC IMPORTED )
99
+ set_target_properties (flatccrt
100
+ PROPERTIES IMPORTED_LOCATION
101
+ "${NANOARROW_FLATCC_LIB_DIR} /libflatccrt.a"
102
+ INTERFACE_INCLUDE_DIRECTORIES
103
+ "${NANOARROW_FLATCC_INCLUDE_DIR} " )
104
+
105
+ elseif (NOT NANOARROW_FLATCC_INCLUDE_DIR)
106
+ set (NANOARROW_FLATCC_INCLUDE_DIR ${NANOARROW_FLATCC_ROOT_DIR} /include )
107
+ add_library (flatccrt STATIC IMPORTED )
108
+ set_target_properties (flatccrt
109
+ PROPERTIES IMPORTED_LOCATION
110
+ "${NANOARROW_FLATCC_ROOT_DIR} /lib/libflatccrt.a"
111
+ INTERFACE_INCLUDE_DIRECTORIES
112
+ "${NANOARROW_FLATCC_INCLUDE_DIR} " )
113
+ endif ()
114
+ endif ()
115
+
66
116
if (NANOARROW_BUNDLE)
67
117
# Combine all headers into amalgamation/nanoarrow.h in the build directory
68
118
file (MAKE_DIRECTORY ${CMAKE_BINARY_DIR} /amalgamation)
@@ -133,6 +183,60 @@ if(NANOARROW_BUNDLE)
133
183
${NANOARROW_GTEST_UTIL_HPP_TEMP}
134
184
${NANOARROW_TESTING_HPP_TEMP}
135
185
DESTINATION "." )
186
+
187
+ if (NANOARROW_IPC)
188
+ # nanoarrow_ipc.h is already standalone
189
+ set (NANOARROW_IPC_H_TEMP ${CMAKE_BINARY_DIR} /amalgamation/nanoarrow/nanoarrow_ipc.h)
190
+ file (READ src/nanoarrow/nanoarrow_ipc.h SRC_FILE_CONTENTS)
191
+ file (WRITE ${NANOARROW_IPC_H_TEMP} "${SRC_FILE_CONTENTS} " )
192
+
193
+ set (NANOARROW_IPC_C_TEMP ${CMAKE_BINARY_DIR} /amalgamation/nanoarrow/nanoarrow_ipc.c)
194
+ file (READ src/nanoarrow/nanoarrow_ipc_flatcc_generated.h SRC_FILE_CONTENTS)
195
+ file (WRITE ${NANOARROW_IPC_C_TEMP} "${SRC_FILE_CONTENTS} " )
196
+ file (READ src/nanoarrow/nanoarrow_ipc_decoder.c SRC_FILE_CONTENTS)
197
+ file (APPEND ${NANOARROW_IPC_C_TEMP} "${SRC_FILE_CONTENTS} " )
198
+ file (READ src/nanoarrow/nanoarrow_ipc_reader.c SRC_FILE_CONTENTS)
199
+ file (APPEND ${NANOARROW_IPC_C_TEMP} "${SRC_FILE_CONTENTS} " )
200
+
201
+ # remove the include for the generated files in the bundled version
202
+ file (READ ${NANOARROW_IPC_C_TEMP} SRC_FILE_CONTENTS)
203
+ string (REGEX REPLACE "#include \" nanoarrow_ipc_flatcc_generated.h\" " ""
204
+ SRC_FILE_CONTENTS "${SRC_FILE_CONTENTS} " )
205
+ file (WRITE ${NANOARROW_IPC_C_TEMP} "${SRC_FILE_CONTENTS} " )
206
+
207
+ # combine the flatcc sources
208
+ set (FLATCC_C_TEMP ${CMAKE_BINARY_DIR} /amalgamation/nanoarrow/flatcc.c)
209
+ file (READ thirdparty/flatcc/src/runtime/builder.c SRC_FILE_CONTENTS)
210
+ file (WRITE ${FLATCC_C_TEMP} "${SRC_FILE_CONTENTS} " )
211
+ file (READ thirdparty/flatcc/src/runtime/emitter.c SRC_FILE_CONTENTS)
212
+ file (APPEND ${FLATCC_C_TEMP} "${SRC_FILE_CONTENTS} " )
213
+ file (READ thirdparty/flatcc/src/runtime/verifier.c SRC_FILE_CONTENTS)
214
+ file (APPEND ${FLATCC_C_TEMP} "${SRC_FILE_CONTENTS} " )
215
+ file (READ thirdparty/flatcc/src/runtime/refmap.c SRC_FILE_CONTENTS)
216
+ file (APPEND ${FLATCC_C_TEMP} "${SRC_FILE_CONTENTS} " )
217
+
218
+ # Add a library that the tests can link against (but don't install it)
219
+ if (NANOARROW_BUILD_TESTS)
220
+ # Bundle flatcc into the nanoarrow_ipc library instead of
221
+ # link to the flatccrt static lib we declared above.
222
+ add_library (nanoarrow_ipc ${CMAKE_BINARY_DIR} /amalgamation/nanoarrow/nanoarrow_ipc.c
223
+ ${CMAKE_BINARY_DIR} /amalgamation/nanoarrow/flatcc.c)
224
+
225
+ target_include_directories (nanoarrow_ipc
226
+ PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR} /src>
227
+ $<BUILD_INTERFACE:${nanoarrow_SOURCE_DIR} /src/nanoarrow>
228
+ $<BUILD_INTERFACE:${nanoarrow_BINARY_DIR} /generated >
229
+ $<BUILD_INTERFACE:${NANOARROW_FLATCC_INCLUDE_DIR} >
230
+ )
231
+ endif ()
232
+
233
+ # Install the amalgamated header and sources
234
+ install (FILES ${NANOARROW_IPC_H_TEMP} ${NANOARROW_IPC_C_TEMP} ${FLATCC_C_TEMP}
235
+ DESTINATION "." )
236
+
237
+ # Also install the flatcc headers
238
+ install (DIRECTORY thirdparty/flatcc/include /flatcc DESTINATION "." )
239
+ endif ()
136
240
else ()
137
241
add_library (nanoarrow src/nanoarrow/array.c src/nanoarrow/schema.c
138
242
src/nanoarrow/array_stream.c src/nanoarrow/utils.c)
@@ -215,12 +319,31 @@ else()
215
319
NAMESPACE nanoarrow::)
216
320
endif ()
217
321
endforeach ()
322
+
323
+ if (NANOARROW_IPC)
324
+ add_library (nanoarrow_ipc src/nanoarrow/nanoarrow_ipc_decoder.c
325
+ src/nanoarrow/nanoarrow_ipc_reader.c)
326
+ target_link_libraries (nanoarrow_ipc PRIVATE flatccrt)
327
+
328
+ target_include_directories (nanoarrow_ipc
329
+ PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR} /src>
330
+ $<BUILD_INTERFACE:${nanoarrow_SOURCE_DIR} /src/nanoarrow>
331
+ $<BUILD_INTERFACE:${nanoarrow_BINARY_DIR} /generated >
332
+ $<BUILD_INTERFACE:${NANOARROW_IPC_FLATCC_INCLUDE_DIR} >
333
+ $<INSTALL_INTERFACE:include >)
334
+
335
+ install (TARGETS nanoarrow_ipc DESTINATION lib)
336
+ install (FILES src/nanoarrow/nanoarrow_ipc.h
337
+ src/nanoarrow/nanoarrow_ipc_flatcc_generated.h
338
+ DESTINATION include /nanoarrow)
339
+ endif ()
218
340
endif ()
219
341
220
342
# Always build integration test if building tests
221
343
if (NANOARROW_BUILD_TESTS OR NANOARROW_BUILD_INTEGRATION_TESTS)
222
344
add_subdirectory ("thirdparty/nlohmann_json" )
223
345
346
+ set_target_properties (nanoarrow PROPERTIES POSITION_INDEPENDENT_CODE ON )
224
347
add_library (nanoarrow_c_data_integration SHARED
225
348
src/nanoarrow/integration/c_data_integration.cc)
226
349
target_include_directories (nanoarrow_c_data_integration
@@ -310,10 +433,73 @@ if(NANOARROW_BUILD_TESTS)
310
433
gtest_discover_tests(nanoarrow_hpp_test DISCOVERY_TIMEOUT 10)
311
434
gtest_discover_tests(nanoarrow_testing_test DISCOVERY_TIMEOUT 10)
312
435
gtest_discover_tests(c_data_integration_test DISCOVERY_TIMEOUT 10)
436
+
437
+ if (NANOARROW_IPC)
438
+
439
+ # zlib to decode gzipped integration testing JSON files
440
+ # We don't use Arrow C++ for this because building Arrow C++ with zlib
441
+ # is not trivial on Windows.
442
+ find_package (ZLIB)
443
+ if (NOT ZLIB_FOUND)
444
+ # Wrapper around FetchContent that better isolates the zlib CMakeLists.txt
445
+ message (STATUS "Using FetchContent to build a static zlib" )
446
+ add_subdirectory (thirdparty/zlib)
447
+ endif ()
448
+
449
+ enable_testing ()
450
+
451
+ add_executable (nanoarrow_ipc_decoder_test src/nanoarrow/nanoarrow_ipc_decoder_test.cc)
452
+ add_executable (nanoarrow_ipc_reader_test src/nanoarrow/nanoarrow_ipc_reader_test.cc)
453
+ add_executable (nanoarrow_ipc_files_test src/nanoarrow/nanoarrow_ipc_files_test.cc)
454
+ add_executable (nanoarrow_ipc_hpp_test src/nanoarrow/nanoarrow_ipc_hpp_test.cc)
455
+
456
+ if (NANOARROW_CODE_COVERAGE)
457
+ target_compile_options (ipc_coverage_config INTERFACE -O0 -g --coverage)
458
+ target_link_options (ipc_coverage_config INTERFACE --coverage)
459
+ target_link_libraries (nanoarrow_ipc PRIVATE ipc_coverage_config)
460
+ endif ()
461
+ target_link_libraries (nanoarrow_ipc_decoder_test
462
+ nanoarrow_ipc
463
+ nanoarrow
464
+ flatccrt
465
+ ${NANOARROW_ARROW_TARGET}
466
+ gtest_main
467
+ ipc_coverage_config)
468
+ target_link_libraries (nanoarrow_ipc_reader_test
469
+ nanoarrow_ipc
470
+ nanoarrow
471
+ flatccrt
472
+ gtest_main
473
+ ipc_coverage_config)
474
+ target_link_libraries (nanoarrow_ipc_files_test
475
+ nanoarrow_ipc
476
+ nanoarrow
477
+ flatccrt
478
+ ${NANOARROW_ARROW_TARGET}
479
+ nlohmann_json
480
+ ZLIB::ZLIB
481
+ gtest_main
482
+ ipc_coverage_config)
483
+ target_link_libraries (nanoarrow_ipc_hpp_test
484
+ nanoarrow_ipc
485
+ nanoarrow
486
+ ${NANOARROW_ARROW_TARGET}
487
+ gtest_main
488
+ ipc_coverage_config)
489
+
490
+ include (GoogleTest)
491
+ gtest_discover_tests(nanoarrow_ipc_decoder_test)
492
+ gtest_discover_tests(nanoarrow_ipc_reader_test)
493
+ gtest_discover_tests(nanoarrow_ipc_files_test)
494
+ gtest_discover_tests(nanoarrow_ipc_hpp_test)
495
+ endif ()
313
496
endif ()
314
497
315
- if (NANOARROW_BUILD_BENCHMARKS OR NANOARROW_IPC)
316
- add_subdirectory (extensions/nanoarrow_ipc)
498
+ if (NANOARROW_BUILD_APPS)
499
+ if (NANOARROW_IPC)
500
+ add_executable (dump_stream src/apps/dump_stream.c)
501
+ target_link_libraries (dump_stream nanoarrow_ipc nanoarrow)
502
+ endif ()
317
503
endif ()
318
504
319
505
if (NANOARROW_DEVICE)
0 commit comments