Skip to content

Commit f443e46

Browse files
authored
refactor: Consolidate IPC extension into main project (#511)
1 parent 7b88926 commit f443e46

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

77 files changed

+223
-900
lines changed

.gitattributes

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,5 @@
1616
# under the License.
1717

1818
dist/* linguist-generated
19-
extensions/nanoarrow_ipc/thirdparty/* linguist-vendored
19+
thirdparty/* linguist-vendored
2020
python/src/nanoarrow/*.pxi linguist-generated

.github/workflows/build-and-test-ipc.yaml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ on:
2828
- 'CMakeLists.txt'
2929
- '.github/workflows/build-and-test-ipc.yaml'
3030
- 'src/nanoarrow/**'
31-
- 'extensions/nanoarrow_ipc/**'
3231

3332
permissions:
3433
contents: read
@@ -44,13 +43,13 @@ jobs:
4443
fail-fast: false
4544
matrix:
4645
config:
47-
- {label: default-build, cmake_args: "-DNANOARROW_IPC_BUILD_APPS=ON"}
46+
- {label: default-build, cmake_args: "-DNANOARROW_BUILD_APPS=ON"}
4847
- {label: default-noatomics, cmake_args: "-DCMAKE_C_FLAGS='-DNANOARROW_IPC_USE_STDATOMIC=0'"}
4948
- {label: namespaced-build, cmake_args: "-DNANOARROW_NAMESPACE=SomeUserNamespace"}
50-
- {label: bundled-build, cmake_args: "-DNANOARROW_IPC_BUNDLE=ON"}
49+
- {label: bundled-build, cmake_args: "-DNANOARROW_BUNDLE=ON"}
5150

5251
env:
53-
SUBDIR: 'extensions/nanoarrow_ipc'
52+
SUBDIR: '${{ github.workspace }}'
5453
NANOARROW_ARROW_TESTING_DIR: '${{ github.workspace }}/arrow-testing'
5554

5655
steps:
@@ -91,8 +90,9 @@ jobs:
9190
mkdir build
9291
cd build
9392
94-
cmake .. -DCMAKE_BUILD_TYPE=Debug -DNANOARROW_IPC_BUILD_TESTS=ON \
95-
-DCMAKE_PREFIX_PATH="${ARROW_PATH}" ${{ matrix.config.cmake_args }}
93+
cmake .. -DCMAKE_BUILD_TYPE=Debug -DNANOARROW_BUILD_TESTS=ON \
94+
-DNANOARROW_IPC=ON -DCMAKE_PREFIX_PATH="${ARROW_PATH}" \
95+
${{ matrix.config.cmake_args }}
9696
9797
cmake --build .
9898
@@ -147,4 +147,4 @@ jobs:
147147
uses: actions/upload-artifact@main
148148
with:
149149
name: nanoarrow-ipc-memcheck
150-
path: extensions/nanoarrow_ipc/build/Testing/Temporary/MemoryChecker.*.log
150+
path: build/Testing/Temporary/MemoryChecker.*.log

.github/workflows/bundle.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@ jobs:
4444
4545
- name: Bundle nanoarrow_ipc
4646
run: |
47-
cd extensions/nanoarrow_ipc
47+
rm -rf build
4848
mkdir build && cd build
49-
cmake .. -DNANOARROW_IPC_BUNDLE=ON
49+
cmake .. -DNANOARROW_BUNDLE=ON -DNANOARROW_IPC=ON
5050
cmake --build .
51-
cmake --install . --prefix=../../../nanoarrow-latest
51+
cmake --install . --prefix=../nanoarrow-latest
5252
5353
- name: Bundle nanoarrow_device
5454
run: |

.github/workflows/coverage.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ on:
3131
- 'docker-compose.yml'
3232
- 'CMakeLists.txt'
3333
- 'src/nanoarrow/**'
34-
- 'extensions/nanoarrow_ipc/**'
3534
- 'r/**'
3635

3736
jobs:

.github/workflows/docs.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ on:
2929
- 'ci/scripts/coverage.sh'
3030
- 'ci/docker/ubuntu.dockerfile'
3131
- 'docker-compose.yml'
32-
- 'extensions/nanoarrow_ipc/src/**'
3332
- 'src/**'
3433
- 'r/**'
3534
- 'docs/source/**'

.github/workflows/examples.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ jobs:
9090
cmake --build .
9191
cmake --install . --prefix=../src/nanoarrow
9292
mkdir ../build_ipc && cd ../build_ipc
93-
cmake ../../../extensions/nanoarrow_ipc -DNANOARROW_IPC_BUNDLE=ON
93+
cmake ../../.. -DNANOARROW_BUNDLE=ON -DNANOARROW_IPC=ON
9494
cmake --build .
9595
cmake --install . --prefix=../src/nanoarrow
9696

.pre-commit-config.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ repos:
3535
- id: clang-format
3636
args: [-i]
3737
types_or: [c, c++]
38-
exclude: "(^extensions/nanoarrow_ipc/thirdparty/.*$)|(nanoarrow_ipc_flatcc_generated.h)"
38+
exclude: "(^thirdparty/.*$)|(nanoarrow_ipc_flatcc_generated.h)"
3939
- repo: https://github.com/cheshirekow/cmake-format-precommit
4040
rev: v0.6.13
4141
hooks:
@@ -65,7 +65,7 @@ repos:
6565
additional_dependencies: [tomli]
6666
exclude: |
6767
(?x)
68-
^extensions/nanoarrow_ipc/thirdparty
68+
^thirdparty
6969
|nanoarrow_ipc_flatcc_generated.h
7070
|nanoarrow_device_metal.cc
7171

CMakeLists.txt

Lines changed: 188 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,15 @@ set(NANOARROW_VERSION_PATCH "${nanoarrow_VERSION_PATCH}")
3434

3535
# Feature options
3636
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+
3742
option(NANOARROW_DEVICE "Build device extension" OFF)
3843

3944
# Development options
45+
option(NANOARROW_BUILD_APPS "Build utility applications" OFF)
4046
option(NANOARROW_BUILD_TESTS "Build tests" OFF)
4147
option(NANOARROW_BUILD_BENCHMARKS "Build benchmarks" OFF)
4248
option(NANOARROW_BUILD_INTEGRATION_TESTS
@@ -47,6 +53,10 @@ option(NANOARROW_NAMESPACE "A prefix for exported symbols" OFF)
4753
option(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+
5060
if(NANOARROW_NAMESPACE)
5161
set(NANOARROW_NAMESPACE_DEFINE "#define NANOARROW_NAMESPACE ${NANOARROW_NAMESPACE}")
5262
else()
@@ -63,6 +73,46 @@ endif()
6373

6474
configure_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+
66116
if(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()
136240
else()
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()
218340
endif()
219341

220342
# Always build integration test if building tests
221343
if(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()
313496
endif()
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()
317503
endif()
318504

319505
if(NANOARROW_DEVICE)

LICENSE.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,6 @@
203203

204204
--------------------------------------------------------------------------------
205205

206-
extensions/nanoarrow_ipc/thirdparty/flatcc, dist/flatcc.c,
207-
and dist/flatcc: Apache 2.0
206+
thirdparty/flatcc, dist/flatcc.c, and dist/flatcc: Apache 2.0
208207

209208
Copyright 2015-2023 Mikkel F. Jørgensen, dvide.com

ci/scripts/build-docs.sh

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,6 @@ main() {
7272
doxygen
7373
popd
7474

75-
show_header "Run Doxygen for IPC extension"
76-
pushd extensions/nanoarrow_ipc/src/apidoc
77-
doxygen
78-
popd
79-
8075
show_header "Run Doxygen for device extension"
8176
pushd extensions/nanoarrow_device/src/apidoc
8277
doxygen

ci/scripts/coverage.sh

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -67,25 +67,13 @@ function main() {
6767
fi
6868
mkdir "${SANDBOX_DIR}"
6969

70-
# Bulid + run tests with gcov for core library
70+
# Bulid + run tests with gcov
7171
show_header "Build + test nanoarrow"
7272
mkdir "${SANDBOX_DIR}/nanoarrow"
7373
pushd "${SANDBOX_DIR}/nanoarrow"
7474

7575
cmake "${TARGET_NANOARROW_DIR}" \
76-
-DNANOARROW_BUILD_TESTS=ON -DNANOARROW_CODE_COVERAGE=ON
77-
cmake --build .
78-
CTEST_OUTPUT_ON_FAILURE=1 ctest .
79-
80-
popd
81-
82-
# Build + run tests with gcov for IPC extension
83-
show_header "Build + test nanoarrow_ipc"
84-
mkdir "${SANDBOX_DIR}/nanoarrow_ipc"
85-
pushd "${SANDBOX_DIR}/nanoarrow_ipc"
86-
87-
cmake "${TARGET_NANOARROW_DIR}/extensions/nanoarrow_ipc" \
88-
-DNANOARROW_IPC_BUILD_TESTS=ON -DNANOARROW_IPC_CODE_COVERAGE=ON
76+
-DNANOARROW_IPC=ON -DNANOARROW_BUILD_TESTS=ON -DNANOARROW_CODE_COVERAGE=ON
8977
cmake --build .
9078
CTEST_OUTPUT_ON_FAILURE=1 ctest .
9179

0 commit comments

Comments
 (0)