You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by cm...@apache.org on 2021/03/31 00:07:00 UTC

[qpid-interop-test] 31/41: QPIDIT-139: Improving install's detection of Python 2 and Python 3, preparing for swith to Python 3 tests. QPIDIT-135: Minor improvements to handling of Python 2 and Python 3 shims. The presence of PYTHON2PATH and PYTHON3PATH in env controls the running of the shims. QPIDIT-138: Minor improvements to messages during cmake run.

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

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 402fb98659e8244eddfac938ecc0db4f40edbbcc
Author: Kim van der Riet <kp...@apache.org>
AuthorDate: Fri Jan 17 12:17:33 2020 -0500

    QPIDIT-139: Improving install's detection of Python 2 and Python 3, preparing for swith to Python 3 tests. QPIDIT-135: Minor improvements to handling of Python 2 and Python 3 shims. The presence of PYTHON2PATH and PYTHON3PATH in env controls the running of the shims. QPIDIT-138: Minor improvements to messages during cmake run.
---
 CMakeLists.txt                             | 105 +++++++++++++++++++----------
 config.sh.in                               |  26 +++++--
 shims/amqpnetlite/src/CMakeLists.txt       |   8 +--
 src/python/qpid_interop_test/qit_common.py |  22 +++---
 src/python/qpid_interop_test/qit_shim.py   |   2 +
 5 files changed, 108 insertions(+), 55 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 48506a8..8cb607b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -23,37 +23,58 @@ cmake_minimum_required(VERSION 2.8.7 FATAL_ERROR)
 
 set (ErrorFlag FALSE)
 
-# Find xpath
-
-find_program(Xpath xpath)
-if (Xpath STREQUAL "Xpath-NOTFOUND")
-    message(WARNING "xpath not found")
+# Find Python
+# Older cmakes (2.8.x used on RHEL/CentOS 7) don't do Python2
+# vs Python3 cleanly. So we must improvise...
+MACRO (find_python
+       py_exec            # Python executable (eg python, python3)
+       found_var_name     # Variable name indicating python executable found
+       version_var_name   # Variable name containing python version
+       site_dir_var_name) # Variable name containing site_packages dir name
+    execute_process (COMMAND ${py_exec} --version
+                     RESULT_VARIABLE res
+                     OUTPUT_VARIABLE ov
+                     OUTPUT_STRIP_TRAILING_WHITESPACE
+                     ERROR_VARIABLE ev
+                     ERROR_STRIP_TRAILING_WHITESPACE)
+    if (res STREQUAL "0")
+        set (${found_var_name} ON)
+        # Some versions of Python print version info to stdout, others to stderr
+        if (ov STREQUAL "")
+            if (ev STREQUAL "")
+              message (WARNING "Unable to obtain python version string")
+            else ()
+              set(ov ${ev})
+            endif ()
+        endif ()
+        message (STATUS "${ov} found")
+        string (REGEX MATCH "[0-9]+(\\.[0-9]+)" ver_str "${ov}")
+        set (${version_var_name} ${ver_str})
+        string (REGEX MATCH "[0-9]+" maj_ver_str ${ver_str})
+        execute_process (COMMAND ${CMAKE_SOURCE_DIR}/get-python-dir-name ${maj_ver_str}
+                         OUTPUT_VARIABLE dir_name)
+        set (${site_dir_var_name} ${dir_name})
+    else ()
+        message (STATUS "${py_exec} not found")
+        set (${found_var_name} ${py_exec}-NOTFOUND)
+    endif ()
+ENDMACRO ()
+
+find_python(python "PYTHON2_FOUND" "PYTHON2_VER" "PYTHON2_SITE_DIR_NAME")
+# Python2 is required to run main QIT program
+if (NOT PYTHON2_FOUND)
+    message(STATUS "ERROR: Python 2.x not found, but is required")
     set (ErrorFlag TRUE)
-else ()
-    message(STATUS "xpath found: ${Xpath}")
 endif ()
-
-# Find Python 2.7.x install path
-
-find_package( PythonInterp 2.7 REQUIRED )
-execute_process(COMMAND ${CMAKE_SOURCE_DIR}/get-python-dir-name 2
-                OUTPUT_VARIABLE PYTHON2_DIR_NAME)
-message(STATUS "Python 2 install directory name: ${PYTHON2_DIR_NAME}")
-execute_process(COMMAND ${CMAKE_SOURCE_DIR}/get-python-dir-name 3
-                OUTPUT_VARIABLE PYTHON3_DIR_NAME)
-message(STATUS "Python 3 install directory name: ${PYTHON3_DIR_NAME}")
+find_python(python3 "PYTHON3_FOUND" "PYTHON3_VER" "PYTHON3_SITE_DIR_NAME")
 
 # Find Java
 
 find_package(Java 1.8 COMPONENTS Development)
 # RHEL7 bug: Java_FOUND is not being set, so workaround:
-if (DEFINED Java_JAVA_EXECUTABLE AND DEFINED Java_JAVAC_EXECUTABLE AND DEFINED Java_JAR_EXECUTABLE)
-    message(STATUS "Java ${Java_VERSION_STRING} found")
-    message(STATUS "Java executable: ${Java_JAVA_EXECUTABLE}")
-    message(STATUS "Java compiler: ${Java_JAVAC_EXECUTABLE}")
-    message(STATUS "Java archiver: ${Java_JAR_EXECUTABLE}")
-else ()
-    message(WARNING "Java compiler not found")
+#if (NOT DEFINED Java_JAVA_EXECUTABLE OR NOT DEFINED Java_JAVAC_EXECUTABLE OR NOT DEFINED Java_JAR_EXECUTABLE)
+if (NOT Java_FOUND)
+    message(STATUS "ERROR: Java compiler not found, but is required")
     set (ErrorFlag TRUE)
 endif ()
 
@@ -62,36 +83,52 @@ endif ()
 find_program(Maven mvn
              HINT /usr/local/maven/bin) # common location for local install
 if (Maven STREQUAL "Maven-NOTFOUND")
-    message (WARNING "Maven not found")
+    message (STATUS "ERROR: Maven not found, but is required")
     set (ErrorFlag TRUE)
 else ()
     message (STATUS "Maven found: ${Maven}")
 endif ()
 
+# Find xpath
+
+find_program(Xpath xpath)
+if (Xpath STREQUAL "Xpath-NOTFOUND")
+    message(STATUS "ERROR: xpath not found, but is required")
+    set (ErrorFlag TRUE)
+else ()
+    message(STATUS "xpath found: ${Xpath}")
+endif ()
+
 # Find Proton components
 
-find_package(Proton 0.17)
+find_package(Proton 0.30)
 if (Proton_FOUND)
     get_filename_component(PROTON_INSTALL_DIR ${Proton_INCLUDE_DIRS} PATH CACHE PATH "Proton install directory")
     message(STATUS "Qpid proton found. Version ${Proton_VERSION} at ${Proton_INCLUDE_DIRS}")
 else ()
-    message(WARNING "Qpid proton not found.")
+    message(STATUS "ERROR: Qpid proton not found, but is required")
     set (ErrorFlag TRUE)
 endif ()
 
-find_package(ProtonCpp 0.17)
+find_package(ProtonCpp 0.30)
 if (ProtonCpp_FOUND)
     get_filename_component(PROTON_CPP_INSTALL_DIR ${ProtonCpp_INCLUDE_DIRS} PATH CACHE PATH "ProtonCpp install directory")
     message(STATUS "Qpid proton c++ binding found. Version ${ProtonCpp_VERSION} at ${ProtonCpp_INCLUDE_DIRS}")
 else()
-    message(WARNING "Qpid proton c++ binding not found.")
+    message(STATUS "ERROR: Qpid proton c++ binding not found, but is required")
     set (ErrorFlag TRUE)
 endif ()
 
 if (ErrorFlag)
-    message(FATAL_ERROR "Required component(s) missing, aborting configuration.")
+    message(FATAL_ERROR "Required component(s) missing, aborting configuration. See above for errors.")
 endif ()
 
+add_subdirectory(shims/qpid-proton-cpp/src)
+add_subdirectory(shims/qpid-jms)
+add_subdirectory(shims/amqpnetlite/src)
+add_subdirectory(shims/rhea-js)
+add_subdirectory(docs)
+
 # Generate data code files for amqp_complex_types_test
 execute_process(COMMAND python3 src/python/qpid_interop_test/amqp_complex_types_test_generator.py --gen cpp --src-dir src/python/qpid_interop_test --gen-dir shims/qpid-proton-cpp/src/qpidit/amqp_complex_types_test
                               WORKING_DIRECTORY ../
@@ -125,12 +162,6 @@ if(NOT "${retcode}" STREQUAL "0")
     message(FATAL_ERROR "Data code file generation for .Net failed: ${retcode}")
 endif()
 
-add_subdirectory(shims/qpid-proton-cpp/src)
-add_subdirectory(shims/qpid-jms)
-add_subdirectory(shims/amqpnetlite/src)
-add_subdirectory(shims/rhea-js)
-add_subdirectory(docs)
-
 # Install files using python setup.py
 install(CODE "MESSAGE(STATUS \"Python install dir: ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON2_DIR_NAME}/site-packages/qpid_interop_test/\")")
 install(CODE "execute_process(COMMAND python setup.py install --prefix ${CMAKE_INSTALL_PREFIX}
@@ -152,4 +183,4 @@ install(CODE "execute_process(COMMAND ln -s ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON
 install(CODE "execute_process(COMMAND bash -c \"chmod +x *_test.py\"
                               WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON2_DIR_NAME}/site-packages/qpid_interop_test/)")
 
-configure_file(config.sh.in config.sh)
+configure_file(config.sh.in config.sh @ONLY)
diff --git a/config.sh.in b/config.sh.in
index f7bd3c2..a159a50 100644
--- a/config.sh.in
+++ b/config.sh.in
@@ -1,3 +1,5 @@
+#! /bin/bash
+
 #  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.
@@ -18,14 +20,26 @@
 
 export QPID_INTEROP_TEST_HOME=@CMAKE_SOURCE_DIR@
 export QIT_INSTALL_PREFIX=@CMAKE_INSTALL_PREFIX@
-CURRENT_PYTHONPATH=$PYTHONPATH
-export PYTHONPATH=@CMAKE_INSTALL_PREFIX@/lib64/proton/bindings/python:@CMAKE_INSTALL_PREFIX@/lib/@PYTHON2_DIR_NAME@/site-packages:@CMAKE_INSTALL_PREFIX@/libexec/qpid_interop_test/shims/qpid-proton-python:$CURRENT_PYTHONPATH
-if [[ "@PYTHON3_DIR_NAME@" == "NOT_FOUND" ]]; then
-    unset PYTHON3PATH
+
+# Set PYTHON2PATH and PYTHON3PATH for respective python shims
+
+unset PYTHON2PATH
+py2_found_str="@PYTHON2_FOUND@"
+if [[ "${py2_found_str#*-}" == "NOTFOUND" ]]; then
+    echo "No Python 2.x found, Python 2 shims disabled"
+else
+    export PYTHON2PATH=@CMAKE_INSTALL_PREFIX@/lib64/proton/bindings/python:@CMAKE_INSTALL_PREFIX@/lib/@PYTHON2_SITE_DIR_NAME@/site-packages:@CMAKE_INSTALL_PREFIX@/libexec/qpid_interop_test/shims/qpid-proton-python
+fi
+
+unset PYTHON3PATH
+py3_found_str="@PYTHON3_FOUND@"
+if [[ "${py3_found_str#*-}" == "NOTFOUND" ]]; then
     echo "No Python 3.x found, Python 3 shims disabled"
 else
-    CURRENT_PYTHON3PATH=$PYTHON3PATH
-    export PYTHON3PATH=@CMAKE_INSTALL_PREFIX@/lib64/proton/bindings/python3:@CMAKE_INSTALL_PREFIX@/lib/@PYTHON3_DIR_NAME@/site-packages:@CMAKE_INSTALL_PREFIX@/libexec/qpid_interop_test/shims/qpid-proton-python:$CURRENT_PYTHON3PATH
+    export PYTHON3PATH=@CMAKE_INSTALL_PREFIX@/lib64/proton/bindings/python3:@CMAKE_INSTALL_PREFIX@/lib/@PYTHON3_SITE_DIR_NAME@/site-packages:@CMAKE_INSTALL_PREFIX@/libexec/qpid_interop_test/shims/qpid-proton-python
 fi
+# To run the main program use python 2
+export PYTHONPATH=$PYTHON2PATH
+
 export LD_LIBRARY_PATH=@CMAKE_INSTALL_PREFIX@/lib64:$LD_LIBRARY_PATH
 export PATH=@CMAKE_INSTALL_PREFIX@/lib/@PYTHON_DIR_NAME@/site-packages/qpid_interop_test:$PATH
diff --git a/shims/amqpnetlite/src/CMakeLists.txt b/shims/amqpnetlite/src/CMakeLists.txt
index c01b8dd..49db295 100644
--- a/shims/amqpnetlite/src/CMakeLists.txt
+++ b/shims/amqpnetlite/src/CMakeLists.txt
@@ -108,21 +108,21 @@ set(BUILD_CONFIG Release) # Debug or Release
 # 1. Find dotnet
 find_program(DOTNET dotnet)
 if (DOTNET STREQUAL "DOTNET-NOTFOUND")
-  message(STATUS "Program 'dotnet' not found.")
+  message(STATUS "dotnet not found.")
   set(build_amqpnetlite_default OFF)
 else()
   # 2. dotnet found. Check required version exists
   execute_process(COMMAND dotnet --version OUTPUT_VARIABLE ov)
   if("${ov}" STREQUAL "")
-    message(STATUS "'dotnet' appears to be installed but version is not detected. 'dotnet' version ${REQUIRED_DOTNET_VERSION} required.")
+    message(STATUS "dotnet appears to be installed but version is not detected. dotnet version ${REQUIRED_DOTNET_VERSION} required.")
     set(build_amqpnetlite_default OFF)
   else()
     # 3. dotnet version string obtained, isolate version number as string, check version requirement
     string(REGEX MATCH "[0-9]+(\\.[0-9]+)" dotnet_ver "${ov}")
     if (${dotnet_ver} VERSION_EQUAL "${REQUIRED_DOTNET_VERSION}")
-      message(STATUS  "'dotnet' version ${dotnet_ver} found.")
+      message(STATUS  "dotnet version ${dotnet_ver} found.")
     else()
-      message(STATUS "'dotnet' version ${dotnet_ver} found. 'dotnet' version ${REQUIRED_DOTNET_VERSION} required.")
+      message(STATUS "dotnet version ${dotnet_ver} found. dotnet version ${REQUIRED_DOTNET_VERSION} required.")
       set(build_amqpnetlite_default OFF)
     endif()
   endif()
diff --git a/src/python/qpid_interop_test/qit_common.py b/src/python/qpid_interop_test/qit_common.py
index bd066da..675bcd0 100644
--- a/src/python/qpid_interop_test/qit_common.py
+++ b/src/python/qpid_interop_test/qit_common.py
@@ -37,6 +37,7 @@ QIT_INSTALL_PREFIX = getenv('QIT_INSTALL_PREFIX')
 if QIT_INSTALL_PREFIX is None:
     print('ERROR: Environment variable QIT_INSTALL_PREFIX is not set')
     sys.exit(1)
+QIT_ENABLE_PYTHON2_SHIM = getenv('PYTHON2PATH') is not None
 QIT_ENABLE_PYTHON3_SHIM = getenv('PYTHON3PATH') is not None
 QIT_TEST_SHIM_HOME = path.join(QIT_INSTALL_PREFIX, 'libexec', 'qpid_interop_test', 'shims')
 
@@ -312,21 +313,26 @@ class QitTest(object):
 
     def _create_shim_map(self):
         """Create a shim map {'shim_name': <shim_instance>}"""
+        # Proton C++ shim
         proton_cpp_rcv_shim = path.join(QIT_TEST_SHIM_HOME, 'qpid-proton-cpp', self.TEST_NAME, 'Receiver')
         proton_cpp_snd_shim = path.join(QIT_TEST_SHIM_HOME, 'qpid-proton-cpp', self.TEST_NAME, 'Sender')
-        proton_python_rcv_shim = path.join(QIT_TEST_SHIM_HOME, 'qpid-proton-python', self.TEST_NAME, 'Receiver.py')
-        proton_python_snd_shim = path.join(QIT_TEST_SHIM_HOME, 'qpid-proton-python', self.TEST_NAME, 'Sender.py')
-
         self.shim_map = {qpid_interop_test.qit_shim.ProtonCppShim.NAME: \
                          qpid_interop_test.qit_shim.ProtonCppShim(proton_cpp_snd_shim, proton_cpp_rcv_shim),
-                         qpid_interop_test.qit_shim.ProtonPython2Shim.NAME: \
-                         qpid_interop_test.qit_shim.ProtonPython2Shim(proton_python_snd_shim, proton_python_rcv_shim),
-#                         qpid_interop_test.qit_shim.ProtonPython3Shim.NAME: \
-#                         qpid_interop_test.qit_shim.ProtonPython3Shim(proton_python_snd_shim, proton_python_rcv_shim),
                         }
+
+        # Python shims
+        proton_python_rcv_shim = path.join(QIT_TEST_SHIM_HOME, 'qpid-proton-python', self.TEST_NAME, 'Receiver.py')
+        proton_python_snd_shim = path.join(QIT_TEST_SHIM_HOME, 'qpid-proton-python', self.TEST_NAME, 'Sender.py')
+        if QIT_ENABLE_PYTHON2_SHIM:
+            self.shim_map[qpid_interop_test.qit_shim.ProtonPython2Shim.NAME] = \
+                qpid_interop_test.qit_shim.ProtonPython2Shim(proton_python_snd_shim, proton_python_rcv_shim)
+        else:
+            print('Python 2 shim disabled: no PYTHON2PATH in environment')
         if QIT_ENABLE_PYTHON3_SHIM:
             self.shim_map[qpid_interop_test.qit_shim.ProtonPython3Shim.NAME] = \
                 qpid_interop_test.qit_shim.ProtonPython3Shim(proton_python_snd_shim, proton_python_rcv_shim)
+        else:
+            print('Python 3 shim disabled: no PYTHON3PATH in environment')
 
         # Add shims that need detection during installation only if the necessary bits are present
         # Rhea Javascript client
@@ -348,7 +354,7 @@ class QitTest(object):
             print('WARNING: AMQP DotNetLite shims not found')
 
     def _modify_shim_map(self):
-        """Modify shim_map based on args"""
+        """Modify shim_map based on command-line args --include-shim or --exclude-shim"""
         # Use only shims included from the command-line
         if self.args.include_shim is not None:
             temp_shim_map = {}
diff --git a/src/python/qpid_interop_test/qit_shim.py b/src/python/qpid_interop_test/qit_shim.py
index 4cdb639..1a4ea97 100644
--- a/src/python/qpid_interop_test/qit_shim.py
+++ b/src/python/qpid_interop_test/qit_shim.py
@@ -38,6 +38,8 @@ class ShimProcess(subprocess.Popen):
         self.env = copy.deepcopy(os.environ)
         if python3_flag:
             self.env['PYTHONPATH'] = self.env['PYTHON3PATH']
+        else:
+            self.env['PYTHONPATH'] = self.env['PYTHON2PATH']
         super(ShimProcess, self).__init__(params, stdout=subprocess.PIPE, stderr=subprocess.PIPE, preexec_fn=os.setsid,
                                           env=self.env)
 

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org