| # 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 ${PYTHON_DEPS}" |
| DEPEND="${DEPEND} ${PYTHON_DEPS}" |
| 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}${VER_SUFFIX}/${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 cmake-utils_src_make tests -n &> /dev/null ; then |
| cmake-utils_src_make 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 |