This is an automated email from the ASF dual-hosted git repository.

lidavidm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-adbc.git


The following commit(s) were added to refs/heads/main by this push:
     new cf3b5c0e build(python): add CMake build target for Python (#1257)
cf3b5c0e is described below

commit cf3b5c0ec6279d2c3f8d48328cfe6dd92e250116
Author: William Ayd <[email protected]>
AuthorDate: Wed Dec 6 10:06:30 2023 -0800

    build(python): add CMake build target for Python (#1257)
---
 c/CMakeLists.txt                        | 48 +++++++++++++++++++++
 c/cmake_modules/GoUtils.cmake           |  2 +-
 ci/scripts/python_build.ps1             | 76 ++++-----------------------------
 ci/scripts/python_build.sh              | 55 +++++-------------------
 python/adbc_driver_flightsql/README.md  | 12 ++++++
 python/adbc_driver_manager/README.md    | 11 +++++
 python/adbc_driver_postgresql/README.md | 11 +++++
 python/adbc_driver_snowflake/README.md  | 11 +++++
 python/adbc_driver_sqlite/README.md     | 11 +++++
 9 files changed, 123 insertions(+), 114 deletions(-)

diff --git a/c/CMakeLists.txt b/c/CMakeLists.txt
index 9b1ec5ba..dac330b9 100644
--- a/c/CMakeLists.txt
+++ b/c/CMakeLists.txt
@@ -67,5 +67,53 @@ if(ADBC_INTEGRATION_DUCKDB)
   add_subdirectory(integration/duckdb)
 endif()
 
+if(ADBC_BUILD_PYTHON)
+  find_package(Python3 REQUIRED COMPONENTS Interpreter Development)
+
+  if(NOT ADBC_BUILD_SHARED)
+    message(FATAL_ERROR "Building Python requires ADBC_BUILD_SHARED=ON")
+  endif()
+
+  # NB: the Python packages require the driver manager to be installed,
+  # but you don't technically need -DADBC_DRIVER_MANAGER=ON when installing
+  # other Python packages. To be safe then, we always install the driver
+  # manager package, regardless of the value of -DABC_DRIVER_MANAGER
+  # --config-settings eidtable_mode=compat required due to
+  # https://github.com/python/mypy/issues/13392
+  add_custom_target(python
+                    COMMAND ${Python3_EXECUTABLE} -m pip install --no-deps -e
+                            "${REPOSITORY_ROOT}/python/adbc_driver_manager"
+                            --config-settings editable_mode=compat)
+
+  macro(adbc_install_python_package TARGET)
+    string(TOUPPER ${TARGET} ${TARGET}_LIB_upper)
+    add_custom_command(TARGET python
+                       POST_BUILD
+                       COMMAND ${CMAKE_COMMAND} -E env 
"ADBC_${${TARGET}_LIB_upper}_\
+LIBRARY=$<TARGET_FILE:adbc_driver_${TARGET}_shared>" ${Python3_EXECUTABLE} -m 
pip install
+                               --no-deps -e
+                               
"${REPOSITORY_ROOT}/python/adbc_driver_${TARGET}"
+                       COMMENT "pip installing the adbc_driver_${TARGET} 
library..."
+                               DEPENDS 
$<TARGET_FILE:adbc_driver_${TARGET}_shared>
+                       WORKING_DIRECTORY ${REPOSITORY_ROOT})
+  endmacro()
+
+  if(ADBC_DRIVER_POSTGRESQL)
+    adbc_install_python_package(postgresql)
+  endif()
+
+  if(ADBC_DRIVER_SQLITE)
+    adbc_install_python_package(sqlite)
+  endif()
+
+  if(ADBC_DRIVER_FLIGHTSQL)
+    adbc_install_python_package(flightsql)
+  endif()
+
+  if(ADBC_DRIVER_SNOWFLAKE)
+    adbc_install_python_package(snowflake)
+  endif()
+endif()
+
 validate_config()
 config_summary_message()
diff --git a/c/cmake_modules/GoUtils.cmake b/c/cmake_modules/GoUtils.cmake
index aac6f5ac..085d46fe 100644
--- a/c/cmake_modules/GoUtils.cmake
+++ b/c/cmake_modules/GoUtils.cmake
@@ -153,7 +153,7 @@ function(add_go_lib GO_MOD_DIR GO_LIBNAME)
     add_custom_target(${GO_LIBNAME}_target ALL
                       DEPENDS "${LIBOUT_SHARED}.${ADBC_FULL_SO_VERSION}"
                               "${LIBOUT_SHARED}.${ADBC_SO_VERSION}" 
"${LIBOUT_SHARED}")
-    add_library(${GO_LIBNAME}_shared SHARED IMPORTED)
+    add_library(${GO_LIBNAME}_shared SHARED IMPORTED GLOBAL)
     set_target_properties(${GO_LIBNAME}_shared
                           PROPERTIES IMPORTED_LOCATION
                                      "${LIBOUT_SHARED}.${ADBC_FULL_SO_VERSION}"
diff --git a/ci/scripts/python_build.ps1 b/ci/scripts/python_build.ps1
index d1a5bffa..14deea33 100755
--- a/ci/scripts/python_build.ps1
+++ b/ci/scripts/python_build.ps1
@@ -20,7 +20,6 @@ $ErrorActionPreference = "Stop"
 
 $SourceDir = $Args[0]
 $BuildDir = $Args[1]
-$InstallDir = if ($Args[2] -ne $null) { $Args[2] } else { Join-Path $BuildDir 
"local/" }
 
 $BuildAll = $env:BUILD_ALL -ne "0"
 $BuildDriverFlightSql = ($BuildAll -and (-not ($env:BUILD_DRIVER_FLIGHTSQL -eq 
"0"))) -or ($env:BUILD_DRIVER_FLIGHTSQL -eq "1")
@@ -29,70 +28,11 @@ $BuildDriverPostgreSQL = ($BuildAll -and (-not 
($env:BUILD_DRIVER_POSTGRESQL -eq
 $BuildDriverSqlite = ($BuildAll -and (-not ($env:BUILD_DRIVER_SQLITE -eq 
"0"))) -or ($env:BUILD_DRIVER_SQLITE -eq "1")
 $BuildDriverSnowflake = ($BuildAll -and (-not ($env:BUILD_DRIVER_SNOWFLAKE -eq 
"0"))) -or ($env:BUILD_DRIVER_SNOWFLAKE -eq "1")
 
-function Build-Subproject {
-    $Subproject = $Args[0]
-    $SubprojectBuild = Join-Path $SourceDir "python\$($Subproject)"
-
-    echo "============================================================"
-    echo "Building $($Subproject)"
-    echo "============================================================"
-
-    pip install -e $SubprojectBuild
-    if (-not $?) { exit 1 }
-}
-
-if ($BuildDriverManager) {
-    Build-Subproject adbc_driver_manager
-}
-if ($BuildDriverFlightSql) {
-    $env:ADBC_FLIGHTSQL_LIBRARY = Get-Childitem `
-      -ErrorAction SilentlyContinue `
-      -Path $InstallDir `
-      -Recurse `
-      -Include "adbc_driver_flightsql.dll","libadbc_driver_flightsql.so" | % 
{$_.FullName}
-    echo $env:ADBC_FLIGHTSQL_LIBRARY
-    if ($env:ADBC_FLIGHTSQL_LIBRARY -eq $null) {
-        echo "Could not find Flight SQL driver in $($InstallDir)"
-        exit 1
-    }
-    Build-Subproject adbc_driver_flightsql
-}
-if ($BuildDriverPostgreSQL) {
-    $env:ADBC_POSTGRESQL_LIBRARY = Get-Childitem `
-      -ErrorAction SilentlyContinue `
-      -Path $InstallDir `
-      -Recurse `
-      -Include "adbc_driver_postgresql.dll","libadbc_driver_postgresql.so" | % 
{$_.FullName}
-    echo $env:ADBC_POSTGRESQL_LIBRARY
-    if ($env:ADBC_POSTGRESQL_LIBRARY -eq $null) {
-        echo "Could not find libpq driver in $($InstallDir)"
-        exit 1
-    }
-    Build-Subproject adbc_driver_postgresql
-}
-if ($BuildDriverSqlite) {
-    $env:ADBC_SQLITE_LIBRARY = Get-Childitem `
-      -ErrorAction SilentlyContinue `
-      -Path $InstallDir `
-      -Recurse `
-      -Include "adbc_driver_sqlite.dll","libadbc_driver_sqlite.so" | % 
{$_.FullName}
-    echo $env:ADBC_SQLITE_LIBRARY
-    if ($env:ADBC_SQLITE_LIBRARY -eq $null) {
-        echo "Could not find SQLite driver in $($InstallDir)"
-        exit 1
-    }
-    Build-Subproject adbc_driver_sqlite
-}
-if ($BuildDriverSnowflake) {
-    $env:ADBC_SNOWFLAKE_LIBRARY = Get-Childitem `
-      -ErrorAction SilentlyContinue `
-      -Path $InstallDir `
-      -Recurse `
-      -Include "adbc_driver_snowflake.dll","libadbc_driver_snowflake.so" | % 
{$_.FullName}
-    echo $env:ADBC_SNOWFLAKE_LIBRARY
-    if ($env:ADBC_SNOWFLAKE_LIBRARY -eq $null) {
-        echo "Could not find Snowflake driver in $($InstallDir)"
-        exit 1
-    }
-    Build-Subproject adbc_driver_snowflake
-}
+cmake -S "$($SourceDir)\c" -B $BuildDir `
+    -DADBC_DRIVER_MANAGER=$BuildDriverManager `
+    -DADBC_DRIVER_FLIGHTSQL=$BuildDriverFlightSql `
+    -DADBC_DRIVER_POSTGRESQL=$BuildDriverPostgreSQL `
+    -DADBC_DRIVER_SQLITE=$BuildDriverSqlite `
+    -DADBC_DRIVER_SNOWFLAKE=$BuildDriverSnowflake `
+    -DADBC_BUILD_PYTHON=ON
+cmake --build $BuildDir --target python
diff --git a/ci/scripts/python_build.sh b/ci/scripts/python_build.sh
index 79aeaa28..533a82a3 100755
--- a/ci/scripts/python_build.sh
+++ b/ci/scripts/python_build.sh
@@ -25,58 +25,23 @@ set -e
 : ${BUILD_DRIVER_SQLITE:=${BUILD_ALL}}
 : ${BUILD_DRIVER_SNOWFLAKE:=${BUILD_ALL}}
 
-if [[ $(uname) = "Darwin" ]]; then
-    ADBC_LIBRARY_SUFFIX="dylib"
-else
-    ADBC_LIBRARY_SUFFIX="so"
-fi
-
-build_subproject() {
-    local -r source_dir="${1}"
-    local -r install_dir="${2}"
-    local -r subproject="${3}"
-
-    if [[ "${subproject}" = "adbc_driver_flightsql" ]]; then
-        export 
ADBC_FLIGHTSQL_LIBRARY="${install_dir}/lib/libadbc_driver_flightsql.${ADBC_LIBRARY_SUFFIX}"
-    elif [[ "${subproject}" = "adbc_driver_postgresql" ]]; then
-        export 
ADBC_POSTGRESQL_LIBRARY="${install_dir}/lib/libadbc_driver_postgresql.${ADBC_LIBRARY_SUFFIX}"
-    elif [[ "${subproject}" = "adbc_driver_sqlite" ]]; then
-        export 
ADBC_SQLITE_LIBRARY="${install_dir}/lib/libadbc_driver_sqlite.${ADBC_LIBRARY_SUFFIX}"
-    elif [[ "${subproject}" = "adbc_driver_snowflake" ]]; then
-        export 
ADBC_SNOWFLAKE_LIBRARY="${install_dir}/lib/libadbc_driver_snowflake.${ADBC_LIBRARY_SUFFIX}"
-    fi
-
-    python -m pip install --no-deps "${source_dir}/python/${subproject}"
-}
 
 main() {
     local -r source_dir="${1}"
     local -r build_dir="${2}"
-    local install_dir="${3}"
-
-    if [[ -z "${install_dir}" ]]; then
-        install_dir="${build_dir}/local"
-    fi
-
-    if [[ "${BUILD_DRIVER_FLIGHTSQL}" -gt 0 ]]; then
-        build_subproject "${source_dir}" "${install_dir}" adbc_driver_flightsql
-    fi
-
-    if [[ "${BUILD_DRIVER_MANAGER}" -gt 0 ]]; then
-        build_subproject "${source_dir}" "${install_dir}" adbc_driver_manager
-    fi
 
-    if [[ "${BUILD_DRIVER_POSTGRESQL}" -gt 0 ]]; then
-        build_subproject "${source_dir}" "${install_dir}" 
adbc_driver_postgresql
-    fi
+    set -x
 
-    if [[ "${BUILD_DRIVER_SQLITE}" -gt 0 ]]; then
-        build_subproject "${source_dir}" "${install_dir}" adbc_driver_sqlite
-    fi
+    cmake -S "${source_dir}/c" -B ${build_dir} \
+          -DADBC_DRIVER_MANAGER=${BUILD_DRIVER_MANAGER} \
+          -DADBC_DRIVER_FLIGHTSQL=${BUILD_DRIVER_FLIGHTSQL} \
+          -DADBC_DRIVER_POSTGRESQL=${BUILD_DRIVER_POSTGRESQL} \
+          -DADBC_DRIVER_SQLITE=${BUILD_DRIVER_SQLITE} \
+          -DADBC_DRIVER_SNOWFLAKE=${BUILD_DRIVER_SNOWFLAKE} \
+          -DADBC_BUILD_PYTHON=ON
+    cmake --build ${build_dir} --target python
 
-    if [[ "${BUILD_DRIVER_SNOWFLAKE}" -gt 0 ]]; then
-        build_subproject "${source_dir}" "${install_dir}" adbc_driver_snowflake
-    fi
+    set +x
 }
 
 main "$@"
diff --git a/python/adbc_driver_flightsql/README.md 
b/python/adbc_driver_flightsql/README.md
index 3320c6d8..ea3de1d2 100644
--- a/python/adbc_driver_flightsql/README.md
+++ b/python/adbc_driver_flightsql/README.md
@@ -44,6 +44,18 @@ export 
ADBC_FLIGHTSQL_LIBRARY=/path/to/libadbc_driver_flightsql.so
 pip install --no-deps -e .
 ```
 
+For users building from the arrow-adbc source repository, you can alternately 
use CMake to manage library dependencies and set environment variables for you. 
Assuming you specify ``-DADBC_DRIVER_FLIGHTSQL=ON`` you can also add 
``-DADBC_BUILD_PYTHON=ON`` to define a ``python`` target.
+
+For example, assuming you run cmake from the project root:
+
+```shell
+cmake -S c -B build --preset debug -DADBC_BUILD_PYTHON=ON
+cmake --build build --target python
+```
+
+will properly build and install the Python library for you.
+
+
 See [CONTRIBUTING.md](../../CONTRIBUTING.md) for details on the
 general build process.
 
diff --git a/python/adbc_driver_manager/README.md 
b/python/adbc_driver_manager/README.md
index bde5d400..e74e9d06 100644
--- a/python/adbc_driver_manager/README.md
+++ b/python/adbc_driver_manager/README.md
@@ -38,6 +38,17 @@ row-oriented API of the base DBAPI interface.
 
 Dependencies: a C++ compiler.
 
+For users building from the arrow-adbc source repository, you can alternately 
use CMake to manage library dependencies and set environment variables for you. 
You can add ``-DADBC_BUILD_PYTHON=ON`` to define a ``python`` target.
+
+For example, assuming you run cmake from the project root:
+
+```shell
+cmake -S c -B build --preset debug -DADBC_BUILD_PYTHON=ON
+cmake --build build --target python
+```
+
+will properly build and install the Python library for you.
+
 See [CONTRIBUTING.md](../../CONTRIBUTING.md) for details.
 
 ## Testing
diff --git a/python/adbc_driver_postgresql/README.md 
b/python/adbc_driver_postgresql/README.md
index cfa9ac99..2181b071 100644
--- a/python/adbc_driver_postgresql/README.md
+++ b/python/adbc_driver_postgresql/README.md
@@ -57,6 +57,17 @@ export 
ADBC_POSTGRESQL_LIBRARY=/path/to/libadbc_driver_postgresql.so
 pip install --no-deps -e .
 ```
 
+For users building from the arrow-adbc source repository, you can alternately 
use CMake to manage library dependencies and set environment variables for you. 
Assuming you specify ``-DADBC_DRIVER_POSTGRESQL=ON`` you can also add 
``-DADBC_BUILD_PYTHON=ON`` to define a ``python`` target.
+
+For example, assuming you run cmake from the project root:
+
+```shell
+cmake -S c -B build --preset debug -DADBC_BUILD_PYTHON=ON
+cmake --build build --target python
+```
+
+will properly build and install the Python library for you.
+
 See [CONTRIBUTING.md](../../CONTRIBUTING.md) for details on the
 general build process.
 
diff --git a/python/adbc_driver_snowflake/README.md 
b/python/adbc_driver_snowflake/README.md
index 0ca23f48..17db5d69 100644
--- a/python/adbc_driver_snowflake/README.md
+++ b/python/adbc_driver_snowflake/README.md
@@ -44,6 +44,17 @@ export 
ADBC_SNOWFLAKE_LIBRARY=/path/to/libadbc_driver_snowflake.so
 pip install --no-deps -e .
 ```
 
+For users building from the arrow-adbc source repository, you can alternately 
use CMake to manage library dependencies and set environment variables for you. 
Assuming you specify ``-DADBC_DRIVER_SNOWFLAKE=ON`` you can also add 
``-DADBC_BUILD_PYTHON=ON`` to define a ``python`` target.
+
+For example, assuming you run cmake from the project root:
+
+```shell
+cmake -S c -B build --preset debug -DADBC_BUILD_PYTHON=ON
+cmake --build build --target python
+```
+
+will properly build and install the Python library for you.
+
 See [CONTRIBUTING.md](../../CONTRIBUTING.md) for details on the
 general build process.
 
diff --git a/python/adbc_driver_sqlite/README.md 
b/python/adbc_driver_sqlite/README.md
index 802bcdc7..a324853a 100644
--- a/python/adbc_driver_sqlite/README.md
+++ b/python/adbc_driver_sqlite/README.md
@@ -55,6 +55,17 @@ export ADBC_SQLITE_LIBRARY=/path/to/libadbc_driver_sqlite.so
 pip install --no-deps -e .
 ```
 
+For users building from the arrow-adbc source repository, you can alternately 
use CMake to manage library dependencies and set environment variables for you. 
Assuming you specify ``-DADBC_DRIVER_SQLITE=ON`` you can also add 
``-DADBC_BUILD_PYTHON=ON`` to define a ``python`` target.
+
+For example, assuming you run cmake from the project root:
+
+```shell
+cmake -S c -B build --preset debug -DADBC_BUILD_PYTHON=ON
+cmake --build build --target python
+```
+
+will properly build and install the Python library for you.
+
 See [CONTRIBUTING.md](../../CONTRIBUTING.md) for details on the
 general build process.
 

Reply via email to