blob: 513400e5ab32d31585c8549beac798ba3d95b524 [file] [log] [blame]
# 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.
# The shell tarball build only needs the build virtualenvs for the system
# pythons that are installed.
set(IMPALA_PYTHON_BUILD_VENVS "")
set(VENV_LOC "${CMAKE_SOURCE_DIR}/shell/build")
set(PIP_LOC "~/.cache/impala_pip")
# Tests depend on installing system pythons to specific locations, so we error if they
# won't match what's expected in this config and make_shell_tarball.sh.
set(PYTHON_EXES $ENV{IMPALA_EXTRA_PACKAGE_PYTHONS})
if (NOT $ENV{IMPALA_SYSTEM_PYTHON2} STREQUAL "")
get_filename_component(PYTHON_NAME $ENV{IMPALA_SYSTEM_PYTHON2} NAME)
if (NOT ${PYTHON_NAME} STREQUAL "python2")
message(FATAL_ERROR "IMPALA_SYSTEM_PYTHON2 must be a binary named python2")
endif()
list(APPEND PYTHON_EXES $ENV{IMPALA_SYSTEM_PYTHON2})
endif()
if (NOT $ENV{IMPALA_SYSTEM_PYTHON3} STREQUAL "")
get_filename_component(PYTHON_NAME $ENV{IMPALA_SYSTEM_PYTHON3} NAME)
if (NOT ${PYTHON_NAME} STREQUAL "python3")
message(FATAL_ERROR "IMPALA_SYSTEM_PYTHON3 must be a binary named python3")
endif()
list(APPEND PYTHON_EXES $ENV{IMPALA_SYSTEM_PYTHON3})
endif()
message(STATUS "Packaging for ${PYTHON_EXES}")
foreach(PYTHON_EXE IN LISTS PYTHON_EXES)
get_filename_component(PYTHON_NAME "${PYTHON_EXE}" NAME)
# These virtualenvs serve two purposes:
# 1. They have system python with wheel installed, and they can be used to produce
# wheels for external dependencies for the shell tarball build.
# 2. We pip install impala-shell into them for use in tests.
# The initial virtualenv creation includes the "pip install wheel" command to
# satisfy #1. #2 is a separate step and has no interaction with #1.
set(VENV "${VENV_LOC}/${PYTHON_NAME}_venv")
# IMPALA-12117: Use separate pip cache directories to avoid concurrency
# issues. The standard location is in ~/.cache/pip, so this uses directories
# inside ~/.cache. These typical consume a couple MB each.
set(PIP_CACHE "${PIP_LOC}/${PYTHON_NAME}")
# Supports fallback to impala-virtualenv for older Python versions.
add_custom_command(OUTPUT "${VENV}" DEPENDS impala_python
COMMAND "${CMAKE_SOURCE_DIR}/bin/cmake_aux/create_virtualenv.sh"
"${PYTHON_EXE}" "${VENV}"
COMMAND "${VENV}/bin/pip" install --cache-dir "${PIP_CACHE}" wheel
)
list(APPEND IMPALA_PYTHON_BUILD_VENVS "${VENV}")
endforeach()
add_custom_target(shell_tarball DEPENDS gen-deps "${IMPALA_PYTHON_BUILD_VENVS}"
COMMAND "${CMAKE_SOURCE_DIR}/shell/make_shell_tarball.sh" ${PYTHON_EXES}
)
add_custom_target(shell_pypi_package DEPENDS shell_tarball impala_python
COMMAND "${CMAKE_SOURCE_DIR}/shell/packaging/make_python_package.sh"
)
# A separate package target is needed because without OFFICIAL the file name is
# non-deterministic. Uses a custom target to synchronize for multiple dependents.
# Derive version from IMPALA_VERSION (drops everything after '-' because PEP 440 requires
# '+' but setup.py doesn't treat it consistently when generating the file name).
string(REGEX REPLACE "-.*" "" PKG_VERSION $ENV{IMPALA_VERSION})
set(SHELL_TEST_PKG
"${CMAKE_SOURCE_DIR}/shell/build/dist/impala_shell-${PKG_VERSION}.tar.gz")
get_filename_component(SHELL_TEST_PKG_DIR "${SHELL_TEST_PKG}" DIRECTORY)
# Generates SHELL_TEST_PKG
add_custom_target(shell_pypi_test_package DEPENDS shell_tarball impala_python
COMMAND env BUILD_VERSION=${PKG_VERSION} OFFICIAL=true DIST_DIR="${SHELL_TEST_PKG_DIR}"
"${CMAKE_SOURCE_DIR}/shell/packaging/make_python_package.sh"
)
# Tests expect to find venvs at 'python2_venv' and 'python3_venv' in tests/shell/util.py.
set(PYTHON2_VENV "${VENV_LOC}/python2_venv")
add_custom_target(shell_python2_install DEPENDS "${PYTHON2_VENV}" shell_pypi_test_package
COMMAND "${PYTHON2_VENV}/bin/pip" install --cache-dir "${PIP_LOC}/python2" "${SHELL_TEST_PKG}"
)
set(PYTHON3_VENV "${VENV_LOC}/python3_venv")
add_custom_target(shell_python3_install DEPENDS "${PYTHON3_VENV}" shell_pypi_test_package
COMMAND "${PYTHON3_VENV}/bin/pip" install --cache-dir "${PIP_LOC}/python3" "${SHELL_TEST_PKG}"
)