nix-ros-overlay/distros/catkin-setup-hook/setup-hook.sh
Ben Wolsieffer 6dbcb30f57 catkin: pass -DCATKIN_BUILD_BINARY_PACKAGE=ON
This disables generation of the setup scripts, which were already being deleted
anyway. It also disables generation of the .catkin marker, which is
unfortunately still needed the ROS_PACKAGE_PATH environment hook. To work around
this, .catkin is generated manually.

The other reason to set this option is to fix some packages (maybe only
plotjuggler-msgs) that use CATKIN_BUILD_BINARY_PACKAGE as one (unreliable)
method of determining whether they are being built for ROS 1 rather than ROS 2.

Fixes #216
2022-10-08 22:37:47 -04:00

90 lines
2.8 KiB
Bash

# Include guard to prevent running hooks more than once
if [ -n "${_catkin_setup_hook_loaded:-}" ]; then return; fi
_catkin_setup_hook_loaded=1
# Load catkin environment hooks. This mimics the behavior of _setup_util.py.
declare -gA _catkinPackagesSeen
declare -gA _catkinGenericEnvHooks
declare -gA _catkinSpecificEnvHooks
_findCatkinEnvHooks() {
local pkg="$1"
local pkgEnvHookDir="$pkg/etc/catkin/profile.d"
# Deduplicate the packages
if [ -z "${_catkinPackagesSeen["$pkg"]:-}" ] && [ -d "$pkgEnvHookDir" ]; then
while IFS= read -rd '' hook; do
case "$hook" in
*.sh) _catkinGenericEnvHooks["$(basename "$hook")"]="$hook" ;;
*) _catkinSpecificEnvHooks["$(basename "$hook")"]="$hook" ;;
esac
done < <(find "$pkgEnvHookDir" \( -name "*.sh" -o -name "*.$CATKIN_SHELL" \) -print0)
fi
_catkinPackagesSeen["$pkg"]=1
}
addEnvHooks "$targetOffset" _findCatkinEnvHooks
_runCatkinEnvHook() {
[ -n "$1" ] || return 0
# Causes hooks to look in the wrong place
unset CATKIN_ENV_HOOK_WORKSPACE
# Some hooks assume set +u
set +u
# Some hooks fail in stripped down bash during builds
source "$1" || true
set -u
}
_runCatkinEnvHooksArray() {
# Run hooks in sorted order of their file names
# This would fail if a filename contained EOT
# Work around https://github.com/NixOS/nix/issues/5262
local eot=$(printf '\004')
while IFS= read -rd '' hook; do
_runCatkinEnvHook "$hook"
done < <(printf "%s\0" "$@" | \
# Replace final / with EOT, separating the file name
sed -z 's|\(.*\)/|\1'${eot}'|' | \
# Sort on second EOT separated field (file name)
LC_ALL=C sort -zt${eot} -k2 | \
# Substitute / back in for EOT
sed -z 's|'${eot}'|/|')
}
_runCatkinEnvHooks() {
_runCatkinEnvHooksArray "${_catkinGenericEnvHooks[@]}"
_runCatkinEnvHooksArray "${_catkinSpecificEnvHooks[@]}"
}
postHooks+=(_runCatkinEnvHooks)
_catkinPostPatchHook() {
while IFS= read -rd '' cfg; do
patchShebangs "$cfg"
done < <(find . -name '*.cfg' -executable -print0)
}
postPatchHooks+=(_catkinPostPatchHook)
_catkinPreConfigureHook() {
cmakeFlags+=" -DCATKIN_ENABLE_TESTING=${doCheck:-OFF}"
# Don't try to detect Debian/Ubuntu when sandbox is disabled
cmakeFlags+=" -DSETUPTOOLS_DEB_LAYOUT=OFF"
# Don't install setup scripts or .catkin workspace marker. Unfortunately,
# we still need the marker for the environment hooks, so it is created
# manually.
cmakeFlags+=" -DCATKIN_BUILD_BINARY_PACKAGE=ON"
}
preConfigureHooks+=(_catkinPreConfigureHook)
_catkinMarkerHook() {
# The ROS_PACKAGE_PATH hook needs the .catkin marker
touch "$out/.catkin"
}
postInstallHooks+=(_catkinMarkerHook)
_catkinWrapperHook() {
wrapPythonPrograms
}
postFixupHooks+=(_catkinWrapperHook)
export CATKIN_SHELL=bash