This is an automated email from the ASF dual-hosted git repository. kou pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/arrow.git
The following commit(s) were added to refs/heads/main by this push: new 556c2398cc GH-47412: [C++] Use inlineshidden visibility in Meson configuration (#47413) 556c2398cc is described below commit 556c2398cce3534b61349695a7da8e38a47a66c4 Author: William Ayd <william....@icloud.com> AuthorDate: Thu Sep 4 20:18:56 2025 -0400 GH-47412: [C++] Use inlineshidden visibility in Meson configuration (#47413) ### Rationale for this change I was under the false impression that 'hidden' visibility hid the most symbols from shared libraries. As it turns out, 'inlineshidden' performs the most symbol hiding, so we can achieve the best hygeine and smallest libraries from that option. A local release build shows the following library sizes on main: 21M src/arrow/libarrow-compute.so 16M src/arrow/libarrow.so 21M src/arrow/flight/libarrow-flight.so 2.5M src/arrow/acero/libarrow-acero.so With this PR showing a small improvement in some libraries: 21M src/arrow/libarrow-compute.so 16M src/arrow/libarrow.so 20M src/arrow/flight/libarrow-flight.so 2.4M src/arrow/acero/libarrow-acero.so ### What changes are included in this PR? Usage of 'hidden' has been replaced with 'inlineshidden'. I also added hidden symbol visibility to the compute library, where it was errantly missing before ### Are these changes tested? Yes ### Are there any user-facing changes? No * GitHub Issue: #47412 Authored-by: Will Ayd <william....@icloud.com> Signed-off-by: Sutou Kouhei <k...@clear-code.com> --- cpp/src/arrow/acero/meson.build | 2 +- cpp/src/arrow/flight/meson.build | 26 +++- cpp/src/arrow/flight/serialization_internal.h | 143 ++++++++++++--------- .../arrow/flight/transport/grpc/customize_grpc.h | 5 +- cpp/src/arrow/meson.build | 3 +- 5 files changed, 109 insertions(+), 70 deletions(-) diff --git a/cpp/src/arrow/acero/meson.build b/cpp/src/arrow/acero/meson.build index 007128d73d..93c7594dd8 100644 --- a/cpp/src/arrow/acero/meson.build +++ b/cpp/src/arrow/acero/meson.build @@ -81,7 +81,7 @@ arrow_acero_lib = library( 'arrow-acero', sources: arrow_acero_srcs, dependencies: [arrow_compute_dep, arrow_dep, threads_dep], - gnu_symbol_visibility: 'hidden', + gnu_symbol_visibility: 'inlineshidden', ) arrow_acero_dep = declare_dependency(link_with: [arrow_acero_lib]) diff --git a/cpp/src/arrow/flight/meson.build b/cpp/src/arrow/flight/meson.build index ca0289c77f..9ffe3413df 100644 --- a/cpp/src/arrow/flight/meson.build +++ b/cpp/src/arrow/flight/meson.build @@ -52,6 +52,22 @@ fs = import('fs') protoc = find_program('protoc') flight_proto_path = fs.parent(meson.project_source_root()) / 'format' + +# To ensure messages from proto files are created correctly, we need to +# pass in dllexport_decl=<...> . Unfortunately, it doesn't appear that we +# can just pass in dllexport_decl=ARROW_FLIGHT_EXPORT, as the visibility +# macro won't be easily available to the generated proto file. See also +# https://github.com/protocolbuffers/protobuf/issues/19422 +if cpp_compiler.get_id() == 'msvc' + if get_option('default_library') != 'static' + proto_visibility = 'dllexport_decl=__declspec(dllexport):' + else + proto_visibility = '' + endif +else + proto_visibility = 'dllexport_decl=__attribute__((visibility("default"))):' +endif + flight_proto_files = custom_target( 'arrow-flight-proto-files', input: [flight_proto_path / 'Flight.proto'], @@ -59,7 +75,7 @@ flight_proto_files = custom_target( command: [ protoc, '--proto_path=' + flight_proto_path, - '--cpp_out=' + meson.current_build_dir(), + '--cpp_out=@0@@1@'.format(proto_visibility, meson.current_build_dir()), '@INPUT@', ], ) @@ -117,7 +133,9 @@ arrow_flight = library( abseil_sync_dep, thread_dep, ], - cpp_args: '-DARROW_FLIGHT_EXPORTING', + cpp_shared_args: ['-DARROW_FLIGHT_EXPORTING'], + cpp_static_args: ['-DARROW_FLIGHT_STATIC'], + gnu_symbol_visibility: 'inlineshidden', ) arrow_flight_dep = declare_dependency( @@ -135,7 +153,9 @@ if needs_testing 'test_util.cc', ], dependencies: [arrow_test_dep, arrow_flight_dep, thread_dep], - gnu_symbol_visibility: 'hidden', + cpp_shared_args: ['-DARROW_FLIGHT_EXPORTING'], + cpp_static_args: ['-DARROW_FLIGHT_STATIC'], + gnu_symbol_visibility: 'inlineshidden', ) arrow_flight_test_dep = declare_dependency( diff --git a/cpp/src/arrow/flight/serialization_internal.h b/cpp/src/arrow/flight/serialization_internal.h index 827bde1674..4d07efad81 100644 --- a/cpp/src/arrow/flight/serialization_internal.h +++ b/cpp/src/arrow/flight/serialization_internal.h @@ -99,69 +99,86 @@ Status UnpackProtoAction(const Action& action, google::protobuf::Message* out); // These functions depend on protobuf types which are not exported in the Flight DLL. -Status FromProto(const google::protobuf::Timestamp& pb_timestamp, Timestamp* timestamp); -Status FromProto(const pb::ActionType& pb_type, ActionType* type); -Status FromProto(const pb::Action& pb_action, Action* action); -Status FromProto(const pb::Result& pb_result, Result* result); -Status FromProto(const pb::CancelFlightInfoResult& pb_result, - CancelFlightInfoResult* result); -Status FromProto(const pb::Criteria& pb_criteria, Criteria* criteria); -Status FromProto(const pb::Location& pb_location, Location* location); -Status FromProto(const pb::Ticket& pb_ticket, Ticket* ticket); -Status FromProto(const pb::FlightData& pb_data, FlightDescriptor* descriptor, - std::unique_ptr<ipc::Message>* message); -Status FromProto(const pb::FlightDescriptor& pb_descr, FlightDescriptor* descr); -Status FromProto(const pb::FlightEndpoint& pb_endpoint, FlightEndpoint* endpoint); -Status FromProto(const pb::RenewFlightEndpointRequest& pb_request, - RenewFlightEndpointRequest* request); -Status FromProto(const pb::FlightInfo& pb_info, FlightInfo::Data* info); -Status FromProto(const pb::FlightInfo& pb_info, std::unique_ptr<FlightInfo>* info); -Status FromProto(const pb::PollInfo& pb_info, PollInfo* info); -Status FromProto(const pb::PollInfo& pb_info, std::unique_ptr<PollInfo>* info); -Status FromProto(const pb::CancelFlightInfoRequest& pb_request, - CancelFlightInfoRequest* request); -Status FromProto(const pb::SchemaResult& pb_result, SchemaResult* result); -Status FromProto(const pb::BasicAuth& pb_basic_auth, BasicAuth* info); -Status FromProto(const pb::SetSessionOptionsRequest& pb_request, - SetSessionOptionsRequest* request); -Status FromProto(const pb::SetSessionOptionsResult& pb_result, - SetSessionOptionsResult* result); -Status FromProto(const pb::GetSessionOptionsRequest& pb_request, - GetSessionOptionsRequest* request); -Status FromProto(const pb::GetSessionOptionsResult& pb_result, - GetSessionOptionsResult* result); -Status FromProto(const pb::CloseSessionRequest& pb_request, CloseSessionRequest* request); -Status FromProto(const pb::CloseSessionResult& pb_result, CloseSessionResult* result); - -Status ToProto(const Timestamp& timestamp, google::protobuf::Timestamp* pb_timestamp); -Status ToProto(const FlightDescriptor& descr, pb::FlightDescriptor* pb_descr); -Status ToProto(const FlightEndpoint& endpoint, pb::FlightEndpoint* pb_endpoint); -Status ToProto(const RenewFlightEndpointRequest& request, - pb::RenewFlightEndpointRequest* pb_request); -Status ToProto(const FlightInfo& info, pb::FlightInfo* pb_info); -Status ToProto(const PollInfo& info, pb::PollInfo* pb_info); -Status ToProto(const CancelFlightInfoRequest& request, - pb::CancelFlightInfoRequest* pb_request); -Status ToProto(const ActionType& type, pb::ActionType* pb_type); -Status ToProto(const Action& action, pb::Action* pb_action); -Status ToProto(const Result& result, pb::Result* pb_result); -Status ToProto(const CancelFlightInfoResult& result, - pb::CancelFlightInfoResult* pb_result); -Status ToProto(const Criteria& criteria, pb::Criteria* pb_criteria); -Status ToProto(const Location& location, pb::Location* pb_location); -Status ToProto(const SchemaResult& result, pb::SchemaResult* pb_result); -Status ToProto(const Ticket& ticket, pb::Ticket* pb_ticket); -Status ToProto(const BasicAuth& basic_auth, pb::BasicAuth* pb_basic_auth); -Status ToProto(const SetSessionOptionsRequest& request, - pb::SetSessionOptionsRequest* pb_request); -Status ToProto(const SetSessionOptionsResult& result, - pb::SetSessionOptionsResult* pb_result); -Status ToProto(const GetSessionOptionsRequest& request, - pb::GetSessionOptionsRequest* pb_request); -Status ToProto(const GetSessionOptionsResult& result, - pb::GetSessionOptionsResult* pb_result); -Status ToProto(const CloseSessionRequest& request, pb::CloseSessionRequest* pb_request); -Status ToProto(const CloseSessionResult& result, pb::CloseSessionResult* pb_result); +ARROW_FLIGHT_EXPORT Status FromProto(const google::protobuf::Timestamp& pb_timestamp, + Timestamp* timestamp); +ARROW_FLIGHT_EXPORT Status FromProto(const pb::ActionType& pb_type, ActionType* type); +ARROW_FLIGHT_EXPORT Status FromProto(const pb::Action& pb_action, Action* action); +ARROW_FLIGHT_EXPORT Status FromProto(const pb::Result& pb_result, Result* result); +ARROW_FLIGHT_EXPORT Status FromProto(const pb::CancelFlightInfoResult& pb_result, + CancelFlightInfoResult* result); +ARROW_FLIGHT_EXPORT Status FromProto(const pb::Criteria& pb_criteria, Criteria* criteria); +ARROW_FLIGHT_EXPORT Status FromProto(const pb::Location& pb_location, Location* location); +ARROW_FLIGHT_EXPORT Status FromProto(const pb::Ticket& pb_ticket, Ticket* ticket); +ARROW_FLIGHT_EXPORT Status FromProto(const pb::FlightData& pb_data, + FlightDescriptor* descriptor, + std::unique_ptr<ipc::Message>* message); +ARROW_FLIGHT_EXPORT Status FromProto(const pb::FlightDescriptor& pb_descr, + FlightDescriptor* descr); +ARROW_FLIGHT_EXPORT Status FromProto(const pb::FlightEndpoint& pb_endpoint, + FlightEndpoint* endpoint); +ARROW_FLIGHT_EXPORT Status FromProto(const pb::RenewFlightEndpointRequest& pb_request, + RenewFlightEndpointRequest* request); +ARROW_FLIGHT_EXPORT Status FromProto(const pb::FlightInfo& pb_info, + FlightInfo::Data* info); +ARROW_FLIGHT_EXPORT Status FromProto(const pb::FlightInfo& pb_info, + std::unique_ptr<FlightInfo>* info); +ARROW_FLIGHT_EXPORT Status FromProto(const pb::PollInfo& pb_info, PollInfo* info); +ARROW_FLIGHT_EXPORT Status FromProto(const pb::PollInfo& pb_info, + std::unique_ptr<PollInfo>* info); +ARROW_FLIGHT_EXPORT Status FromProto(const pb::CancelFlightInfoRequest& pb_request, + CancelFlightInfoRequest* request); +ARROW_FLIGHT_EXPORT Status FromProto(const pb::SchemaResult& pb_result, + SchemaResult* result); +ARROW_FLIGHT_EXPORT Status FromProto(const pb::BasicAuth& pb_basic_auth, BasicAuth* info); +ARROW_FLIGHT_EXPORT Status FromProto(const pb::SetSessionOptionsRequest& pb_request, + SetSessionOptionsRequest* request); +ARROW_FLIGHT_EXPORT Status FromProto(const pb::SetSessionOptionsResult& pb_result, + SetSessionOptionsResult* result); +ARROW_FLIGHT_EXPORT Status FromProto(const pb::GetSessionOptionsRequest& pb_request, + GetSessionOptionsRequest* request); +ARROW_FLIGHT_EXPORT Status FromProto(const pb::GetSessionOptionsResult& pb_result, + GetSessionOptionsResult* result); +ARROW_FLIGHT_EXPORT Status FromProto(const pb::CloseSessionRequest& pb_request, + CloseSessionRequest* request); +ARROW_FLIGHT_EXPORT Status FromProto(const pb::CloseSessionResult& pb_result, + CloseSessionResult* result); + +ARROW_FLIGHT_EXPORT Status ToProto(const Timestamp& timestamp, + google::protobuf::Timestamp* pb_timestamp); +ARROW_FLIGHT_EXPORT Status ToProto(const FlightDescriptor& descr, + pb::FlightDescriptor* pb_descr); +ARROW_FLIGHT_EXPORT Status ToProto(const FlightEndpoint& endpoint, + pb::FlightEndpoint* pb_endpoint); +ARROW_FLIGHT_EXPORT Status ToProto(const RenewFlightEndpointRequest& request, + pb::RenewFlightEndpointRequest* pb_request); +ARROW_FLIGHT_EXPORT Status ToProto(const FlightInfo& info, pb::FlightInfo* pb_info); +ARROW_FLIGHT_EXPORT Status ToProto(const PollInfo& info, pb::PollInfo* pb_info); +ARROW_FLIGHT_EXPORT Status ToProto(const CancelFlightInfoRequest& request, + pb::CancelFlightInfoRequest* pb_request); +ARROW_FLIGHT_EXPORT Status ToProto(const ActionType& type, pb::ActionType* pb_type); +ARROW_FLIGHT_EXPORT Status ToProto(const Action& action, pb::Action* pb_action); +ARROW_FLIGHT_EXPORT Status ToProto(const Result& result, pb::Result* pb_result); +ARROW_FLIGHT_EXPORT Status ToProto(const CancelFlightInfoResult& result, + pb::CancelFlightInfoResult* pb_result); +ARROW_FLIGHT_EXPORT Status ToProto(const Criteria& criteria, pb::Criteria* pb_criteria); +ARROW_FLIGHT_EXPORT Status ToProto(const Location& location, pb::Location* pb_location); +ARROW_FLIGHT_EXPORT Status ToProto(const SchemaResult& result, + pb::SchemaResult* pb_result); +ARROW_FLIGHT_EXPORT Status ToProto(const Ticket& ticket, pb::Ticket* pb_ticket); +ARROW_FLIGHT_EXPORT Status ToProto(const BasicAuth& basic_auth, + pb::BasicAuth* pb_basic_auth); +ARROW_FLIGHT_EXPORT Status ToProto(const SetSessionOptionsRequest& request, + pb::SetSessionOptionsRequest* pb_request); +ARROW_FLIGHT_EXPORT Status ToProto(const SetSessionOptionsResult& result, + pb::SetSessionOptionsResult* pb_result); +ARROW_FLIGHT_EXPORT Status ToProto(const GetSessionOptionsRequest& request, + pb::GetSessionOptionsRequest* pb_request); +ARROW_FLIGHT_EXPORT Status ToProto(const GetSessionOptionsResult& result, + pb::GetSessionOptionsResult* pb_result); +ARROW_FLIGHT_EXPORT Status ToProto(const CloseSessionRequest& request, + pb::CloseSessionRequest* pb_request); +ARROW_FLIGHT_EXPORT Status ToProto(const CloseSessionResult& result, + pb::CloseSessionResult* pb_result); Status ToPayload(const FlightDescriptor& descr, std::shared_ptr<Buffer>* out); diff --git a/cpp/src/arrow/flight/transport/grpc/customize_grpc.h b/cpp/src/arrow/flight/transport/grpc/customize_grpc.h index b668022087..153aa5ae1d 100644 --- a/cpp/src/arrow/flight/transport/grpc/customize_grpc.h +++ b/cpp/src/arrow/flight/transport/grpc/customize_grpc.h @@ -22,6 +22,7 @@ #include "arrow/flight/platform.h" #include "arrow/flight/type_fwd.h" +#include "arrow/flight/visibility.h" #include "arrow/util/config.h" // Silence protobuf warnings @@ -63,8 +64,8 @@ namespace grpc { // Read internal::FlightData from grpc::ByteBuffer containing FlightData // protobuf without copying -::grpc::Status FlightDataDeserialize(::grpc::ByteBuffer* buffer, - arrow::flight::internal::FlightData* out); +ARROW_FLIGHT_EXPORT ::grpc::Status FlightDataDeserialize( + ::grpc::ByteBuffer* buffer, arrow::flight::internal::FlightData* out); } // namespace grpc } // namespace transport } // namespace flight diff --git a/cpp/src/arrow/meson.build b/cpp/src/arrow/meson.build index c176c24d1b..fbd9cc8551 100644 --- a/cpp/src/arrow/meson.build +++ b/cpp/src/arrow/meson.build @@ -426,7 +426,7 @@ arrow_lib = library( include_directories: arrow_includes, dependencies: arrow_deps, install: true, - gnu_symbol_visibility: 'hidden', + gnu_symbol_visibility: 'inlineshidden', cpp_shared_args: ['-DARROW_EXPORTING'], ) @@ -489,6 +489,7 @@ if needs_compute sources: arrow_compute_lib_sources, dependencies: arrow_dep, install: true, + gnu_symbol_visibility: 'inlineshidden', cpp_shared_args: ['-DARROW_COMPUTE_EXPORTING'], ) arrow_compute_dep = declare_dependency(