diff --git a/CMakeLists.txt b/CMakeLists.txt index 395cd7f36e..4feaee90fe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,9 +57,7 @@ list(REMOVE_DUPLICATES OPM_COMPILE_COMPONENTS) # this will be used in a template argument pack. string(REPLACE ";" "," OPM_COMPILE_COMPONENTS_TEMPLATE_LIST "${OPM_COMPILE_COMPONENTS}") - -# HIP requires cmake version 3.21 -if (CONVERT_CUDA_TO_HIP AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.21") +if(CONVERT_CUDA_TO_HIP) enable_language(HIP) message("CUDA code will be hipified") set(HAVE_CUDA 1) # we still need this defined so that the preprocessor does not remove the code @@ -82,8 +80,6 @@ if (CONVERT_CUDA_TO_HIP AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.21") else() message(FATAL_ERROR "hipify-perl required to convert CUDA to HIP not found") endif() -elseif(CONVERT_CUDA_TO_HIP) - message("To generate HIP code for AMD GPUs run CMake with version >= 3.21") endif() if(SIBLING_SEARCH AND NOT opm-common_DIR) @@ -117,29 +113,11 @@ find_package(opm-common REQUIRED) # The following was copied from CMakeLists.txt in opm-common. # TODO: factor out the common parts in opm-common and opm-simulator as a cmake module if (OPM_ENABLE_PYTHON) - # We need to be compatible with older CMake versions - # that do not offer FindPython3 - # e.g. Ubuntu LTS 18.04 uses cmake 3.10 - if(${CMAKE_VERSION} VERSION_LESS "3.12.0") - find_package(PythonInterp REQUIRED) - if(PYTHON_VERSION_MAJOR LESS 3) - message(SEND_ERROR "OPM requires version 3 of Python but only version ${PYTHON_VERSION_STRING} was found") - endif() + # Be backwards compatible. + if(PYTHON_EXECUTABLE AND NOT Python3_EXECUTABLE) set(Python3_EXECUTABLE ${PYTHON_EXECUTABLE}) - set(Python3_LIBRARIES ${PYTHON_LIBRARIES}) - set(Python3_VERSION "${PYTHON_VERSION_STRING}") - set(Python3_VERSION_MINOR ${PYTHON_VERSION_MINOR}) - else() - # Be backwards compatible. - if(PYTHON_EXECUTABLE AND NOT Python3_EXECUTABLE) - set(Python3_EXECUTABLE ${PYTHON_EXECUTABLE}) - endif() - if(${CMAKE_VERSION} VERSION_LESS "3.18.0") - find_package(Python3 REQUIRED COMPONENTS Interpreter Development) - else() - find_package(Python3 REQUIRED COMPONENTS Interpreter Development.Module Development.Embed) - endif() endif() + find_package(Python3 REQUIRED COMPONENTS Interpreter Development.Module Development.Embed) if(Python3_VERSION_MINOR LESS 3) # Python native namespace packages requires python >= 3.3 message(SEND_ERROR "OPM requires python >= 3.3 but only version ${Python3_VERSION} was found") @@ -149,10 +127,6 @@ if (OPM_ENABLE_PYTHON) if(NOT pybind11_FOUND) include(DownloadPyBind11) endif() - - # Compatibility settings for PythonInterp and PythonLibs - # used e.g. in FindCwrap, pybind11 - set(PYTHON_EXECUTABLE ${Python3_EXECUTABLE}) endif() include(OpmInit) @@ -182,16 +156,8 @@ include ("${project}-prereqs") # Make sure we are using the same compiler underneath # NVCC as for the rest. In the case that NVCC does not support -# that compiler it will error out. Unfortunately this will only -# work for CMake >= 3.8. We found no way to make FindCUDA.cmake error -# out. It seems to ignore CMAKE_NVCC_FLAGS and CMAKE. Additionally -# our way of specifying cuda source files never worked for CMake -# version < 3.8. Hence we deactivate cuda for these versions. -# We use "CMAKE_VERSION VERSION_GREATER 3.7.9" instead of -# CMAKE_VERSION VERSION_GREATER_EQUAL 3.8, because of backwards -# compatibility to cmake 3.6 and lower. -if(NOT CMAKE_DISABLE_FIND_PACKAGE_CUDA AND - CMAKE_VERSION VERSION_GREATER 3.7.9) +# that compiler it will error out. +if(NOT CMAKE_DISABLE_FIND_PACKAGE_CUDA) if(CMAKE_BUILD_TYPE) set(_flags_suffix "_${CMAKE_BUILD_TYPE}") endif() diff --git a/python/simulators/CMakeLists.txt b/python/simulators/CMakeLists.txt index 936ad77f38..8ee2a3bf90 100644 --- a/python/simulators/CMakeLists.txt +++ b/python/simulators/CMakeLists.txt @@ -5,9 +5,7 @@ set(PYTHON_DOCSTRINGS_FILE "${PROJECT_SOURCE_DIR}/python/docstrings_simulators.j set(PYTHON_DOCSTRINGS_GENERATED_HPP "${PROJECT_BINARY_DIR}/python/PyBlackOilSimulatorDoc.hpp") set(PYTHON_GW_DOCSTRINGS_GENERATED_HPP "${PROJECT_BINARY_DIR}/python/PyGasWaterSimulatorDoc.hpp") set(PYTHON_OP_DOCSTRINGS_GENERATED_HPP "${PROJECT_BINARY_DIR}/python/PyOnePhaseSimulatorDoc.hpp") -# Note: If the new find_package(Python3) is used in the top level CMakeLists.txt, the variable -# ${PYTHON_EXECUTABLE} is set there to ${Python3_EXECUTABLE} -# + # Command to run the Python script find_file(PYTHON_GENERATE_DOCSTRINGS_PY generate_docstring_hpp.py @@ -15,28 +13,55 @@ find_file(PYTHON_GENERATE_DOCSTRINGS_PY generate_docstring_hpp.py PATH_SUFFIXES python NO_DEFAULT_PATH REQUIRED) add_custom_command( - OUTPUT ${PYTHON_DOCSTRINGS_GENERATED_HPP} - COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH=${CMAKE_SOURCE_DIR} - ${PYTHON_EXECUTABLE} ${PYTHON_GENERATE_DOCSTRINGS_PY} - ${PYTHON_DOCSTRINGS_FILE} ${PYTHON_DOCSTRINGS_GENERATED_HPP} PYBLACKOILSIMULATORDOC_HPP "Opm::Pybind::DocStrings" "BlackOil" - DEPENDS ${PYTHON_DOCSTRINGS_FILE} - COMMENT "Generating PyBlackOilSimulatorDoc.hpp from JSON file" + OUTPUT + ${PYTHON_DOCSTRINGS_GENERATED_HPP} + COMMAND + ${CMAKE_COMMAND} -E env PYTHONPATH=${CMAKE_SOURCE_DIR} + $ + ${PYTHON_GENERATE_DOCSTRINGS_PY} + ${PYTHON_DOCSTRINGS_FILE} + ${PYTHON_DOCSTRINGS_GENERATED_HPP} + PYBLACKOILSIMULATORDOC_HPP + "Opm::Pybind::DocStrings" + "BlackOil" + DEPENDS + ${PYTHON_DOCSTRINGS_FILE} + COMMENT + "Generating PyBlackOilSimulatorDoc.hpp from JSON file" ) add_custom_command( - OUTPUT ${PYTHON_GW_DOCSTRINGS_GENERATED_HPP} - COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH=${CMAKE_SOURCE_DIR} - ${PYTHON_EXECUTABLE} ${PYTHON_GENERATE_DOCSTRINGS_PY} - ${PYTHON_DOCSTRINGS_FILE} ${PYTHON_GW_DOCSTRINGS_GENERATED_HPP} PYGASWATERSIMULATORDOC_HPP "Opm::Pybind::DocStrings" "GasWater" - DEPENDS ${PYTHON_DOCSTRINGS_FILE} - COMMENT "Generating PyGasWaterSimulatorDoc.hpp from JSON file" + OUTPUT + ${PYTHON_GW_DOCSTRINGS_GENERATED_HPP} + COMMAND + ${CMAKE_COMMAND} -E env PYTHONPATH=${CMAKE_SOURCE_DIR} + $ + ${PYTHON_GENERATE_DOCSTRINGS_PY} + ${PYTHON_DOCSTRINGS_FILE} + ${PYTHON_GW_DOCSTRINGS_GENERATED_HPP} + PYGASWATERSIMULATORDOC_HPP + "Opm::Pybind::DocStrings" + "GasWater" + DEPENDS + ${PYTHON_DOCSTRINGS_FILE} + COMMENT + "Generating PyGasWaterSimulatorDoc.hpp from JSON file" ) add_custom_command( - OUTPUT ${PYTHON_OP_DOCSTRINGS_GENERATED_HPP} - COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH=${CMAKE_SOURCE_DIR} - ${PYTHON_EXECUTABLE} ${PYTHON_GENERATE_DOCSTRINGS_PY} - ${PYTHON_DOCSTRINGS_FILE} ${PYTHON_OP_DOCSTRINGS_GENERATED_HPP} PYONEPHASESIMULATORDOC_HPP "Opm::Pybind::DocStrings" "OnePhase" - DEPENDS ${PYTHON_DOCSTRINGS_FILE} - COMMENT "Generating PyOnePhaseSimulatorDoc.hpp from JSON file" + OUTPUT + ${PYTHON_OP_DOCSTRINGS_GENERATED_HPP} + COMMAND + ${CMAKE_COMMAND} -E env PYTHONPATH=${CMAKE_SOURCE_DIR} + $ + ${PYTHON_GENERATE_DOCSTRINGS_PY} + ${PYTHON_DOCSTRINGS_FILE} + ${PYTHON_OP_DOCSTRINGS_GENERATED_HPP} + PYONEPHASESIMULATORDOC_HPP + "Opm::Pybind::DocStrings" + "OnePhase" + DEPENDS + ${PYTHON_DOCSTRINGS_FILE} + COMMENT + "Generating PyOnePhaseSimulatorDoc.hpp from JSON file" ) # NOTE: The variable ${PYBIND11_SYSTEM} is set in python/CMakeLists.txt # to the value "SYSTEM" or unset, depending on the current version of Pybind11. @@ -87,12 +112,24 @@ find_file(PYTHON_INSTALL_PY install.py # update the files if they have been modified. We use the install.py script in opm-common, see also # CMakeLists.txt in opm-common add_custom_target(copy_python ALL - COMMAND ${PYTHON_EXECUTABLE} "${PYTHON_INSTALL_PY}" - ${PROJECT_SOURCE_DIR}/python/opm ${PROJECT_BINARY_DIR}/python 0 - COMMAND ${PYTHON_EXECUTABLE} "${PYTHON_INSTALL_PY}" - ${PROJECT_SOURCE_DIR}/python/test ${PROJECT_BINARY_DIR}/python 0 - COMMAND ${PYTHON_EXECUTABLE} "${PYTHON_INSTALL_PY}" - ${PROJECT_SOURCE_DIR}/python/test_data ${PROJECT_BINARY_DIR}/python 0 + COMMAND + $ + "${PYTHON_INSTALL_PY}" + ${PROJECT_SOURCE_DIR}/python/opm + ${PROJECT_BINARY_DIR}/python + 0 + COMMAND + $ + "${PYTHON_INSTALL_PY}" + ${PROJECT_SOURCE_DIR}/python/test + ${PROJECT_BINARY_DIR}/python + 0 + COMMAND + $ + "${PYTHON_INSTALL_PY}" + ${PROJECT_SOURCE_DIR}/python/test_data + ${PROJECT_BINARY_DIR}/python + 0 ) foreach(target_name IN ITEMS BlackOil GasWater OnePhase) @@ -114,72 +151,94 @@ foreach(target_name IN ITEMS BlackOil GasWater OnePhase) if (OPM_INSTALL_PYTHON) include(PyInstallPrefix) # from opm-common install( - TARGETS ${target_name} - DESTINATION ${DEST_PREFIX}${CMAKE_INSTALL_PREFIX}/${PYTHON_INSTALL_PREFIX}/opm + TARGETS + ${target_name} + DESTINATION + ${DEST_PREFIX}${CMAKE_INSTALL_PREFIX}/${PYTHON_INSTALL_PREFIX}/opm ) install( CODE "execute_process( - COMMAND ${PYTHON_EXECUTABLE} - ${PYTHON_INSTALL_PY} - ${PROJECT_BINARY_DIR}/python/opm - ${DEST_PREFIX}${CMAKE_INSTALL_PREFIX}/${PYTHON_INSTALL_PREFIX} 1)" + COMMAND + $ + ${PYTHON_INSTALL_PY} + ${PROJECT_BINARY_DIR}/python/opm + ${DEST_PREFIX}${CMAKE_INSTALL_PREFIX}/${PYTHON_INSTALL_PREFIX} + 1 + )" ) endif() endforeach() -execute_process(COMMAND ${PYTHON_EXECUTABLE} -c " -import site, sys -try: - sys.stdout.write(site.getsitepackages()[-1]) -except e: - sys.stdout.write('')" OUTPUT_VARIABLE PYTHON_SITE_PACKAGES_PATH) - -if (PYTHON_SITE_PACKAGES_PATH MATCHES ".*/dist-packages/?" AND - CMAKE_INSTALL_PREFIX MATCHES "^/usr.*") - # dist-packages is only used if we install below /usr and python's site packages - # path matches dist-packages - set(PYTHON_PACKAGE_PATH "dist-packages") -else() - set(PYTHON_PACKAGE_PATH "site-packages") -endif() - +include(PyInstallPrefix) if(OPM_ENABLE_PYTHON_TESTS) - set(PYTHON_PATH ${PROJECT_BINARY_DIR}/python:${opm-common_DIR}/python:$ENV{PYTHONPATH}) set(cases basic fluidstate_variables primary_variables schedule throw) if(MPI_FOUND) list(APPEND cases mpi) endif() # Create a fixture test that builds Python modules before running Python tests - add_test(NAME python_modules_build - COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target python_tests) - set_tests_properties(python_modules_build PROPERTIES FIXTURES_SETUP python_modules_fixture) + add_test( + NAME + python_modules_build + COMMAND + ${CMAKE_COMMAND} + --build ${CMAKE_BINARY_DIR} + --target python_tests + ) + set_tests_properties(python_modules_build + PROPERTIES + FIXTURES_SETUP + python_modules_fixture + ) # NOTE: See comment in test_basic.py for the reason why we are # splitting the python tests into multiple add_test() tests instead # of having a single "python -m unittest" test call that will run all # the tests in the "test" sub directory. foreach(case_name IN ITEMS ${cases}) - add_test(NAME python_${case_name} - WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/python - COMMAND ${CMAKE_COMMAND} - -E env PYTHONPATH=${PYTHON_PATH} ${PYTHON_EXECUTABLE} - -m unittest test/test_${case_name}.py) - set_tests_properties(python_${case_name} PROPERTIES - FIXTURES_REQUIRED python_modules_fixture) + add_test( + NAME + python_${case_name} + WORKING_DIRECTORY + ${PROJECT_BINARY_DIR}/python + COMMAND + $ + -m unittest + test/test_${case_name}.py + ) + set(env_mod + PYTHONPATH=path_list_prepend:${PROJECT_BINARY_DIR}/python + PYTHONPATH=path_list_prepend:${opm-common_DIR}/python + ) + set_tests_properties(python_${case_name} + PROPERTIES + ENVIRONMENT_MODIFICATION + "${env_mod}" + FIXTURES_REQUIRED + python_modules_fixture + ) endforeach() endif() -file(COPY ${PROJECT_SOURCE_DIR}/python/opm/CMakeLists.txt DESTINATION ${PROJECT_BINARY_DIR}/python) -file(COPY ${PROJECT_SOURCE_DIR}/python/requirements.txt DESTINATION ${PROJECT_BINARY_DIR}/python) -file(COPY ${PROJECT_SOURCE_DIR}/python/README.md DESTINATION ${PROJECT_BINARY_DIR}/python) -file(COPY ${PROJECT_SOURCE_DIR}/python/MANIFEST.in DESTINATION ${PROJECT_BINARY_DIR}/python) -file(COPY ${PROJECT_SOURCE_DIR}/python/pyproject.toml DESTINATION ${PROJECT_BINARY_DIR}/python) +file( + COPY + ${PROJECT_SOURCE_DIR}/python/opm/CMakeLists.txt + ${PROJECT_SOURCE_DIR}/python/requirements.txt + ${PROJECT_SOURCE_DIR}/python/README.md + ${PROJECT_SOURCE_DIR}/python/MANIFEST.in + ${PROJECT_SOURCE_DIR}/python/pyproject.toml + DESTINATION + ${PROJECT_BINARY_DIR}/python +) set(opm-simulators_PYTHON_PACKAGE_VERSION ${OPM_PYTHON_PACKAGE_VERSION_TAG}) # Generate versioned setup.py configure_file(${PROJECT_SOURCE_DIR}/python/setup.py.in ${PROJECT_BINARY_DIR}/python/setup.py.tmp @ONLY) -file(GENERATE OUTPUT ${PROJECT_BINARY_DIR}/python/setup.py - INPUT ${PROJECT_BINARY_DIR}/python/setup.py.tmp) +file(GENERATE + OUTPUT + ${PROJECT_BINARY_DIR}/python/setup.py + INPUT + ${PROJECT_BINARY_DIR}/python/setup.py.tmp +)