Improve python_wheel CMake target (#2688)
authorMichał Karzyński <4430709+postrational@users.noreply.github.com>
Sun, 18 Oct 2020 15:12:25 +0000 (17:12 +0200)
committerGitHub <noreply@github.com>
Sun, 18 Oct 2020 15:12:25 +0000 (17:12 +0200)
ngraph/python/CMakeLists.txt
ngraph/python/build_wheel.py.in
ngraph/python/build_wheel.sh.in [deleted file]

index 3b3f7c1..85254c6 100644 (file)
@@ -23,37 +23,23 @@ include(ExternalProject)
 ExternalProject_Add(
         pybind11
         GIT_REPOSITORY "https://github.com/pybind/pybind11.git"
-        GIT_TAG "v2.4.3"
+        GIT_TAG "v2.5.0"
         SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/pybind11"
         CONFIGURE_COMMAND ""
         BUILD_COMMAND ""
         INSTALL_COMMAND ""
 )
 
-if (WIN32)
-        set(BUILD_PY_IN "${CMAKE_CURRENT_SOURCE_DIR}/build_wheel.py.in")
-        set(BUILD_PY    "${CMAKE_CURRENT_BINARY_DIR}/build_wheel.py")
-        configure_file(${BUILD_PY_IN} ${BUILD_PY} @ONLY)
+set(BUILD_PY_IN "${CMAKE_CURRENT_SOURCE_DIR}/build_wheel.py.in")
+set(BUILD_PY    "${CMAKE_CURRENT_BINARY_DIR}/build_wheel.py")
+configure_file(${BUILD_PY_IN} ${BUILD_PY} @ONLY)
 
-        add_custom_command(
-                DEPENDS pybind11
-                OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dist/
-                POST_BUILD
-                WORKING_DIR ${CMAKE_CURRENT_BINARY_DIR}
-                COMMAND python ${BUILD_PY}
-        )
-else()
-        set(BUILD_SH_IN "${CMAKE_CURRENT_SOURCE_DIR}/build_wheel.sh.in")
-        set(BUILD_SH    "${CMAKE_CURRENT_BINARY_DIR}/build_wheel.sh")
-        configure_file(${BUILD_SH_IN} ${BUILD_SH} @ONLY)
-
-        add_custom_command(
-                DEPENDS pybind11
-                OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dist/
-                POST_BUILD
-                WORKING_DIR ${CMAKE_CURRENT_BINARY_DIR}
-                COMMAND ${CMAKE_BUILD_TOOL} -C ../ DESTDIR=python/_install install && bash build_wheel.sh
-        )
-endif()
+add_custom_command(
+        DEPENDS pybind11
+        OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dist/
+        POST_BUILD
+        WORKING_DIR ${CMAKE_CURRENT_BINARY_DIR}
+        COMMAND python ${BUILD_PY}
+)
 
 add_custom_target(python_wheel DEPENDS ngraph ${CMAKE_CURRENT_BINARY_DIR}/dist/)
index 0cba667..974d486 100644 (file)
 import os
 import subprocess
 import sys
+import venv
 
-print('Building ngraph wheel for Python {}'.format(sys.version_info.major))
+print("Building ngraph wheel for Python {}".format(sys.version_info.major))
 
-PYBIND_HEADERS_PATH="@CMAKE_CURRENT_BINARY_DIR@/pybind11"
-NGRAPH_CPP_BUILD_PATH="@CMAKE_INSTALL_PREFIX@/@NGRAPH_COMPONENT_PREFIX@"
-NGRAPH_ONNX_IMPORT_ENABLE="@NGRAPH_ONNX_IMPORT_ENABLE@"
-NGRAPH_VERSION="@NGRAPH_WHEEL_VERSION@"
-PYTHON_API_SOURCE_DIR="@CMAKE_CURRENT_SOURCE_DIR@"
-BUILD_DIR="@CMAKE_CURRENT_BINARY_DIR@"
+PYBIND_HEADERS_PATH = "@CMAKE_CURRENT_BINARY_DIR@/pybind11"
+NGRAPH_CPP_BUILD_PATH = "@CMAKE_INSTALL_PREFIX@/@NGRAPH_COMPONENT_PREFIX@"
+NGRAPH_ONNX_IMPORT_ENABLE = "@NGRAPH_ONNX_IMPORT_ENABLE@"
+NGRAPH_VERSION = "@NGRAPH_WHEEL_VERSION@"
+PYTHON_API_SOURCE_DIR = "@CMAKE_CURRENT_SOURCE_DIR@"
+BUILD_DIR = "@CMAKE_CURRENT_BINARY_DIR@"
 
-BUILD_DEPS = ['setuptools', 'wheel']
+BUILD_DEPS = ["setuptools", "wheel", "pip"]
 
 try:
-    venv_dir = os.path.join(os.path.curdir, 'whl_build_venv')
+    venv_dir = os.path.join(os.path.curdir, "whl_build_venv")
     print("Creating a virtualenv to build the wheel in: ", os.path.abspath(venv_dir))
-    subprocess.check_call(['virtualenv', venv_dir])
+    venv.create(venv_dir, with_pip=True)
 
-    venv_activator = os.path.abspath(os.path.join(venv_dir, "Scripts", "activate.bat"))
-    print("Activating the virtualenv...")
-    os.startfile(venv_activator)
+    venv_python = (
+        os.path.abspath(os.path.join(venv_dir, "Scripts", "python"))
+        if os.name == "nt"
+        else os.path.abspath(os.path.join(venv_dir, "bin", "python"))
+    )
 
     print("Installing build dependencies...")
-    pip_install_cmd = ['pip', 'install', '-U']
+    pip_install_cmd = [venv_python, "-m", "pip", "install", "-U"]
     pip_install_cmd.extend(BUILD_DEPS)
     subprocess.check_call(pip_install_cmd)
 
-    build_env_variables = {"PYBIND_HEADERS_PATH": PYBIND_HEADERS_PATH,
-                           "NGRAPH_CPP_BUILD_PATH": NGRAPH_CPP_BUILD_PATH,
-                           "NGRAPH_ONNX_IMPORT_ENABLE": NGRAPH_ONNX_IMPORT_ENABLE,
-                           "NGRAPH_VERSION": NGRAPH_VERSION}
+    build_env_variables = {
+        "PYBIND_HEADERS_PATH": PYBIND_HEADERS_PATH,
+        "NGRAPH_CPP_BUILD_PATH": NGRAPH_CPP_BUILD_PATH,
+        "NGRAPH_ONNX_IMPORT_ENABLE": NGRAPH_ONNX_IMPORT_ENABLE,
+        "NGRAPH_VERSION": NGRAPH_VERSION,
+    }
     env = os.environ
     env.update(build_env_variables)
 
     print("Running setup.py bdist_wheel")
-    build_log = subprocess.Popen(['python', os.path.join(PYTHON_API_SOURCE_DIR, 'setup.py'), 'bdist_wheel'],
-        stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, universal_newlines=True)
+    build_log = subprocess.Popen(
+        [venv_python, os.path.join(PYTHON_API_SOURCE_DIR, "setup.py"), "bdist_wheel"],
+        stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, universal_newlines=True,
+    )
 
     for line in build_log.stdout:
         sys.stdout.write(line)
 
     print("Running setup.py sdist")
-    subprocess.check_call(['python', os.path.join(PYTHON_API_SOURCE_DIR, 'setup.py'), 'sdist'])
+    subprocess.check_call([venv_python, os.path.join(PYTHON_API_SOURCE_DIR, "setup.py"), "sdist"])
+
+    output_dir = os.path.join(PYTHON_API_SOURCE_DIR, "dist")
+    print("\n>>> NOTE: nGraph Python packages created in ", output_dir)
+    print("\n".join(os.listdir(output_dir)))
 
-    print("Deactivating the temporary build virtualenv")
-    venv_deactivator = os.path.abspath(os.path.join(venv_dir, "Scripts", "deactivate.bat"))
-    os.startfile(venv_deactivator)
 except subprocess.CalledProcessError as err:
     print("Could not complete the wheel building process")
     print("Command that failed: ", err.cmd)
     if err.stdout is not None:
-        print("Command std output: ", err.stdout.decode('utf-8'))
+        print("Command std output: ", err.stdout.decode("utf-8"))
     if err.stderr is not None:
-        print("Command err output: ", err.stderr.decode('utf-8'))
+        print("Command err output: ", err.stderr.decode("utf-8"))
     sys.exit(1)
diff --git a/ngraph/python/build_wheel.sh.in b/ngraph/python/build_wheel.sh.in
deleted file mode 100644 (file)
index 597ffc0..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/usr/bin/env bash
-# ******************************************************************************
-# Copyright 2017-2020 Intel Corporation
-#
-# Licensed 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.
-# ******************************************************************************
-
-set -e
-
-export PYBIND_HEADERS_PATH=@CMAKE_CURRENT_BINARY_DIR@/pybind11
-export NGRAPH_CPP_BUILD_PATH=@CMAKE_CURRENT_BINARY_DIR@/_install/@CMAKE_INSTALL_PREFIX@/@NGRAPH_COMPONENT_PREFIX@
-export NGRAPH_ONNX_IMPORT_ENABLE=@NGRAPH_ONNX_IMPORT_ENABLE@
-export NGRAPH_VERSION=@NGRAPH_WHEEL_VERSION@
-
-SOURCE_DIR=@CMAKE_CURRENT_SOURCE_DIR@
-BUILD_DIR=@CMAKE_CURRENT_BINARY_DIR@
-
-! PYTHON2_DETECTED=$(($(python -c 'import sys; print(sys.version_info.major)' 2> /dev/null) == 2))
-! PYTHON3_DETECTED=$(($(python3 -c 'import sys; print(sys.version_info.major)' 2> /dev/null) == 3))
-
-mkdir -p build
-
-if [ "${PYTHON2_DETECTED}" == 1 ]; then
-    echo "Building wheel for Python 2"
-    python --version
-    cd ${BUILD_DIR}
-    virtualenv -p "$(command -v python)" build/venv2
-    source build/venv2/bin/activate
-    pip install --upgrade setuptools pip wheel
-    python ${SOURCE_DIR}/setup.py bdist_wheel
-    deactivate
-fi
-
-if [ "${PYTHON3_DETECTED}" == 1  ]; then
-    echo "Building wheel for Python 3"
-    python3 --version
-    cd ${BUILD_DIR}
-    virtualenv -p "$(command -v python3)" build/venv3
-    source build/venv3/bin/activate
-    pip install --upgrade setuptools pip wheel
-    python ${SOURCE_DIR}/setup.py bdist_wheel
-    python ${SOURCE_DIR}/setup.py sdist
-    deactivate
-fi