@@ -34,9 +34,15 @@ set(NANOARROW_VERSION_PATCH "${nanoarrow_VERSION_PATCH}")
3434
3535# Feature options
3636option (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+
3742option (NANOARROW_DEVICE "Build device extension" OFF )
3843
3944# Development options
45+ option (NANOARROW_BUILD_APPS "Build utility applications" OFF )
4046option (NANOARROW_BUILD_TESTS "Build tests" OFF )
4147option (NANOARROW_BUILD_BENCHMARKS "Build benchmarks" OFF )
4248option (NANOARROW_BUILD_INTEGRATION_TESTS
@@ -47,6 +53,10 @@ option(NANOARROW_NAMESPACE "A prefix for exported symbols" OFF)
4753option (NANOARROW_ARROW_STATIC
4854 "Use a statically-linked Arrow C++ build when linking tests" OFF )
4955
56+ if (NANOARROW_IPC)
57+ add_library (ipc_coverage_config INTERFACE )
58+ endif ()
59+
5060if (NANOARROW_NAMESPACE)
5161 set (NANOARROW_NAMESPACE_DEFINE "#define NANOARROW_NAMESPACE ${NANOARROW_NAMESPACE} " )
5262else ()
@@ -63,6 +73,46 @@ endif()
6373
6474configure_file (src/nanoarrow/nanoarrow_config.h.in generated /nanoarrow_config.h)
6575
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+
66116if (NANOARROW_BUNDLE)
67117 # Combine all headers into amalgamation/nanoarrow.h in the build directory
68118 file (MAKE_DIRECTORY ${CMAKE_BINARY_DIR} /amalgamation)
@@ -133,6 +183,60 @@ if(NANOARROW_BUNDLE)
133183 ${NANOARROW_GTEST_UTIL_HPP_TEMP}
134184 ${NANOARROW_TESTING_HPP_TEMP}
135185 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 ()
136240else ()
137241 add_library (nanoarrow src/nanoarrow/array.c src/nanoarrow/schema.c
138242 src/nanoarrow/array_stream.c src/nanoarrow/utils.c)
@@ -215,12 +319,31 @@ else()
215319 NAMESPACE nanoarrow::)
216320 endif ()
217321 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 ()
218340endif ()
219341
220342# Always build integration test if building tests
221343if (NANOARROW_BUILD_TESTS OR NANOARROW_BUILD_INTEGRATION_TESTS)
222344 add_subdirectory ("thirdparty/nlohmann_json" )
223345
346+ set_target_properties (nanoarrow PROPERTIES POSITION_INDEPENDENT_CODE ON )
224347 add_library (nanoarrow_c_data_integration SHARED
225348 src/nanoarrow/integration/c_data_integration.cc)
226349 target_include_directories (nanoarrow_c_data_integration
@@ -310,10 +433,73 @@ if(NANOARROW_BUILD_TESTS)
310433 gtest_discover_tests(nanoarrow_hpp_test DISCOVERY_TIMEOUT 10)
311434 gtest_discover_tests(nanoarrow_testing_test DISCOVERY_TIMEOUT 10)
312435 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 ()
313496endif ()
314497
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 ()
317503endif ()
318504
319505if (NANOARROW_DEVICE)
0 commit comments