Skip to content

Latest commit

 

History

History
82 lines (59 loc) · 3.25 KB

README.md

File metadata and controls

82 lines (59 loc) · 3.25 KB

CMakePythonDeps Generator

This is a conan python_requires package, exposing functionality to generate CMake targets for executables in a python virtual environment.

First, add the mtolympus remote to your conan configuration

$ conan remote add mtolympus-conan https://mtolympus.jfrog.io/artifactory/api/conan/mtolympus-conan

For a recipe to be consumed using the CMakePythonDeps generator, populate the user.env.pythonenv:requirements and user.env.pythonenv:dir configuration variables. This can be performed using the package_info() method as below:

class PythonVirtualEnvironment(ConanFile):

    def package_info(self):
        requirements = [
            "sphinx==4.4.0",
            "sphinx_rtd_theme",
            "sphinx_book_theme==0.3.2",
            "pygments",
        ]
        self.conf_info.define("user.env.pythonenv:requirements", json.dumps(requirements))
        self.conf_info.define("user.env.pythonenv:dir", self.package_folder)
  • user.env.pythonenv:requirements: This is expected to be a JSON string containing a list of the packages and their versions to be installed into the virtual environment.
  • user.env.pythonenv:dir: A string representing the path to the python virtual environment.

An example of a package that uses this is the python-virtualenv/system package.

To consume a recipe that has populated the above variables, simply specify CMakePythonDeps as the generator to use in the consumer conanfile.py:

class ExamplePythonConan(ConanFile):
    # ...
    python_requires = "cmake-python-deps/0.3.0"

    def generate(self):
        py = python_requires["cmake-python-deps"].modules.CMakePythonDeps(self)
        py.generate()

This generator will create CMake targets named for the package, and it's executables to allow you to use them in your CMake recipes. To illustrate, if you were to install sphinx in a virtual environment, the entry points sphinx-build, sphinx-quickstart, sphinx-apidoc and sphinx-autogen would be created in the virtual environment. The corresponding CMake targets would be:

sphinx::sphinx-build
sphinx::sphinx-quickstart
sphinx::sphinx-apidoc
sphinx::sphinx-autogen

This means that a minimal docs/CMakeLists.txt for a sphinx dependency might look like the following:

find_package(sphinx REQUIRED)

# Sphinx configuration
set(SPHINX_SOURCE ${CMAKE_CURRENT_SOURCE_DIR})
set(SPHINX_BUILD ${CMAKE_CURRENT_BINARY_DIR}/sphinx)
set(SPHINX_INDEX_FILE ${SPHINX_BUILD}/index.html)

# CMakePythonDeps generates a component for each binary exported by the python package
# In this case, it will invoke sphinx-build
add_custom_command(
  OUTPUT ${SPHINX_INDEX_FILE}
  DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/index.rst
  COMMAND sphinx::sphinx-build -b html ${SPHINX_SOURCE} ${SPHINX_BUILD}
  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  COMMENT "Generating documentation with Sphinx")

add_custom_target(sphinx ALL DEPENDS ${SPHINX_INDEX_FILE})

# Add an install target to install the docs
include(GNUInstallDirs)
install(DIRECTORY ${SPHINX_BUILD}/ DESTINATION ${CMAKE_INSTALL_DOCDIR})

An example of this being used in conjunction with python-virtualenv can be found in the test_package.