Skip to content

Commit 34ebe24

Browse files
committed
Extract ODBC installer
Need to add `component` to other parts to be able to select the ODBC components Co-Authored-By: alinalibq <[email protected]>
1 parent 5eaf553 commit 34ebe24

File tree

14 files changed

+309
-15
lines changed

14 files changed

+309
-15
lines changed

.github/workflows/cpp.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@ jobs:
311311
ARROW_FLIGHT: ON
312312
ARROW_FLIGHT_SQL: ON
313313
ARROW_FLIGHT_SQL_ODBC: ON
314+
ARROW_FLIGHT_SQL_ODBC_INSTALLER: ON
314315
ARROW_GANDIVA: ON
315316
ARROW_GCS: ON
316317
ARROW_HDFS: OFF

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,6 @@ java/.mvn/.develocity/
107107
# rat
108108
filtered_rat.txt
109109
rat.txt
110+
111+
# rc
112+
*.rc

ci/scripts/cpp_build.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ else
214214
-DARROW_FLIGHT=${ARROW_FLIGHT:-OFF} \
215215
-DARROW_FLIGHT_SQL=${ARROW_FLIGHT_SQL:-OFF} \
216216
-DARROW_FLIGHT_SQL_ODBC=${ARROW_FLIGHT_SQL_ODBC:-OFF} \
217+
-DARROW_FLIGHT_SQL_ODBC_INSTALLER=${ARROW_FLIGHT_SQL_ODBC_INSTALLER:-OFF} \
217218
-DARROW_FUZZING=${ARROW_FUZZING:-OFF} \
218219
-DARROW_GANDIVA_PC_CXX_FLAGS=${ARROW_GANDIVA_PC_CXX_FLAGS:-} \
219220
-DARROW_GANDIVA=${ARROW_GANDIVA:-OFF} \

cpp/CMakeLists.txt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -720,9 +720,13 @@ endif()
720720

721721
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../LICENSE.txt
722722
${CMAKE_CURRENT_SOURCE_DIR}/../NOTICE.txt
723-
${CMAKE_CURRENT_SOURCE_DIR}/README.md DESTINATION "${ARROW_DOC_DIR}")
723+
${CMAKE_CURRENT_SOURCE_DIR}/README.md
724+
DESTINATION "${ARROW_DOC_DIR}"
725+
COMPONENT arrow_doc)
724726

725-
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gdb_arrow.py DESTINATION "${ARROW_GDB_DIR}")
727+
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gdb_arrow.py
728+
DESTINATION "${ARROW_GDB_DIR}"
729+
COMPONENT arrow_gdb)
726730

727731
#
728732
# Validate and print out Arrow configuration options

cpp/CMakePresets.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@
179179
"ARROW_BUILD_EXAMPLES": "ON",
180180
"ARROW_BUILD_UTILITIES": "ON",
181181
"ARROW_FLIGHT_SQL_ODBC": "ON",
182+
"ARROW_FLIGHT_SQL_ODBC_INSTALLER": "ON",
182183
"ARROW_TENSORFLOW": "ON",
183184
"PARQUET_BUILD_EXAMPLES": "ON",
184185
"PARQUET_BUILD_EXECUTABLES": "ON"

cpp/cmake_modules/BuildUtils.cmake

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,10 +178,12 @@ function(arrow_install_cmake_package PACKAGE_NAME EXPORT_NAME)
178178
write_basic_package_version_file("${BUILT_CONFIG_VERSION_CMAKE}"
179179
COMPATIBILITY SameMajorVersion)
180180
install(FILES "${BUILT_CONFIG_CMAKE}" "${BUILT_CONFIG_VERSION_CMAKE}"
181-
DESTINATION "${ARROW_CMAKE_DIR}/${PACKAGE_NAME}")
181+
DESTINATION "${ARROW_CMAKE_DIR}/${PACKAGE_NAME}"
182+
COMPONENT config_cmake_file)
182183
set(TARGETS_CMAKE "${PACKAGE_NAME}Targets.cmake")
183184
install(EXPORT ${EXPORT_NAME}
184185
DESTINATION "${ARROW_CMAKE_DIR}/${PACKAGE_NAME}"
186+
COMPONENT config_cmake_export
185187
NAMESPACE "${PACKAGE_NAME}::"
186188
FILE "${TARGETS_CMAKE}")
187189
endfunction()
@@ -403,8 +405,11 @@ function(ADD_ARROW_LIB LIB_NAME)
403405
install(TARGETS ${LIB_NAME}_shared ${INSTALL_IS_OPTIONAL}
404406
EXPORT ${LIB_NAME}_targets
405407
ARCHIVE DESTINATION ${INSTALL_ARCHIVE_DIR}
408+
COMPONENT ${LIB_NAME}_shared_archive
406409
LIBRARY DESTINATION ${INSTALL_LIBRARY_DIR}
410+
COMPONENT ${LIB_NAME}_shared_library
407411
RUNTIME DESTINATION ${INSTALL_RUNTIME_DIR}
412+
COMPONENT ${LIB_NAME}_shared_runtime
408413
INCLUDES
409414
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
410415
endif()
@@ -471,8 +476,11 @@ function(ADD_ARROW_LIB LIB_NAME)
471476
install(TARGETS ${LIB_NAME}_static ${INSTALL_IS_OPTIONAL}
472477
EXPORT ${LIB_NAME}_targets
473478
ARCHIVE DESTINATION ${INSTALL_ARCHIVE_DIR}
479+
COMPONENT ${LIB_NAME}_static_library
474480
LIBRARY DESTINATION ${INSTALL_LIBRARY_DIR}
481+
COMPONENT ${LIB_NAME}_static_library
475482
RUNTIME DESTINATION ${INSTALL_RUNTIME_DIR}
483+
COMPONENT ${LIB_NAME}_static_library
476484
INCLUDES
477485
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
478486
endif()
@@ -934,7 +942,9 @@ function(ARROW_INSTALL_ALL_HEADERS PATH)
934942
endif()
935943
list(APPEND PUBLIC_HEADERS ${HEADER})
936944
endforeach()
937-
install(FILES ${PUBLIC_HEADERS} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${PATH}")
945+
install(FILES ${PUBLIC_HEADERS}
946+
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${PATH}"
947+
COMPONENT ${HEADER}_header)
938948
endfunction()
939949

940950
function(ARROW_ADD_PKG_CONFIG MODULE)
@@ -944,7 +954,8 @@ function(ARROW_ADD_PKG_CONFIG MODULE)
944954
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/${MODULE}.pc"
945955
INPUT "${CMAKE_CURRENT_BINARY_DIR}/${MODULE}.pc.generate.in")
946956
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/${MODULE}.pc"
947-
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig/")
957+
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig/"
958+
COMPONENT ${MODULE}_pkg_config)
948959
endfunction()
949960

950961
# Implementations of lisp "car" and "cdr" functions

cpp/cmake_modules/ThirdpartyToolchain.cmake

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,8 @@ function(provide_cmake_module MODULE_NAME ARROW_CMAKE_PACKAGE_NAME)
236236
message(STATUS "Providing CMake module for ${MODULE_NAME} as part of ${ARROW_CMAKE_PACKAGE_NAME} CMake package"
237237
)
238238
install(FILES "${module}"
239-
DESTINATION "${ARROW_CMAKE_DIR}/${ARROW_CMAKE_PACKAGE_NAME}")
239+
DESTINATION "${ARROW_CMAKE_DIR}/${ARROW_CMAKE_PACKAGE_NAME}"
240+
COMPONENT ${MODULE_NAME}_module)
240241
endif()
241242
endfunction()
242243

@@ -2397,20 +2398,22 @@ function(build_gtest)
23972398
endforeach()
23982399
install(DIRECTORY "${googletest_SOURCE_DIR}/googlemock/include/"
23992400
"${googletest_SOURCE_DIR}/googletest/include/"
2400-
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
2401+
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
2402+
COMPONENT gtest_dir)
24012403
add_library(arrow::GTest::gtest_headers INTERFACE IMPORTED)
24022404
target_include_directories(arrow::GTest::gtest_headers
24032405
INTERFACE "${googletest_SOURCE_DIR}/googlemock/include/"
24042406
"${googletest_SOURCE_DIR}/googletest/include/")
24052407
install(TARGETS gmock gmock_main gtest gtest_main
24062408
EXPORT arrow_testing_targets
2407-
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
2408-
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
2409-
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}")
2409+
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT gtest_runtime
2410+
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT gtest_archive
2411+
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT gtest_library)
24102412
if(MSVC)
24112413
install(FILES $<TARGET_PDB_FILE:gmock> $<TARGET_PDB_FILE:gmock_main>
24122414
$<TARGET_PDB_FILE:gtest> $<TARGET_PDB_FILE:gtest_main>
24132415
DESTINATION "${CMAKE_INSTALL_BINDIR}"
2416+
COMPONENT gtest_pdb
24142417
OPTIONAL)
24152418
endif()
24162419
add_library(arrow::GTest::gmock ALIAS gmock)

cpp/src/arrow/CMakeLists.txt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,8 @@ string(REPLACE "${CMAKE_BINARY_DIR}" "<CMAKE_BINARY_DIR>" REDACTED_CXX_FLAGS
349349
configure_file("util/config.h.cmake" "util/config.h" ESCAPE_QUOTES)
350350
configure_file("util/config_internal.h.cmake" "util/config_internal.h" ESCAPE_QUOTES)
351351
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/util/config.h"
352-
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/arrow/util")
352+
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/arrow/util"
353+
COMPONENT arrow_config)
353354

354355
set(ARROW_SRCS
355356
builder.cc
@@ -1043,7 +1044,8 @@ if(ARROW_BUILD_BUNDLED_DEPENDENCIES)
10431044
get_target_property(arrow_bundled_dependencies_path arrow_bundled_dependencies
10441045
IMPORTED_LOCATION)
10451046
install(FILES ${arrow_bundled_dependencies_path} ${INSTALL_IS_OPTIONAL}
1046-
DESTINATION ${CMAKE_INSTALL_LIBDIR})
1047+
DESTINATION ${CMAKE_INSTALL_LIBDIR}
1048+
COMPONENT arrow_bundled_dependencies)
10471049
string(PREPEND ARROW_PC_LIBS_PRIVATE " -larrow_bundled_dependencies")
10481050
list(INSERT ARROW_STATIC_INSTALL_INTERFACE_LIBS 0 "Arrow::arrow_bundled_dependencies")
10491051
endif()
@@ -1160,6 +1162,7 @@ if(ARROW_BUILD_SHARED AND NOT WIN32)
11601162
if(ARROW_GDB_AUTO_LOAD_LIBARROW_GDB_INSTALL)
11611163
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libarrow_gdb.py"
11621164
DESTINATION "${ARROW_GDB_AUTO_LOAD_LIBARROW_GDB_DIR}"
1165+
COMPONENT arrow_gdb
11631166
RENAME "$<TARGET_FILE_NAME:arrow_shared>-gdb.py")
11641167
endif()
11651168
endif()
@@ -1223,11 +1226,13 @@ arrow_install_all_headers("arrow")
12231226

12241227
config_summary_cmake_setters("${CMAKE_CURRENT_BINARY_DIR}/ArrowOptions.cmake")
12251228
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ArrowOptions.cmake
1226-
DESTINATION "${ARROW_CMAKE_DIR}/Arrow")
1229+
DESTINATION "${ARROW_CMAKE_DIR}/Arrow"
1230+
COMPONENT arrow_options_cmake)
12271231

12281232
# For backward compatibility for find_package(arrow)
12291233
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/arrow-config.cmake
1230-
DESTINATION "${ARROW_CMAKE_DIR}/Arrow")
1234+
DESTINATION "${ARROW_CMAKE_DIR}/Arrow"
1235+
COMPONENT arrow_config_cmake)
12311236

12321237
#
12331238
# Unit tests

cpp/src/arrow/flight/sql/odbc/CMakeLists.txt

Lines changed: 91 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,28 @@ add_subdirectory(tests)
3838

3939
arrow_install_all_headers("arrow/flight/sql/odbc")
4040

41+
# ODBC Release information
42+
set(ODBC_PACKAGE_VERSION_MAJOR "1")
43+
set(ODBC_PACKAGE_VERSION_MINOR "0")
44+
set(ODBC_PACKAGE_VERSION_PATCH "0")
45+
set(ODBC_PACKAGE_NAME "Apache Arrow Flight SQL ODBC")
46+
set(ODBC_PACKAGE_VENDOR "Apache Arrow")
47+
4148
set(ARROW_FLIGHT_SQL_ODBC_SRCS entry_points.cc odbc_api.cc)
4249

4350
if(WIN32)
44-
list(APPEND ARROW_FLIGHT_SQL_ODBC_SRCS odbc.def)
51+
set(VER_FILEVERSION
52+
"${ODBC_PACKAGE_VERSION_MAJOR},${ODBC_PACKAGE_VERSION_MINOR},${ODBC_PACKAGE_VERSION_PATCH},0"
53+
)
54+
set(VER_FILEVERSION_STR
55+
${ODBC_PACKAGE_VERSION_MAJOR}.${ODBC_PACKAGE_VERSION_MINOR}.${ODBC_PACKAGE_VERSION_PATCH}
56+
)
57+
set(VER_COMPANYNAME_STR ${ODBC_PACKAGE_VENDOR})
58+
set(VER_PRODUCTNAME_STR ${ODBC_PACKAGE_NAME})
59+
60+
configure_file("install/versioninfo.rc.in" "install/versioninfo.rc" @ONLY)
61+
62+
list(APPEND ARROW_FLIGHT_SQL_ODBC_SRCS odbc.def install/versioninfo.rc)
4563
endif()
4664

4765
add_arrow_lib(arrow_flight_sql_odbc
@@ -75,3 +93,75 @@ add_arrow_lib(arrow_flight_sql_odbc
7593
foreach(LIB_TARGET ${ARROW_FLIGHT_SQL_ODBC_LIBRARIES})
7694
target_compile_definitions(${LIB_TARGET} PRIVATE ARROW_FLIGHT_SQL_ODBC_EXPORTING)
7795
endforeach()
96+
97+
# Construct ODBC Windows installer. Only Release installer is supported
98+
if(ARROW_FLIGHT_SQL_ODBC_INSTALLER)
99+
100+
include(InstallRequiredSystemLibraries)
101+
102+
set(CPACK_RESOURCE_FILE_LICENSE
103+
"${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../LICENSE.txt")
104+
# Tentative version 1.0.0
105+
set(CPACK_PACKAGE_VERSION_MAJOR ${ODBC_PACKAGE_VERSION_MAJOR})
106+
set(CPACK_PACKAGE_VERSION_MINOR ${ODBC_PACKAGE_VERSION_MINOR})
107+
set(CPACK_PACKAGE_VERSION_PATCH ${ODBC_PACKAGE_VERSION_PATCH})
108+
109+
set(CPACK_PACKAGE_NAME ${ODBC_PACKAGE_NAME})
110+
set(CPACK_PACKAGE_VENDOR ${ODBC_PACKAGE_VENDOR})
111+
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Apache Arrow Flight SQL ODBC Driver")
112+
set(CPACK_PACKAGE_CONTACT "#GH-47787 TODO arrow maintainers")
113+
114+
# GH-47876 TODO: set up `flight_sql_odbc_lib` component for macOS Installer
115+
# GH-47877 TODO: set up `flight_sql_odbc_lib` component for Linux Installer
116+
if(WIN32)
117+
install(DIRECTORY "${BUILD_OUTPUT_ROOT_DIRECTORY}${CMAKE_BUILD_TYPE}/"
118+
DESTINATION bin
119+
COMPONENT flight_sql_odbc_lib
120+
FILES_MATCHING
121+
# Use regex for dll name patterns with versions
122+
PATTERN "abseil_dll.dll"
123+
PATTERN "arrow.dll"
124+
PATTERN "arrow_compute.dll"
125+
PATTERN "arrow_flight.dll"
126+
PATTERN "arrow_flight_sql.dll"
127+
PATTERN "arrow_flight_sql_odbc.dll"
128+
PATTERN "boost_locale*.dll"
129+
PATTERN "cares.dll"
130+
PATTERN "libcrypto*.dll"
131+
PATTERN "libprotobuf.dll"
132+
PATTERN "libssl*.dll"
133+
PATTERN "re2.dll"
134+
PATTERN "utf8proc.dll"
135+
PATTERN "zlib1.dll")
136+
137+
set(CPACK_WIX_EXTRA_SOURCES
138+
"${CMAKE_CURRENT_SOURCE_DIR}/install/arrow-flight-sql-odbc.wxs")
139+
set(CPACK_WIX_PATCH_FILE
140+
"${CMAKE_CURRENT_SOURCE_DIR}/install/arrow-flight-sql-odbc-patch.xml")
141+
142+
set(CPACK_WIX_UI_BANNER "${CMAKE_CURRENT_SOURCE_DIR}/install/arrow-wix-banner.bmp")
143+
endif()
144+
145+
get_cmake_property(CPACK_COMPONENTS_ALL COMPONENTS)
146+
set(CPACK_COMPONENTS_ALL Unspecified)
147+
list(APPEND CPACK_COMPONENTS_ALL "flight_sql_odbc_lib")
148+
149+
if(WIN32)
150+
# WiX msi installer on Windows
151+
# CPack is compatible with WiX V.5 and V.6
152+
set(CPACK_GENERATOR "WIX")
153+
set(CPACK_WIX_VERSION 4)
154+
155+
# Upgrade GUID is required to be unchanged for ODBC installer to upgrade
156+
set(CPACK_WIX_UPGRADE_GUID "DBF27A18-F8BF-423F-9E3A-957414D52C4B")
157+
endif()
158+
# GH-47876 TODO: create macOS Installer using cpack
159+
# GH-47877 TODO: create Linux Installer using cpack
160+
161+
# Load CPack after all CPACK* variables are set
162+
include(CPack)
163+
cpack_add_component(flight_sql_odbc_lib
164+
DISPLAY_NAME "ODBC library"
165+
DESCRIPTION "ODBC library bin, required to install"
166+
REQUIRED)
167+
endif()
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<!---
2+
Licensed to the Apache Software Foundation (ASF) under one
3+
or more contributor license agreements. See the NOTICE file
4+
distributed with this work for additional information
5+
regarding copyright ownership. The ASF licenses this file
6+
to you under the Apache License, Version 2.0 (the
7+
"License"); you may not use this file except in compliance
8+
with the License. You may obtain a copy of the License at
9+
10+
http://www.apache.org/licenses/LICENSE-2.0
11+
12+
Unless required by applicable law or agreed to in writing,
13+
software distributed under the License is distributed on an
14+
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
KIND, either express or implied. See the License for the
16+
specific language governing permissions and limitations
17+
under the License.
18+
-->
19+
20+
## Steps to Register the 64-bit Apache Arrow ODBC driver on Windows
21+
22+
After the build succeeds, the ODBC DLL will be located in
23+
`build\debug\Debug` for a debug build and `build\release\Release` for a release build.
24+
25+
1. Open Power Shell as administrator.
26+
27+
2. Register your ODBC DLL:
28+
Need to replace <path\to\repo> with actual path to repository in the commands.
29+
30+
i. `cd to repo.`
31+
ii. `cd <path\to\repo>`
32+
iii. Run script to register your ODBC DLL as Apache Arrow Flight SQL ODBC Driver
33+
`.\cpp\src\arrow\flight\sql\odbc\install\install_odbc.cmd <path\to\repo>\cpp\build\< release | debug >\< Release | Debug>\arrow_flight_sql_odbc.dll`
34+
Example command for reference:
35+
`.\cpp\src\arrow\flight\sql\odbc\install\install_odbc.cmd C:\path\to\arrow\cpp\build\release\Release\arrow_flight_sql_odbc.dll`
36+
37+
If the registration is successful, then Apache Arrow Flight SQL ODBC Driver
38+
should show as an available ODBC driver in the x64 ODBC Driver Manager.
39+
40+
## Steps to Generate Windows Installer
41+
1. Build with `ARROW_FLIGHT_SQL_ODBC=ON` and `ARROW_FLIGHT_SQL_ODBC_INSTALLER=ON`.
42+
2. `cd` to `build` folder.
43+
3. Run `cpack`.
44+
45+
If the generation is successful, you will find `Apache Arrow Flight SQL ODBC-<version>-win64.msi` generated under the `build` folder.
46+
47+
48+
## Steps to Enable Logging
49+
Arrow Flight SQL ODBC driver uses Arrow's internal logging framework. By default, the log messages are printed to the terminal.
50+
1. Set environment variable `ARROW_ODBC_LOG_LEVEL` to any of the following valid values to enable logging. If `ARROW_ODBC_LOG_LEVEL` is set to a non-empty string that does not match any of the following values, `DEBUG` level is used by default.
51+
52+
The characters are case-insensitive.
53+
- TRACE
54+
- DEBUG
55+
- INFO
56+
- WARNING
57+
- ERROR
58+
- FATAL
59+
60+
The Windows ODBC driver currently does not support writing log files. `ARROW_USE_GLOG` is required to write log files, and `ARROW_USE_GLOG` is disabled on Windows platform since plasma using `glog` is not fully tested on windows.
61+
62+
Note: GH-47670 running more than 1 tests with logging enabled is not fully supported.

0 commit comments

Comments
 (0)