Установка переменной среды с помощью CMake перед вызовом Python в виртуальной среде для установки пакетов - PullRequest
0 голосов
/ 03 апреля 2020

Я использую CMake для автоматизации установки Python проекта, использующего MPI и основанного на PETS c. До сих пор мне удалось проверить MPI и Python3, а затем создать виртуальную среду, в которой будут установлены все пакеты. Я также устанавливаю их автоматически, читая пакеты, указанные в файле setup.py. Пока у меня есть две проблемы:

  1. В некоторых пакетах Python требуется установка переменных среды. Например, petsc использует переменные среды PETSC_CONFIGURE_OPTIONS для настройки установки.
  2. Мне не удается установить основной проект в виртуальной среде. Я получаю сообщение об ошибке

    Not uninstalling plexus at /Users/aaragon/Local/plexus, outside environment /Users/aaragon/Local/plexus/build/temp.macosx-10.15-x86_64-2.7/.venv
    

    , потому что я установил в своей оболочке не устанавливать пакеты python, если я не нахожусь в виртуальной среде.

Мне удалось решить 1. но я не думаю, что решение элегантно, и я не уверен, что оно будет работать в других системах. Каким-то образом я думаю, что функция set должна работать (см. MWE ниже), но я только что закончил установку COMMAND export VAR="asdf" перед вызовом pip. Для 2. У меня до сих пор нет никаких потенциальных клиентов. Могу ли я выполнить команду, которая переводит меня в виртуальную среду для установки основного пакета? как мне это сделать?

Это код в моем CMakeLists.txt:

cmake_minimum_required(VERSION 3.1)
if(${CMAKE_VERSION} VERSION_LESS 3.15)
    cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
else()
    cmake_policy(VERSION 3.15)
endif()

enable_testing()

project(plexus VERSION 0.1)

# find MPI
find_package(MPI REQUIRED)
if (NOT MPI_FOUND)
  message(FATAL_ERROR "MPI not found in the system!")
endif()

set(CMAKE_CXX_COMPILE_FLAGS ${CMAKE_CXX_COMPILE_FLAGS} ${MPI_COMPILE_FLAGS})
set(CMAKE_CXX_LINK_FLAGS ${CMAKE_CXX_LINK_FLAGS} ${MPI_LINK_FLAGS})
include_directories(MPI_INCLUDE_PATH)

# set environmental variables
set(ENV{PETSC_CONFIGURE_OPTIONS} "\"--with-fc=0 --download-metis=1 --download-parmetis=1\"") # this should 

# find Python
find_package (Python3 COMPONENTS Interpreter Development REQUIRED)
set(ignoreMe "${PYTHON_EXECUTABLE}") # get rid of CMake warning for not used variable

# Generate the virtual environment
add_custom_command(
    OUTPUT venv
    COMMAND ${Python3_EXECUTABLE} -m venv .venv
)
add_custom_command(
    OUTPUT venv.stamp
    DEPENDS venv ${PROJECT_SOURCE_DIR}/requirements.txt
    COMMAND export PETSC_CONFIGURE_OPTIONS=\"--with-fc=0 --download-metis=1 --download-parmetis=1\" && .venv/bin/pip install -e ${CMAKE_CURRENT_SOURCE_DIR} --upgrade
)

# Build command line to run py.test.
set(PYTEST
    ${CMAKE_CURRENT_BINARY_DIR}/.venv/bin/python3
    ${CMAKE_CURRENT_BINARY_DIR}/.venv/bin/py.test
)

add_custom_target(Tests ALL
    DEPENDS venv.stamp
    SOURCES requirements.txt
)

add_test(NAME run_tests
    COMMAND ${PYTEST} ${CMAKE_CURRENT_SOURCE_DIR}/test_sample.py
)
...