Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ __pycache__
# meson subprojects - wrap files need to be kept to let meson download
# dependencies as needed, but dependencies themselves should not be versioned
subprojects/*
!subprojects/packagefiles
!subprojects/*.wrap

compile_commands.json
4 changes: 2 additions & 2 deletions ci/scripts/build-with-meson.sh
Original file line number Diff line number Diff line change
Expand Up @@ -68,12 +68,12 @@ function main() {
show_header "Run test suite"
meson configure -Dtests=true -Db_coverage=true
meson compile
meson test --wrap valgrind
meson test --wrap='valgrind --track-origins=yes --leak-check=full' --print-errorlogs

show_header "Run benchmarks"
meson configure -Dbenchmarks=true
meson compile
meson test --benchmark
meson test --benchmark --print-errorlogs

show_header "Generate coverage reports"
ninja coverage
Expand Down
3 changes: 0 additions & 3 deletions dev/release/rat_exclude_files.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,3 @@ dist/flatcc.c
src/nanoarrow/nanoarrow_ipc_flatcc_generated.h
thirdparty/*
python/src/nanoarrow/dlpack_abi.h
subprojects/google-benchmark.wrap
subprojects/gtest.wrap
subprojects/nlohmann_json.wrap
11 changes: 11 additions & 0 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,14 @@ subdir('src/nanoarrow')
if get_option('benchmarks')
subdir('dev/benchmarks')
endif


if get_option('apps')
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I should really move the meson.build from the src/nanoarrow directory up to here to mirror what is done for CMake, but am leaving that for a separate PR. For now just put this apps piece up here since it does not live in src/nanoarrow

if get_option('ipc')
executable(
'dump_stream',
'src/apps/dump_stream.c',
dependencies: [nanoarrow_dep, nanoarrow_ipc_dep]
)
endif
endif
2 changes: 2 additions & 0 deletions meson.options
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@

option('tests', type: 'boolean', description: 'Build tests', value: false)
option('benchmarks', type: 'boolean', description: 'Build benchmarks', value: false)
option('apps', type: 'boolean', description: 'Build utility applications', value: false)
option('ipc', type: 'boolean', description: 'Build IPC libraries', value: false)
option('integration_tests', type: 'boolean',
description: 'Build cross-implementation Arrow integration tests',
value: false)
Expand Down
2 changes: 1 addition & 1 deletion src/apps/dump_stream.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

void dump_schema_to_stdout(struct ArrowSchema* schema, int level, char* buf,
int buf_size) {
int n_chars = ArrowSchemaToString(schema, buf, buf_size, 0);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is still needed (or else the top-level type will never appear in the dump). Maybe just remove int n_chars = (if the unused variable was a problem?)

ArrowSchemaToString(schema, buf, buf_size, 0);

for (int i = 0; i < level; i++) {
fprintf(stdout, " ");
Expand Down
52 changes: 52 additions & 0 deletions src/nanoarrow/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,26 @@ incdir = include_directories('..')
nanoarrow_dep = declare_dependency(include_directories: [curdir, incdir],
link_with: nanoarrow_lib)

if get_option('ipc')
cmake = import('cmake')
cmake_opts = cmake.subproject_options()
cmake_opts.add_cmake_defines({'CMAKE_POSITION_INDEPENDENT_CODE': true})
flatcc_subproj = cmake.subproject('flatcc', options: cmake_opts)
flatcc_dep = flatcc_subproj.dependency('flatccrt')
Comment on lines +68 to +72
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This would mean that CMake is required to build the flatcc runtime? I get that it is more "meson"ic to use the wrap file; however, it might also be a little strange that building nanoarrow_ipc via CMake will give you a slightly different result than using Meson. I think I'd prefer that the default build uses the vendored version (via a pure Meson compile of the four files in thirdparty/flatcc/src/runtime), and perhaps our dependency relationship with flatcc could be improved in both CMake/Meson (perhaps with some contributions to the upstream setup).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK cool will take a look. I believe flatcc is trying to switch to Meson as well, so yea can look and see if that makes for a good upstream contribution

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is solved in https://github.com/apache/arrow-nanoarrow/pull/483/files/82a6b48e4218f24b320cfb9e05f972c59d2cdd37..b878e23bb721f07a058e9f63a4db3aa6588f0faa

Basically Meson allows you to provide your own "patch" file for systems that don't use Meson. The file(s) go in subprojects/packagefiles/<patch_dir> and the wrap system still takes care of fetching / downloading the library for you, rather than requiring you to vendor into your source tree

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ugh set up the subproject here correctly but forgot to come back and update the code block here. Will push up a follow up PR to correct


nanoarrow_ipc_lib = build_target(
'nanoarrow_ipc',
'nanoarrow_ipc_decoder.c',
'nanoarrow_ipc_reader.c',
dependencies: [nanoarrow_dep, flatcc_dep],
install: true,
target_type: libtype,
)
nanoarrow_ipc_dep = declare_dependency(include_directories: [incdir],
link_with: nanoarrow_ipc_lib,
dependencies: [nanoarrow_dep, flatcc_dep])
endif

if get_option('tests') or get_option('integration_tests')
nlohmann_json_dep = dependency('nlohmann_json')

Expand Down Expand Up @@ -147,4 +167,36 @@ if get_option('tests')
include_directories: incdir)
test('c_data_integration test', c_data_integration_test)

if get_option('ipc')
zlib_dep = dependency('zlib')
ipc_test_files = {
'nanoarrow-ipc-decoder': {
'deps': [nanoarrow_ipc_dep, arrow_dep, gtest_dep],
},
'nanoarrow-ipc-reader': {
'deps': [nanoarrow_ipc_dep, arrow_dep, gtest_dep],
},
'nanoarrow-ipc-files': {
'deps': [
nanoarrow_ipc_dep,
zlib_dep,
arrow_dep,
gtest_dep,
nlohmann_json_dep
],
},
'nanoarrow-ipc-hpp': {
'deps': [nanoarrow_ipc_dep, gtest_dep],
},
}

foreach name, config : ipc_test_files
exc = executable(
name + '-test',
name.replace('-', '_') + '_test.cc',
dependencies: config['deps']
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be possible to factor more common dependencies like gtest_dep into link_with?

(Also: I don't think that nanoarrow_dep or flatcc_dep is needed because it should be handled as a transitive dependency of nanoarrow_ipc_lib? I might have put that in the CMake due to some weirdness about it being a library built on top of nanoarrow rather than part of nanoarrow itself)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure I understand the first question - what problem are you trying to solve by making that a direct link argument? The way the dependency is declared (see wrapdb source) I believe Meson will take care of that linkage for you, alongside having the proper include and threads dependency

As far as the second question goes the way I had this previously the dependencies were not transitive, but I've since updated the nanoarrow_ipc_dep to include those:

nanoarrow_ipc_dep = declare_dependency(..., dependencies: [nanoarrow_dep, flatcc_dep])

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure I understand the first question

It seemed like the loop was handling linking each test with nanoarrow_ipc_lib and I was wondering if the loop could also handle linking the dependencies that were common to every test executable. This is probably just me misunderstanding meson and feel free to ignore if it doesn't make sense 🙂

As far as the second question goes the way I had this previously the dependencies were not transitive, but I've since updated the nanoarrow_ipc_dep to include those

Great! I mostly just want to make sure my vauge mental model of what's going on here is correct 🙂

Copy link
Contributor Author

@WillAyd WillAyd Jun 11, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think when coming from CMake it is helpful to understand that the word "dependency" means something else in Meson. In CMake, dependency refers to "something that needs to be built before this target can be". In Meson, a dependency helps you transitively use include directories / link targets. You declare this via the declare_dependency function:

base_dep = declare_dependency(
    include_directories: ['foo_dir'],
    link_with: [threads_lib],
)

So when you end up using that dependency on another target, it will transitively carry over the include / link flags for you, i.e.

child_lib = library('child', sources: ['child.cc'], dependencies: [base_dep])

expands into

child_lib = library('child',
    sources: ['child.cc'],
    include_directories: ['foo_dir'],
    link_with: [threads_lib],
)

(at least as far as I understand things)

)
test(name, exc)
endforeach
endif
endif
2 changes: 1 addition & 1 deletion src/nanoarrow/nanoarrow.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -864,8 +864,8 @@ class ViewArrayStream {
};

internal::InputRange<Next> range_;
ArrowError* error_;
ArrowErrorCode* code_;
ArrowError* error_;
ArrowError internal_error_ = {};
ArrowErrorCode internal_code_;
bool code_was_accessed_ = false;
Expand Down
11 changes: 5 additions & 6 deletions src/nanoarrow/nanoarrow_ipc_decoder_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ struct ArrowIpcDecoderPrivate {
static enum ArrowIpcEndianness ArrowIpcSystemEndianness(void) {
uint32_t check = 1;
char first_byte;
enum ArrowIpcEndianness system_endianness;
memcpy(&first_byte, &check, sizeof(char));
if (first_byte) {
return NANOARROW_IPC_ENDIANNESS_LITTLE;
Expand Down Expand Up @@ -501,8 +500,6 @@ TEST(NanoarrowIpcTest, NanoarrowIpcDecodeSimpleRecordBatchFromShared) {
data.size_bytes = sizeof(kSimpleRecordBatch);

ArrowIpcDecoderInit(&decoder);
auto decoder_private =
reinterpret_cast<struct ArrowIpcDecoderPrivate*>(decoder.private_data);

ASSERT_EQ(ArrowIpcDecoderSetSchema(&decoder, &schema, nullptr), NANOARROW_OK);
EXPECT_EQ(ArrowIpcDecoderDecodeHeader(&decoder, data, &error), NANOARROW_OK);
Expand Down Expand Up @@ -602,8 +599,10 @@ TEST(NanoarrowIpcTest, NanoarrowIpcSharedBufferThreadSafeDecode) {
std::thread threads[10];
for (int i = 0; i < 10; i++) {
threads[i] = std::thread([&arrays, i, &one_two_three_le] {
memcmp(arrays[i].children[0]->buffers[1], one_two_three_le,
sizeof(one_two_three_le));
auto result = memcmp(arrays[i].children[0]->buffers[1], one_two_three_le,
sizeof(one_two_three_le));
// discard result to silence -Wunused-value
NANOARROW_UNUSED(result);
ArrowArrayRelease(arrays + i);
});
}
Expand Down Expand Up @@ -791,7 +790,7 @@ TEST_P(ArrowTypeIdParameterizedTestFixture, NanoarrowIpcDecodeSwapEndian) {
// Make a data buffer long enough for 10 Decimal256s with a pattern
// where an endian swap isn't silently the same value (e.g., 0s)
uint8_t data_buffer[32 * 10];
for (int64_t i = 0; i < sizeof(data_buffer); i++) {
for (size_t i = 0; i < sizeof(data_buffer); i++) {
data_buffer[i] = i % 256;
}

Expand Down
2 changes: 1 addition & 1 deletion src/nanoarrow/nanoarrow_testing_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -470,7 +470,7 @@ TEST(NanoarrowTestingTest, NanoarrowTestingTestFieldMetadata) {
NANOARROW_RETURN_NOT_OK(ArrowSchemaSetMetadata(schema, "\0\0\0\0"));
return NANOARROW_OK;
},
[](ArrowArray* array) { return NANOARROW_OK; }, &WriteFieldJSON,
[](ArrowArray*) { return NANOARROW_OK; }, &WriteFieldJSON,
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not strictly related but it showed as a warning we could control with the Meson warning configuration

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense to me!

R"({"name": null, "nullable": true, "type": {"name": "null"}, "children": []})",
[](TestingJSONWriter& writer) { writer.set_include_metadata(false); });
}
Expand Down
23 changes: 23 additions & 0 deletions subprojects/flatcc.wrap
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.

[wrap-file]
directory = flatcc-0.6.1
source_url = https://github.com/dvidelabs/flatcc/archive/refs/tags/v0.6.1.tar.gz
source_filename = flatcc-0.6.1.tar.gz
source_hash = 2533c2f1061498499f15acc7e0937dcf35bc68e685d237325124ae0d6c600c2b
patch_directory = flatcc
17 changes: 17 additions & 0 deletions subprojects/google-benchmark.wrap
Original file line number Diff line number Diff line change
@@ -1,3 +1,20 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.

[wrap-file]
directory = benchmark-1.8.4
source_url = https://github.com/google/benchmark/archive/refs/tags/v1.8.4.tar.gz
Expand Down
17 changes: 17 additions & 0 deletions subprojects/gtest.wrap
Original file line number Diff line number Diff line change
@@ -1,3 +1,20 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.

[wrap-file]
directory = googletest-1.14.0
source_url = https://github.com/google/googletest/archive/refs/tags/v1.14.0.tar.gz
Expand Down
17 changes: 17 additions & 0 deletions subprojects/nlohmann_json.wrap
Original file line number Diff line number Diff line change
@@ -1,3 +1,20 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.

[wrap-file]
directory = nlohmann_json-3.11.2
lead_directory_missing = true
Expand Down
40 changes: 40 additions & 0 deletions subprojects/packagefiles/flatcc/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.

project('flatcc',
'c',
version : '0.6.1',
license : 'Apache-2.0',
)

incdir = include_directories('include')

flatcc_lib = library(
'flatcc',
sources: [
'src/runtime/builder.c',
'src/runtime/emitter.c',
'src/runtime/verifier.c',
'src/runtime/refmap.c',
],
include_directories: [incdir],
)

flatcc_dep = declare_dependency(
include_directories: [incdir],
link_with: [flatcc_lib],
)
30 changes: 30 additions & 0 deletions subprojects/zlib.wrap
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.

[wrap-file]
directory = zlib-1.3.1
source_url = http://zlib.net/fossils/zlib-1.3.1.tar.gz
source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/zlib_1.3.1-1/zlib-1.3.1.tar.gz
source_filename = zlib-1.3.1.tar.gz
source_hash = 9a93b2b7dfdac77ceba5a558a580e74667dd6fede4585b91eefb60f03b72df23
patch_filename = zlib_1.3.1-1_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/zlib_1.3.1-1/get_patch
patch_hash = e79b98eb24a75392009cec6f99ca5cdca9881ff20bfa174e8b8926d5c7a47095
wrapdb_version = 1.3.1-1

[provide]
zlib = zlib_dep