diff options
author | Alexis Ballier <aballier@gentoo.org> | 2015-09-22 10:32:06 +0200 |
---|---|---|
committer | Alexis Ballier <aballier@gentoo.org> | 2015-09-22 10:32:06 +0200 |
commit | 88eeddbe6f3ee78ca0072087d99b7af32af26330 (patch) | |
tree | 7a7f8fb29205c30a0d84e4415a0133080d6e9294 /eclass/ros-catkin.eclass | |
parent | dev-python/funcsigs: add ~alpha keyword (diff) | |
download | gentoo-88eeddbe6f3ee78ca0072087d99b7af32af26330.tar.gz gentoo-88eeddbe6f3ee78ca0072087d99b7af32af26330.tar.bz2 gentoo-88eeddbe6f3ee78ca0072087d99b7af32af26330.zip |
eclass: Add ros-catkin.eclass.
https://archives.gentoo.org/gentoo-dev/message/00ee6c70409456a6d0c1f20739f7741c
Diffstat (limited to 'eclass/ros-catkin.eclass')
-rw-r--r-- | eclass/ros-catkin.eclass | 247 |
1 files changed, 247 insertions, 0 deletions
diff --git a/eclass/ros-catkin.eclass b/eclass/ros-catkin.eclass new file mode 100644 index 000000000000..41405b339cd8 --- /dev/null +++ b/eclass/ros-catkin.eclass @@ -0,0 +1,247 @@ +# Copyright 1999-2015 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id$ + +# @ECLASS: ros-catkin.eclass +# @MAINTAINER: +# ros@gentoo.org +# @AUTHOR: +# Alexis Ballier <aballier@gentoo.org> +# @BLURB: Template eclass for catkin based ROS packages. +# @DESCRIPTION: +# Provides function for building ROS packages on Gentoo. +# It supports selectively building messages, multi-python installation, live ebuilds (git only). + +case "${EAPI:-0}" in + 0|1|2|3|4) + die "EAPI='${EAPI}' is not supported" + ;; + *) + ;; +esac + +# @ECLASS-VARIABLE: ROS_REPO_URI +# @DESCRIPTION: +# URL of the upstream repository. Usually on github. +# Serves for fetching tarballs, live ebuilds and inferring the meta-package name. +EGIT_REPO_URI="${ROS_REPO_URI}" + +# @ECLASS-VARIABLE: ROS_SUBDIR +# @DEFAULT_UNSET +# @DESCRIPTION: +# Subdir in which current packages is located. +# Usually, a repository contains several packages, hence a typical value is: +# ROS_SUBDIR=${PN} + +SCM="" +if [ "${PV#9999}" != "${PV}" ] ; then + SCM="git-r3" +fi + +# @ECLASS-VARIABLE: PYTHON_COMPAT +# @DESCRIPTION: +# Tells the eclass the package has python code and forwards it to python-r1.eclass. +PYTHON_ECLASS="" +CATKIN_PYTHON_USEDEP="" +if [ -n "${PYTHON_COMPAT}" ] ; then + PYTHON_ECLASS="python-r1 python-utils-r1" +fi + +inherit ${SCM} ${PYTHON_ECLASS} cmake-utils + +CATKIN_DO_PYTHON_MULTIBUILD="" +if [ -n "${PYTHON_COMPAT}" ] ; then + CATKIN_PYTHON_USEDEP="[${PYTHON_USEDEP}]" + CATKIN_DO_PYTHON_MULTIBUILD="yes" +fi + +IUSE="test" +RDEPEND=" + dev-util/catkin${CATKIN_PYTHON_USEDEP} + dev-python/empy${CATKIN_PYTHON_USEDEP} +" +DEPEND="${RDEPEND}" + +if [ -n "${CATKIN_DO_PYTHON_MULTIBUILD}" ] ; then + RDEPEND="${RDEPEND} dev-lang/python-exec:2" +fi + +# @ECLASS-VARIABLE: CATKIN_HAS_MESSAGES +# @DESCRIPTION: +# Set it to a non-empty value before inherit to tell the eclass the package has messages to build. +# Messages will be built based on ROS_MESSAGES USE_EXPANDed variable. + +# @ECLASS-VARIABLE: CATKIN_MESSAGES_TRANSITIVE_DEPS +# @DESCRIPTION: +# Some messages have dependencies on other messages. +# In that case, CATKIN_MESSAGES_TRANSITIVE_DEPS should contain a space-separated list of atoms +# representing those dependencies. The eclass uses it to ensure proper dependencies on these packages. +if [ -n "${CATKIN_HAS_MESSAGES}" ] ; then + IUSE="${IUSE} +ros_messages_python +ros_messages_cxx ros_messages_eus ros_messages_lisp" + RDEPEND="${RDEPEND} + ros_messages_cxx? ( dev-ros/gencpp:=${CATKIN_PYTHON_USEDEP} ) + ros_messages_eus? ( dev-ros/geneus:=${CATKIN_PYTHON_USEDEP} ) + ros_messages_python? ( dev-ros/genpy:=${CATKIN_PYTHON_USEDEP} ) + ros_messages_lisp? ( dev-ros/genlisp:=${CATKIN_PYTHON_USEDEP} ) + dev-ros/message_runtime + " + DEPEND="${DEPEND} ${RDEPEND} + dev-ros/message_generation + dev-ros/genmsg${CATKIN_PYTHON_USEDEP} + " + if [ -n "${CATKIN_MESSAGES_TRANSITIVE_DEPS}" ] ; then + for i in ${CATKIN_MESSAGES_TRANSITIVE_DEPS} ; do + ds="${i}[ros_messages_python(-)?,ros_messages_cxx(-)?,ros_messages_lisp(-)?,ros_messages_eus(-)?] ros_messages_python? ( ${i}[${PYTHON_USEDEP}] )" + RDEPEND="${RDEPEND} ${ds}" + DEPEND="${DEPEND} ${ds}" + done + fi +fi + +# @ECLASS-VARIABLE: CATKIN_MESSAGES_CXX_USEDEP +# @DESCRIPTION: +# Use it as cat/pkg[${CATKIN_MESSAGES_CXX_USEDEP}] to indicate a dependency on the C++ messages of cat/pkg. +CATKIN_MESSAGES_CXX_USEDEP="ros_messages_cxx(-)" + +# @ECLASS-VARIABLE: CATKIN_MESSAGES_PYTHON_USEDEP +# @DESCRIPTION: +# Use it as cat/pkg[${CATKIN_MESSAGES_PYTHON_USEDEP}] to indicate a dependency on the Python messages of cat/pkg. +CATKIN_MESSAGES_PYTHON_USEDEP="ros_messages_python(-),${PYTHON_USEDEP}" + +# @ECLASS-VARIABLE: CATKIN_MESSAGES_LISP_USEDEP +# @DESCRIPTION: +# Use it as cat/pkg[${CATKIN_MESSAGES_LISP_USEDEP}] to indicate a dependency on the Common-Lisp messages of cat/pkg. +CATKIN_MESSAGES_LISP_USEDEP="ros_messages_lisp(-)" + +# @ECLASS-VARIABLE: CATKIN_MESSAGES_EUS_USEDEP +# @DESCRIPTION: +# Use it as cat/pkg[${CATKIN_MESSAGES_EUS_USEDEP}] to indicate a dependency on the EusLisp messages of cat/pkg. +CATKIN_MESSAGES_EUS_USEDEP="ros_messages_eus(-)" + +if [ "${PV#9999}" != "${PV}" ] ; then + SRC_URI="" + KEYWORDS="" + S=${WORKDIR}/${P}/${ROS_SUBDIR} +else + SRC_URI="${ROS_REPO_URI}/archive/${VER_PREFIX}${PV%_*}${VER_SUFFIX}.tar.gz -> ${ROS_REPO_URI##*/}-${PV}.tar.gz" + S=${WORKDIR}/${VER_PREFIX}${ROS_REPO_URI##*/}-${PV}/${ROS_SUBDIR} +fi + +HOMEPAGE="http://wiki.ros.org/${PN}" + +# @FUNCTION: ros-catkin_src_prepare +# @DESCRIPTION: +# Calls cmake-utils_src_prepare (so that PATCHES array is handled there) and initialises the workspace +# by installing a recursive CMakeLists.txt to handle bundles. +ros-catkin_src_prepare() { + cmake-utils_src_prepare + + if [ ! -f "${S}/CMakeLists.txt" ] ; then + catkin_init_workspace || die + fi +} + +# @FUNCTION: ros-catkin_src_configure_internal +# @DESCRIPTION: +# Internal decoration of cmake-utils_src_configure to handle multiple python installs. +ros-catkin_src_configure_internal() { + if [ -n "${CATKIN_DO_PYTHON_MULTIBUILD}" ] ; then + local mycmakeargs=("${mycmakeargs[@]}" -DPYTHON_EXECUTABLE="${PYTHON}") + python_export PYTHON_SCRIPTDIR + fi + cmake-utils_src_configure "${@}" +} + +# @VARIABLE: mycatkincmakeargs +# @DEFAULT_UNSET +# @DESCRIPTION: +# Optional cmake defines as a bash array. Should be defined before calling +# src_configure. + +# @FUNCTION: ros-catkin_src_configure +# @DESCRIPTION: +# Configures a catkin-based package. +ros-catkin_src_configure() { + export CMAKE_PREFIX_PATH="${EPREFIX}/usr" + export ROS_ROOT="${EPREFIX}/usr/share/ros" + if [ -n "${CATKIN_HAS_MESSAGES}" ] ; then + ROS_LANG_DISABLE="" + use ros_messages_cxx || ROS_LANG_DISABLE="${ROS_LANG_DISABLE}:gencpp" + use ros_messages_eus || ROS_LANG_DISABLE="${ROS_LANG_DISABLE}:geneus" + use ros_messages_lisp || ROS_LANG_DISABLE="${ROS_LANG_DISABLE}:genlisp" + use ros_messages_python || ROS_LANG_DISABLE="${ROS_LANG_DISABLE}:genpy" + export ROS_LANG_DISABLE + fi + local mycmakeargs=( + "$(cmake-utils_use test CATKIN_ENABLE_TESTING)" + "-DCATKIN_BUILD_BINARY_PACKAGE=ON" + "-DCATKIN_PREFIX_PATH=${SYSROOT:-${EROOT}}/usr" + "${mycatkincmakeargs[@]}" + ) + if [ -n "${CATKIN_DO_PYTHON_MULTIBUILD}" ] ; then + python_foreach_impl ros-catkin_src_configure_internal "${@}" + else + ros-catkin_src_configure_internal "${@}" + fi +} + +# @FUNCTION: ros-catkin_src_compile +# @DESCRIPTION: +# Builds a catkin-based package. +ros-catkin_src_compile() { + if [ -n "${CATKIN_DO_PYTHON_MULTIBUILD}" ] ; then + python_foreach_impl cmake-utils_src_compile "${@}" + else + cmake-utils_src_compile "${@}" + fi +} + +# @FUNCTION: ros-catkin_src_test_internal +# @DESCRIPTION: +# Decorator around cmake-utils_src_test to ensure tests are built before running them. +ros-catkin_src_test_internal() { + cd "${BUILD_DIR}" || die + if nonfatal emake tests -n &> /dev/null ; then + emake VERBOSE=1 tests + fi + cmake-utils_src_test "${@}" +} + +# @FUNCTION: ros-catkin_src_test +# @DESCRIPTION: +# Run the tests of a catkin-based package. +ros-catkin_src_test() { + if [ -n "${CATKIN_DO_PYTHON_MULTIBUILD}" ] ; then + python_foreach_impl ros-catkin_src_test_internal "${@}" + else + ros-catkin_src_test_internal "${@}" + fi +} + +# @FUNCTION: ros-catkin_src_install_with_python +# @DESCRIPTION: +# Decorator around cmake-utils_src_install to ensure python scripts are properly handled w.r.t. python-exec2. +ros-catkin_src_install_with_python() { + python_export PYTHON_SCRIPTDIR + cmake-utils_src_install "${@}" + if [ ! -f "${T}/.catkin_python_symlinks_generated" -a -d "${D}/${PYTHON_SCRIPTDIR}" ]; then + dodir /usr/bin + for i in "${D}/${PYTHON_SCRIPTDIR}"/* ; do + dosym ../lib/python-exec/python-exec2 "/usr/bin/${i##*/}" + done + touch "${T}/.catkin_python_symlinks_generated" || die + fi +} + +# @FUNCTION: ros-catkin_src_install +# @DESCRIPTION: +# Installs a catkin-based package. +ros-catkin_src_install() { + if [ -n "${CATKIN_DO_PYTHON_MULTIBUILD}" ] ; then + python_foreach_impl ros-catkin_src_install_with_python "${@}" + else + cmake-utils_src_install "${@}" + fi +} + +EXPORT_FUNCTIONS src_prepare src_configure src_compile src_test src_install |