248 lines
7.8 KiB
Bash
248 lines
7.8 KiB
Bash
|
# 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
|