diff options
author | Dominik Holland <dominik.holland@qt.io> | 2021-05-20 15:55:40 +0200 |
---|---|---|
committer | Dominik Holland <dominik.holland@qt.io> | 2021-05-26 18:04:55 +0200 |
commit | 6a14fc6172f687fbbbc6a5a5d0df081508fd2d41 (patch) | |
tree | b5e305c5bb692df3c1bd74fbeea43fb0245da706 | |
parent | f357bb6e64ea24e4ec27b6d84c94c3a6dadc24fa (diff) |
cmake: Don't build the virtualenv if the python3 qface package is installed
Change-Id: Ifdb724662b53b6c848ec956578bfe8ade3ab115a
Reviewed-by: Robert Griebl <robert.griebl@qt.io>
-rw-r--r-- | src/CMakeLists.txt | 7 | ||||
-rw-r--r-- | src/ivicore/Qt6IviCoreMacros.cmake | 27 | ||||
-rw-r--r-- | src/tools/ivigenerator/CMakeLists.txt | 220 |
3 files changed, 135 insertions, 119 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 636fb71..e3c7d29 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -6,6 +6,10 @@ qt_feature_evaluate_features("${CMAKE_CURRENT_SOURCE_DIR}/ivimedia/configure.cma qt_feature_evaluate_features("${CMAKE_CURRENT_SOURCE_DIR}/geniviextras/configure.cmake") # special case add_subdirectory(3rdparty) # special case +if(QT_FEATURE_ivicore AND QT_FEATURE_ivigenerator AND NOT QT_FEATURE_geniviextras_only AND NOT QT_FEATURE_system_ivigenerator) + add_subdirectory(tools/ivigenerator) +endif() + add_subdirectory(doc) if(QT_FEATURE_ivicore AND NOT QT_FEATURE_geniviextras_only AND NOT QT_FEATURE_host_tools_only) add_subdirectory(ivicore) @@ -27,9 +31,6 @@ endif() if(QT_FEATURE_geniviextras AND NOT QT_FEATURE_host_tools_only) add_subdirectory(geniviextras) endif() -if(QT_FEATURE_ivicore AND QT_FEATURE_ivigenerator AND NOT QT_FEATURE_geniviextras_only AND NOT QT_FEATURE_system_ivigenerator) - add_subdirectory(tools/ivigenerator) -endif() add_subdirectory(plugins) add_subdirectory(imports) # special case end diff --git a/src/ivicore/Qt6IviCoreMacros.cmake b/src/ivicore/Qt6IviCoreMacros.cmake index 7bacbcf..2e504b8 100644 --- a/src/ivicore/Qt6IviCoreMacros.cmake +++ b/src/ivicore/Qt6IviCoreMacros.cmake @@ -23,7 +23,8 @@ endmacro() function(qt6_ivigenerator_generate) internal_resolve_ivigenerator_path() - if (NOT EXISTS ${VIRTUALENV}/bin/activate AND NOT EXISTS ${VIRTUALENV}/Scripts/activate.bat) + if (QT_FEATURE_python3_virtualenv AND NOT QT_FEATURE_system_qface + AND NOT EXISTS ${VIRTUALENV}/bin/activate AND NOT EXISTS ${VIRTUALENV}/Scripts/activate.bat) return() endif() @@ -128,19 +129,24 @@ function(qt6_ivigenerator_generate) # TODO How to best unset those again afterwards ? # Use cmake -E slee + cmake -E env COMMAND instead ? #equals(QMAKE_HOST.os, Windows): ENV = chcp 65001 && - if ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows") - set(PYTHON_EXECUTABLE ${VIRTUALENV}/Scripts/python.exe) - file(TO_NATIVE_PATH "${VIRTUALENV}" VIRTUALENV) + if (QT_FEATURE_python3_virtualenv AND NOT QT_FEATURE_system_qface) + if ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows") + set(PYTHON_EXECUTABLE ${VIRTUALENV}/Scripts/python.exe) + file(TO_NATIVE_PATH "${VIRTUALENV}" VIRTUALENV) + else() + set(PYTHON_EXECUTABLE ${VIRTUALENV}/bin/python) + set(ENV{LC_ALL} en_US.UTF-8) + set(ENV{LD_LIBRARY_PATH} ${VIRTUALENV}/bin) + endif() + set(ENV{PYTHONHOME} ${VIRTUALENV}) + set(ENV{VIRTUAL_ENV} ${VIRTUALENV}) else() - set(PYTHON_EXECUTABLE ${VIRTUALENV}/bin/python) - set(ENV{LC_ALL} en_US.UTF-8) - set(ENV{LD_LIBRARY_PATH} ${VIRTUALENV}/bin) + qt_find_package(Python3 PROVIDED_TARGETS Python3::Interpreter MODULE_NAME ivicore) + set(PYTHON_EXECUTABLE ${Python3_EXECUTABLE}) endif() if (DEFINED IVIGENERATOR_CONFIG) set(ENV{IVIGENERATOR_CONFIG} ${IVIGENERATOR_CONFIG}) endif() - set(ENV{PYTHONHOME} ${VIRTUALENV}) - set(ENV{VIRTUAL_ENV} ${VIRTUALENV}) message(STATUS "Running ivigenerator for ${QFACE_SOURCES}") execute_process( @@ -181,7 +187,8 @@ endif() function(qt6_ivigenerator_include target) internal_resolve_ivigenerator_path() - if (NOT EXISTS ${VIRTUALENV}/bin/activate AND NOT EXISTS ${VIRTUALENV}/Scripts/activate.bat) + if (QT_FEATURE_python3_virtualenv AND NOT QT_FEATURE_system_qface + AND NOT EXISTS ${VIRTUALENV}/bin/activate AND NOT EXISTS ${VIRTUALENV}/Scripts/activate.bat) # Create a dummy target instead if (NOT TARGET ${target} AND NOT TEST ${target}) if (DEFINED QtIvi_BINARY_DIR) diff --git a/src/tools/ivigenerator/CMakeLists.txt b/src/tools/ivigenerator/CMakeLists.txt index 62c2469..f71c42e 100644 --- a/src/tools/ivigenerator/CMakeLists.txt +++ b/src/tools/ivigenerator/CMakeLists.txt @@ -3,96 +3,124 @@ ## Virtual env creation ##################################################################### -qt_find_package(Python3 PROVIDED_TARGETS Python3::Interpreter MODULE_NAME ivicore) - -set(VIRTUALENV_NAME qtivi_qface_virtualenv) -set(VIRTUALENV_PATH ${CMAKE_CURRENT_BINARY_DIR}/${VIRTUALENV_NAME}) -set(QFACE_SOURCE_DIR ${QtIvi_SOURCE_DIR}/src/3rdparty/qface) -set(RELOCATE_VIRTUALENV ${QtIvi_SOURCE_DIR}/src/3rdparty/virtualenv/relocate_virtualenv.py) - -if ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows") - set(VIRTUALENV_ACTIVATE ${VIRTUALENV_PATH}/Scripts/activate.bat) - set(VIRTUALENV_ACTIVATE_COMMAND ${VIRTUALENV_ACTIVATE}) - set(QFACE_BIN ${VIRTUALENV_PATH}/Scripts/qface.exe) - set(DEPLOY_VIRTUALENV ${CMAKE_CURRENT_SOURCE_DIR}/deploy-virtualenv.bat) -else() - set(VIRTUALENV_ACTIVATE ${VIRTUALENV_PATH}/bin/activate) - set(VIRTUALENV_ACTIVATE_COMMAND . ${VIRTUALENV_ACTIVATE}) - set(QFACE_BIN ${VIRTUALENV_PATH}/bin/qface) - set(DEPLOY_VIRTUALENV ${CMAKE_CURRENT_SOURCE_DIR}/deploy-virtualenv.sh) -endif() +set(ivigenerator_install_dir "${CMAKE_INSTALL_PREFIX}/${INSTALL_BINDIR}/ivigenerator") +set(templates_install_dir "${ivigenerator_install_dir}/templates") -add_custom_command(OUTPUT ${VIRTUALENV_ACTIVATE} - COMMAND ${CMAKE_COMMAND} -E make_directory ${VIRTUALENV_PATH} - - # virtualenv is always using the default interpreter, which is python2 on many systems" - # by adding -p we enforce that the python3 interpreter is used and make sure python3 is installed in the virtualenv - COMMAND ${CMAKE_COMMAND} -E chdir ${VIRTUALENV_PATH} - ${Python3_EXECUTABLE} -m virtualenv -p ${Python3_EXECUTABLE} --always-copy . - - # Use a Python virtualenv for installing qface, so we don't pollute the user environment - # On some systems virtualenv --always-copy doesn't work (https://github.com/pypa/virtualenv/issues/565). - # To workaround the problem, we need to manually create the folder and create the virtualenv from - # inside - COMMAND ${CMAKE_COMMAND} -E chdir ${VIRTUALENV_PATH} - ${Python3_EXECUTABLE} ${RELOCATE_VIRTUALENV} . - COMMENT "Setting up virtualenv for qface, name: ${VIRTUALENV_NAME}" - ) - -# This is not very nice, but it gives us at least a good way to handle virtualenv rebuilding when -# someone is working on the qface sources -file(GLOB_RECURSE QFACE_SOURCE_FILES ${QFACE_SOURCE_DIR}/*.py) - -# On the CI we use the special wheel folder when available to not download all packages again on each build -set(PYTHON3_WHEEL_CACHE "$ENV{PYTHON3_WHEEL_CACHE}" CACHE PATH "Python3 wheel cache") -if (EXISTS "${PYTHON3_WHEEL_CACHE}") - message(STATUS "Using wheel cache for python package installation: ${PYTHON3_WHEEL_CACHE}") - set(PIP3_INSTALL_COMMAND pip3 install --no-index --find-links=${PYTHON3_WHEEL_CACHE} ${QFACE_SOURCE_DIR} --verbose) -else() - set(PIP3_INSTALL_COMMAND pip3 install --upgrade ${QFACE_SOURCE_DIR}) -endif() +if(QT_FEATURE_python3_virtualenv AND NOT QT_FEATURE_system_qface) + qt_find_package(Python3 PROVIDED_TARGETS Python3::Interpreter MODULE_NAME ivicore) + + set(VIRTUALENV_NAME qtivi_qface_virtualenv) + set(VIRTUALENV_PATH ${CMAKE_CURRENT_BINARY_DIR}/${VIRTUALENV_NAME}) + set(QFACE_SOURCE_DIR ${QtIvi_SOURCE_DIR}/src/3rdparty/qface) + set(RELOCATE_VIRTUALENV ${QtIvi_SOURCE_DIR}/src/3rdparty/virtualenv/relocate_virtualenv.py) + + if ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows") + set(VIRTUALENV_ACTIVATE ${VIRTUALENV_PATH}/Scripts/activate.bat) + set(VIRTUALENV_ACTIVATE_COMMAND ${VIRTUALENV_ACTIVATE}) + set(QFACE_BIN ${VIRTUALENV_PATH}/Scripts/qface.exe) + set(DEPLOY_VIRTUALENV ${CMAKE_CURRENT_SOURCE_DIR}/deploy-virtualenv.bat) + else() + set(VIRTUALENV_ACTIVATE ${VIRTUALENV_PATH}/bin/activate) + set(VIRTUALENV_ACTIVATE_COMMAND . ${VIRTUALENV_ACTIVATE}) + set(QFACE_BIN ${VIRTUALENV_PATH}/bin/qface) + set(DEPLOY_VIRTUALENV ${CMAKE_CURRENT_SOURCE_DIR}/deploy-virtualenv.sh) + endif() -add_custom_command(OUTPUT ${QFACE_BIN} - COMMAND ${VIRTUALENV_ACTIVATE_COMMAND} - COMMAND ${PIP3_INSTALL_COMMAND} - DEPENDS ${VIRTUALENV_ACTIVATE} - ${QFACE_SOURCE_DIR}/requirements.txt - ${QFACE_SOURCE_FILES}| - COMMENT "Installing qface development version into ${VIRTUALENV_NAME}" - ) - -add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/.stamp-deploy_virtualenv - ${CMAKE_CURRENT_BINARY_DIR}/.stamp-cmake-rerun - COMMAND ${DEPLOY_VIRTUALENV} qtivi_qface_virtualenv - COMMAND ${CMAKE_COMMAND} -E touch .stamp-deploy_virtualenv - COMMAND ${CMAKE_COMMAND} -E touch .stamp-cmake-rerun - DEPENDS ${QFACE_BIN} - ) - -# main target which just relies on the stamp file to be uptodate -add_custom_target(ivigenerator ALL - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/.stamp-deploy_virtualenv - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/.stamp-cmake-rerun - ) -# Create the rerun cmake stamp file here to be able to add cmake configure dependency -# A dependency can only be added to an existing file -# This file is touched during the build during the deploy virtualenv step and is marked as an output -# there as well. -# In the end it makes sure that virtualenv deployment is a dependency for the configure run and -# done first. Once it is done the configure step is done again and we can use the created virtualenv -# within CMakeLists.txt istelf -file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/.stamp-cmake-rerun) -set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/.stamp-cmake-rerun) + add_custom_command(OUTPUT ${VIRTUALENV_ACTIVATE} + COMMAND ${CMAKE_COMMAND} -E make_directory ${VIRTUALENV_PATH} + + # virtualenv is always using the default interpreter, which is python2 on many systems" + # by adding -p we enforce that the python3 interpreter is used and make sure python3 is installed in the virtualenv + COMMAND ${CMAKE_COMMAND} -E chdir ${VIRTUALENV_PATH} + ${Python3_EXECUTABLE} -m virtualenv -p ${Python3_EXECUTABLE} --always-copy . + + # Use a Python virtualenv for installing qface, so we don't pollute the user environment + # On some systems virtualenv --always-copy doesn't work (https://github.com/pypa/virtualenv/issues/565). + # To workaround the problem, we need to manually create the folder and create the virtualenv from + # inside + COMMAND ${CMAKE_COMMAND} -E chdir ${VIRTUALENV_PATH} + ${Python3_EXECUTABLE} ${RELOCATE_VIRTUALENV} . + COMMENT "Setting up virtualenv for qface, name: ${VIRTUALENV_NAME}" + ) + + # This is not very nice, but it gives us at least a good way to handle virtualenv rebuilding when + # someone is working on the qface sources + file(GLOB_RECURSE QFACE_SOURCE_FILES ${QFACE_SOURCE_DIR}/*.py) + + # On the CI we use the special wheel folder when available to not download all packages again on each build + set(PYTHON3_WHEEL_CACHE "$ENV{PYTHON3_WHEEL_CACHE}" CACHE PATH "Python3 wheel cache") + if (EXISTS "${PYTHON3_WHEEL_CACHE}") + message(STATUS "Using wheel cache for python package installation: ${PYTHON3_WHEEL_CACHE}") + set(PIP3_INSTALL_COMMAND pip3 install --no-index --find-links=${PYTHON3_WHEEL_CACHE} ${QFACE_SOURCE_DIR} --verbose) + else() + set(PIP3_INSTALL_COMMAND pip3 install --upgrade ${QFACE_SOURCE_DIR}) + endif() -##################################################################### -## clean target -##################################################################### + add_custom_command(OUTPUT ${QFACE_BIN} + COMMAND ${VIRTUALENV_ACTIVATE_COMMAND} + COMMAND ${PIP3_INSTALL_COMMAND} + DEPENDS ${VIRTUALENV_ACTIVATE} + ${QFACE_SOURCE_DIR}/requirements.txt + ${QFACE_SOURCE_FILES}| + COMMENT "Installing qface development version into ${VIRTUALENV_NAME}" + ) + + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/.stamp-deploy_virtualenv + ${CMAKE_CURRENT_BINARY_DIR}/.stamp-cmake-rerun + COMMAND ${DEPLOY_VIRTUALENV} qtivi_qface_virtualenv + COMMAND ${CMAKE_COMMAND} -E touch .stamp-deploy_virtualenv + COMMAND ${CMAKE_COMMAND} -E touch .stamp-cmake-rerun + DEPENDS ${QFACE_BIN} + ) -set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_CLEAN_FILES - ${CMAKE_CURRENT_BINARY_DIR}/.stamp-deploy_virtualenv - ${CMAKE_CURRENT_BINARY_DIR}/.stamp-cmake-rerun - ${VIRTUALENV_PATH} - ) + # main target which just relies on the stamp file to be uptodate + add_custom_target(ivigenerator ALL + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/.stamp-deploy_virtualenv + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/.stamp-cmake-rerun + ) + # Create the rerun cmake stamp file here to be able to add cmake configure dependency + # A dependency can only be added to an existing file + # This file is touched during the build during the deploy virtualenv step and is marked as an output + # there as well. + # In the end it makes sure that virtualenv deployment is a dependency for the configure run and + # done first. Once it is done the configure step is done again and we can use the created virtualenv + # within CMakeLists.txt istelf + file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/.stamp-cmake-rerun) + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/.stamp-cmake-rerun) + + ##################################################################### + ## clean target + ##################################################################### + + set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_CLEAN_FILES + ${CMAKE_CURRENT_BINARY_DIR}/.stamp-deploy_virtualenv + ${CMAKE_CURRENT_BINARY_DIR}/.stamp-cmake-rerun + ${VIRTUALENV_PATH} + ) + + + ##################################################################### + ## virtualenv INSTALL Targets + ##################################################################### + + # qt_copy_or_install does the copying at configure time + # QT_WILL_INSTALL is the same variable which is used in qt_copy_or_install internally to determine + # whether installing or copying is needed + if(QT_WILL_INSTALL) + qt_install( + DIRECTORY + ${VIRTUALENV_PATH} + USE_SOURCE_PERMISSIONS + DESTINATION "${ivigenerator_install_dir}" + ) + else() + add_custom_target(copy_virtualenv + COMMAND ${CMAKE_COMMAND} -E copy ${VIRTUALENV_PATH} "${ivigenerator_install_dir}" + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/.stamp-deploy_virtualenv + ) + add_dependencies(ivigenerator copy_virtualenv) + endif() +endif() ##################################################################### ## .config file generation @@ -127,26 +155,6 @@ add_custom_target(generator SOURCES ## INSTALL Targets ##################################################################### -set(ivigenerator_install_dir "${CMAKE_INSTALL_PREFIX}/${INSTALL_BINDIR}/ivigenerator") -set(templates_install_dir "${ivigenerator_install_dir}/templates") -# qt_copy_or_install does the copying at configure time -# QT_WILL_INSTALL is the same variable which is used in qt_copy_or_install internally to determine -# whether installing or copying is needed -if(QT_WILL_INSTALL) - qt_install( - DIRECTORY - ${VIRTUALENV_PATH} - USE_SOURCE_PERMISSIONS - DESTINATION "${ivigenerator_install_dir}" - ) -else() - add_custom_target(copy_virtualenv - COMMAND ${CMAKE_COMMAND} -E copy ${VIRTUALENV_PATH} "${ivigenerator_install_dir}" - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/.stamp-deploy_virtualenv - ) - add_dependencies(ivigenerator copy_virtualenv) -endif() - qt_copy_or_install( FILES templates/common/generated_comment.cpp.tpl |