blob: 0622f31db346ebebb57fe28b4e98e8a86d4dfdda [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.
#
project(qpid-interop-test)
cmake_minimum_required(VERSION 2.8.7 FATAL_ERROR)
set (ErrorFlag FALSE)
# 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)
endif ()
find_python(python3 "PYTHON3_FOUND" "PYTHON3_VER" "PYTHON3_SITE_DIR_NAME")
# Find Java
find_package(Java 1.8 COMPONENTS Development)
# if (NOT Java_FOUND)
# RHEL7 bug: Java_FOUND is not being set, so workaround:
if (NOT DEFINED Java_JAVA_EXECUTABLE OR NOT DEFINED Java_JAVAC_EXECUTABLE OR NOT DEFINED Java_JAR_EXECUTABLE)
message(STATUS "ERROR: Java compiler not found, but is required")
set (ErrorFlag TRUE)
endif ()
# Find Maven
find_program(Maven mvn
HINT /usr/local/maven/bin) # common location for local install
if (Maven STREQUAL "Maven-NOTFOUND")
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.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(STATUS "ERROR: Qpid proton not found, but is required")
set (ErrorFlag TRUE)
endif ()
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(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. 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 ../
RESULT_VARIABLE retcode
)
if(NOT "${retcode}" STREQUAL "0")
message(FATAL_ERROR "Data code file generation for C++ failed: ${retcode}")
endif()
execute_process(COMMAND python3 src/python/qpid_interop_test/amqp_complex_types_test_generator.py --gen python --src-dir src/python/qpid_interop_test --gen-dir shims/qpid-proton-python/src/amqp_complex_types_test
WORKING_DIRECTORY ../
RESULT_VARIABLE retcode
)
if(NOT "${retcode}" STREQUAL "0")
message(FATAL_ERROR "Data code file generation for Python failed: ${retcode}")
endif()
execute_process(COMMAND python3 src/python/qpid_interop_test/amqp_complex_types_test_generator.py --gen javascript --src-dir src/python/qpid_interop_test --gen-dir shims/rhea-js/amqp_complex_types_test
WORKING_DIRECTORY ../
RESULT_VARIABLE retcode
)
if(NOT "${retcode}" STREQUAL "0")
message(FATAL_ERROR "Data code file generation for JavaScript failed: ${retcode}")
endif()
execute_process(COMMAND python3 src/python/qpid_interop_test/amqp_complex_types_test_generator.py --gen dotnet --src-dir src/python/qpid_interop_test --gen-dir shims/amqpnetlite/src/amqp_complex_types_test
WORKING_DIRECTORY ../
RESULT_VARIABLE retcode
)
if(NOT "${retcode}" STREQUAL "0")
message(FATAL_ERROR "Data code file generation for .Net failed: ${retcode}")
endif()
# 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}
WORKING_DIRECTORY ../)")
# This section is temporary - make links from python3.x site-packages dir to python2.7 files needed by shims
# when running under Python 3.x.
install(CODE "MESSAGE(STATUS \"Python install dir: ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON3_DIR_NAME}/site-packages/qpid_interop_test/\")")
install(CODE "execute_process(COMMAND mkdir -p ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON3_DIR_NAME}/site-packages/qpid_interop_test/
WORKING_DIRECTORY ../)")
install(CODE "execute_process(COMMAND ln -s ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON2_DIR_NAME}/site-packages/qpid_interop_test/qit_errors.py
${CMAKE_INSTALL_PREFIX}/lib/${PYTHON3_DIR_NAME}/site-packages/qpid_interop_test/qit_errors.py)")
install(CODE "execute_process(COMMAND ln -s ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON2_DIR_NAME}/site-packages/qpid_interop_test/qit_jms_types.py
${CMAKE_INSTALL_PREFIX}/lib/${PYTHON3_DIR_NAME}/site-packages/qpid_interop_test/qit_jms_types.py)")
# TODO: THIS IS UGLY!
# Find a way to handle this as part of the Python install process instead
# Set the following Python scripts to executable:
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 @ONLY)