Hi all,

As part of an effort of bringing ros (http://www.ros.org/) to Gentoo,
I've come up with the following design:

ros-catkin.eclass that is a template, merging all common code for
catkinized ros packages.

ROS_MESSAGES will be a new USE_EXPANDed variable: ROS is message
based, processes write and listen to some topic, and a topic is typed
with a message. Messages are defined by simple text files but are then
pre-processed for easy usage in C++, Python & co.

Several packages are usually bundled in a single repository, with a
meta-package pulling all the others. Hence, I came with two new
categories: dev-ros for single packages, ros-meta for those
meta-packages.

Some numbers:
 /bin/ls ros-meta | wc -l
52
 /bin/ls dev-ros | wc -l
350


I think maybe half of them are in a state that they can be added to
gentoo-x86.


ebuild example:

$ cat roslib-1.12.2.ebuild 
# Copyright 1999-2014 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

EAPI=5

ROS_REPO_URI="https://github.com/ros/ros";
KEYWORDS="~amd64 ~arm"
PYTHON_COMPAT=( python{2_7,3_3,3_4} )
ROS_SUBDIR=core/${PN}

inherit ros-catkin

DESCRIPTION="Base dependencies and support libraries for ROS"
LICENSE="BSD"
SLOT="0"
IUSE=""

RDEPEND="
        dev-python/rospkg[${PYTHON_USEDEP}]
        dev-libs/boost:=[threads]
        dev-ros/rospack
"
DEPEND="${RDEPEND}
        test? ( dev-ros/rosmake ros-meta/ros )"





Eclass inlined at the end.

Best regards,

Alexis.

# Copyright 1999-2015 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

# @ECLASS: ros-catkin.eclass
# @MAINTAINER:
# r...@gentoo.org
# @AUTHOR:
# Alexis Ballier <aball...@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).

# @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}"
        if nonfatal emake tests -n &> /dev/null ; then
                emake VERBOSE=1 tests || die
        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##*/}" || die
                done
                touch "${T}/.catkin_python_symlinks_generated"
        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

Reply via email to