Skip to content

Commit

Permalink
VENV: install python virtualenv with ruamel and fypp
Browse files Browse the repository at this point in the history
  • Loading branch information
awnawab committed May 4, 2024
1 parent 72900f6 commit a3fcd75
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 20 deletions.
24 changes: 8 additions & 16 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,6 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
################################################################################################
# options & dependencies

ecbuild_find_python( VERSION 3.4 REQUIRED NO_LIBS )

### Fortran ...
ecbuild_enable_fortran( REQUIRED MODULE_DIRECTORY ${PROJECT_BINARY_DIR}/module )

Expand Down Expand Up @@ -116,19 +114,17 @@ endif()
set( FCKIT_LIBRARIES fckit )

################################################################################################
# find fypp
# find and install python packages
include( fckit_install_venv )

find_program(FYPP fypp)
if( FYPP )
ecbuild_info("fckit found fypp: ${FYPP}")
endif()
# install python venv with rumael.yaml and fypp
set( install_permissions OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE )
fckit_install_venv()

################################################################################################
# sources

if( NOT FYPP )
set( FYPP ${CMAKE_CURRENT_SOURCE_DIR}/tools/fckit-eval.sh ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/fckit-fypp.py )
endif()
set( FCTEST_GENERATOR ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/fctest-generate-runner.py )
set( FCTEST_GENERATOR ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/fctest-generate-runner.py )
include( fckit_preprocess_fypp )
include( add_fctest )

Expand All @@ -148,16 +144,12 @@ if( ECBUILD_INSTALL_FORTRAN_MODULES )
endif()
if( NOT PROJECT_NAME STREQUAL CMAKE_PROJECT_NAME )
set( FCTEST_GENERATOR ${FCTEST_GENERATOR} PARENT_SCOPE )
if( NOT FYPP )
set( FYPP ${FYPP} PARENT_SCOPE )
endif()
set( FYPP ${FYPP} PARENT_SCOPE )
endif()
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/add_fctest.cmake ADD_FCTEST)
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/fckit_preprocess_fypp.cmake FCKIT_PREPROCESS_FYPP )

set( install_permissions OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE )
install( FILES tools/fctest-generate-runner.py DESTINATION libexec PERMISSIONS ${install_permissions} )
install( FILES tools/fckit-eval.sh DESTINATION libexec PERMISSIONS ${install_permissions} )
install( FILES contrib/fypp-3.2-b8dd58b-20230822/bin/fypp DESTINATION libexec RENAME fckit-fypp.py PERMISSIONS ${install_permissions} )

ecbuild_install_project( NAME fckit )
10 changes: 6 additions & 4 deletions cmake/fckit-import.cmake.in
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,15 @@
# does it submit to any jurisdiction.

if( @PROJECT_NAME@_IS_BUILD_DIR_EXPORT )
set( FCTEST_GENERATOR @PYTHON_EXECUTABLE@ @CMAKE_CURRENT_SOURCE_DIR@/tools/fctest-generate-runner.py )
set( FYPP @CMAKE_CURRENT_SOURCE_DIR@/tools/fckit-eval.sh @PYTHON_EXECUTABLE@ @CMAKE_CURRENT_SOURCE_DIR@/tools/fckit-fypp.py )
set( FCTEST_GENERATOR @Python3_EXECUTABLE@ @CMAKE_CURRENT_SOURCE_DIR@/tools/fctest-generate-runner.py )
set( FCKIT_VENV_EXE @FCKIT_VENV_EXE@ )
else()
set( FCTEST_GENERATOR @PYTHON_EXECUTABLE@ ${fckit_BASE_DIR}/libexec/fctest-generate-runner.py )
set( FYPP ${fckit_BASE_DIR}/libexec/fckit-eval.sh @PYTHON_EXECUTABLE@ ${fckit_BASE_DIR}/libexec/fckit-fypp.py )
set( FCTEST_GENERATOR @Python3_EXECUTABLE@ ${fckit_BASE_DIR}/libexec/fctest-generate-runner.py )
set( FCKIT_VENV_EXE ${fckit_BASE_DIR}/@rel_venv_exe_path@ )
endif()

set( FYPP ${FCKIT_VENV_EXE} -m fypp )

@FCKIT_PREPROCESS_FYPP@

@ADD_FCTEST@
Expand Down
65 changes: 65 additions & 0 deletions cmake/fckit_install_venv.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# (C) Copyright 2013 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
# granted to it by virtue of its status as an intergovernmental organisation nor
# does it submit to any jurisdiction.

macro( fckit_install_venv )

# Discover only system install Python 3
set( Python3_FIND_VIRTUALENV STANDARD )
find_package( Python3 COMPONENTS Interpreter REQUIRED )

# Create a loki virtualenv
set( VENV_PATH ${CMAKE_CURRENT_BINARY_DIR}/venv )
message( STATUS "Create Python virtual environment ${VENV_PATH}" )
execute_process( COMMAND ${Python3_EXECUTABLE} -m venv --copies "${VENV_PATH}" )

# Make the virtualenv portable by automatically deducing the VIRTUAL_ENV path from
# the 'activate' script's location in the filesystem
execute_process(
COMMAND
sed -i "s/^VIRTUAL_ENV=\".*\"$/VIRTUAL_ENV=\"$(cd \"$(dirname \"$(dirname \"\${BASH_SOURCE[0]}\" )\")\" \\&\\& pwd)\"/" "${VENV_PATH}/bin/activate"
)

# Change the context of the search to only find the venv
set( Python3_FIND_VIRTUALENV ONLY )

# Unset Python3_EXECUTABLE because it is also an input variable
# (see documentation, Artifacts Specification section)
set( Python3_EXECUTABLE_CACHE ${Python3_EXECUTABLE} )
unset( Python3_EXECUTABLE )
# To allow cmake to discover the newly created venv if Python3_ROOT_DIR
# was passed as an argument at build-time
set( Python3_ROOT_DIR "${VENV_PATH}" )

# Find newly created python venv
find_package( Python3 COMPONENTS Interpreter REQUIRED )

message( STATUS "Install fckit_yaml_reader in virtual environment ${VENV_PATH}" )
execute_process( COMMAND ${Python3_EXECUTABLE} -m pip install ${CMAKE_SOURCE_DIR}/fckit_yaml_reader OUTPUT_QUIET )

# install ruamel
message( STATUS "Install ruamel.yaml in virtual environment ${VENV_PATH}" )
execute_process( COMMAND ${Python3_EXECUTABLE} -m pip install ${CMAKE_SOURCE_DIR}/contrib/ruamel.yaml-0.18.6 OUTPUT_QUIET )

# install fypp
message( STATUS "Install fypp in virtual environment ${VENV_PATH}" )
execute_process( COMMAND ${Python3_EXECUTABLE} -m pip install ${CMAKE_SOURCE_DIR}/contrib/fypp-3.2-b8dd58b-20230822 OUTPUT_QUIET )

install( DIRECTORY ${VENV_PATH} DESTINATION . PATTERN "bin/*" PERMISSIONS ${install_permissions} )

# add python interpreter of venv as executable target
set( FCKIT_VENV_EXE ${Python3_EXECUTABLE} )

# compute relative path to venv to aid with installation
cmake_path( RELATIVE_PATH FCKIT_VENV_EXE BASE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} OUTPUT_VARIABLE rel_venv_exe_path )

set( FYPP ${FCKIT_VENV_EXE} -m fypp )

# reset Python3_EXECUTABLE to the system install
set( Python3_EXECUTABLE ${Python3_EXECUTABLE_CACHE} )

endmacro()

0 comments on commit a3fcd75

Please sign in to comment.