forked from jsk-ros-pkg/jsk_common
-
Notifications
You must be signed in to change notification settings - Fork 0
/
jsk.rosbuild
executable file
·329 lines (291 loc) · 12.4 KB
/
jsk.rosbuild
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
#!/usr/bin/env bash
function usage {
echo >&2 "usage: $0"
echo >&2 " [-h|--help] print this message"
echo >&2 " [-i|--show-install] show how to install "
echo >&2 " [-p|--show-package] display packages to install"
echo >&2 " [-e|--environment] display environment variables"
echo >&2 " [-d|--use-deb] use debian package if they are already released"
echo >&2 " [--rtm|--start-jsk|--rtm-ros-robotics] merge .rosinstall for rtm-ros stuff"
exit 0
}
function error {
echo "export ROS_HOME=$ROS_HOME"
echo "source $ROS_INSTALLDIR/setup.bash"
(which rosrun && rosrun rosunit clean_junit_xml.py; echo "done")
exit 1
}
trap error ERR
# command line parse
OPT=`getopt -o hiped -l help,show-install,show-package,show-environment,use-deb,rtm,start-jsk,rtm-ros-robotics -- $*`
if [ $? != 0 ]; then
usage
fi
eval set -- $OPT
while [ -n "$1" ] ; do
case $1 in
-h|--help) usage ;;
-i|--show-install) SHOW="install"; shift;;
-p|--show-package) SHOW="package"; shift;;
-e|--show-environment) SHOW="environment"; shift;;
-d|--use-deb) USE_DEB=true; shift;;
--rtm|--start-jsk|--rtm-ros-robotics) RTM_ROS_ROBOTICS=true; shift;;
--) shift; break;;
*) echo "Unknown option($1)"; usage;;
esac
done
# set environment variables
# set distribution
case $1 in
cturtle|diamondback|electric|fuerte|groovy|hydro|indigo) export DISTRIBUTION=$1; shift;;
*) export DISTRIBUTION=groovy;;
esac
# check ros distribution and ubuntu distribution
# http://ros.org/reps/rep-0003.html
export LSB_RELEASE=`lsb_release -cs`
if ( [ "$DISTRIBUTION" == "cturtle" ] && \
[[ $LSB_RELEASE =~ (lucid|maverick) ]] ) || \
( [ "$DISTRIBUTION" == "diamondback" ] && \
[[ $LSB_RELEASE =~ (lucid|maverick|natty) ]] ) || \
( [ "$DISTRIBUTION" == "diamondback" ] && \
[[ $LSB_RELEASE =~ (lucid|maverick|natty) ]] ) || \
( [ "$DISTRIBUTION" == "electric" ] && \
[[ $LSB_RELEASE =~ (lucid|maverick|natty|oneiric) ]] ) || \
( [ "$DISTRIBUTION" == "fuerte" ] && \
[[ $LSB_RELEASE =~ (lucid|oneiric|precise) ]] ) || \
( [ "$DISTRIBUTION" == "groovy" ] && \
[[ $LSB_RELEASE =~ (oneiric|precise|quantal) ]] ) || \
( [ "$DISTRIBUTION" == "hydro" ] && \
[[ $LSB_RELEASE =~ (precise|quantal|raring) ]] ) || \
( [ "$DISTRIBUTION" == "indigo" ] && \
[[ $LSB_RELEASE =~ (saucy|trusty) ]] ) then
echo "Install $DISTRIBUTION to $LSB_RELEASE"
else
echo "target distribution($DISTRIBUTION) does not support $LSB_RELEASE platform, exit install program"
exit -1
fi
# setup workspaceand buildspace
if [ "$WORKSPACE" == "" ]; then # if not jenkins
export WORKSPACE=$HOME
fi
export ROS_INSTALLDIR=$WORKSPACE/ros/$DISTRIBUTION
export PATH=$PATH:/usr/sbin:/usr/bin:/sbin:/bin
# set environment variables
if [ -f /proc/xen -o "`grep -c 'QEMU Virtual CPU' /proc/cpuinfo`" != "0" ]; then
export ROS_PARALLEL_JOBS=-j1
else
export ROS_PARALLEL_JOBS=-j4
fi
export ROS_HOME=$WORKSPACE/.ros
export PATH=$PATH:/usr/local/bin ## for ros tools
export LC_ALL=en_US.UTF-8
unset SVN_REVISION ## this jenkins environment valiables conflicts with mk/svn_checkout.mk
# define functions
# http://www.ros.org/wiki/electric/Installation/Ubuntu
function setup-ros {
sudo dpkg --configure -a
sudo apt-get -y --force-yes install build-essential python-yaml cmake subversion wget python-setuptools git-core mercurial aptitude
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
wget http://packages.ros.org/ros.key -O - | sudo apt-key add -
sudo apt-get update
sudo apt-get upgrade -y --force-yes
sudo apt-get -y --force-yes install ros-${DISTRIBUTION}-rosbash python-rosdep python-rosinstall python-wstool || sudo apt-get -y --force-yes install python-rosdep
if [ -e /etc/ros/rosdep/sources.list.d/20-default.list ] ; then
sudo rm -f /etc/ros/rosdep/sources.list.d/20-default.list; # rosdep init fails when arleady initialized
fi
while [ ! -e /etc/ros/rosdep/sources.list.d/20-default.list ]; do
sudo rosdep init
done
(rosdep update; true)
}
# jsk ros install (copy from http://code.google.com/p/rtm-ros-robotics/wiki/ROS_English)
function install-pkg {
(rosdep update; true)
if ( [[ "$DISTRIBUTION" =~ (electric|fuerte|groovy) ]] ) then
ROS_INSTALLDIR_SRC=$ROS_INSTALLDIR
(mkdir -p $ROS_INSTALLDIR_SRC && cd $ROS_INSTALLDIR_SRC && ( [ -f .rosinstall ] || ( rosws init; rosws merge /opt/ros/$DISTRIBUTION/.rosinstall ) ) && for ROSINSTALL in $@; do ROS_WORKSPACE="" rosws merge $ROSINSTALL -r -y ; done )
else ## hydro and up, use catkin
ROS_INSTALLDIR_SRC=$ROS_INSTALLDIR/src;
(mkdir -p $ROS_INSTALLDIR_SRC && cd $ROS_INSTALLDIR_SRC; catkin_init_workspace)
(mkdir -p $ROS_INSTALLDIR_SRC && cd $ROS_INSTALLDIR_SRC && ( [ -f .rosinstall ] || ( wstool init ) ) && for ROSINSTALL in $@; do ROS_WORKSPACE="" wstool merge $ROSINSTALL -r -y ; done )
fi
# for use deb package mode
if [ "$USE_DEB" == true ]; then
for pkg in `find $ROS_INSTALLDIR/jsk-ros-pkg/ -maxdepth 2 -name .rosinstall -exec dirname {} \; | xargs -n 1 -i basename {} `; do
ROS_DISTRO=hydro
pkg2=$(echo $pkg | sed s@_@-@g)
aptitude show ros-$ROS_DISTRO-$pkg2
if [ $? == 0 ]; then
echo "install ros-$ROS_DISTRO-$pkg2 and rmeove $pkg from .rosinstall"
apt-tget -y install ros-$ROS_DISTRO-$pkg2
(cd $ROS_INSTALLDIR_SRC; wstool rm jsk-ros-pkg/$pkg)
fi
done
fi
#
success=0
retry=0
while [ $success == 0 -a $retry -lt 10 ]; do
if ( [[ "$DISTRIBUTION" =~ (electric|fuerte|groovy) ]] ) then
(cd $ROS_INSTALLDIR_SRC && ROS_WORKSPACE="" rosws update ) && success=1 || sleep 120
else
(cd $ROS_INSTALLDIR_SRC && ROS_WORKSPACE="" wstool update ) && success=1 || sleep 120
fi
retry=`expr $retry + 1`
done
echo "hddtemp hddtemp/daemon boolean false" | sudo debconf-set-selections
# rosdep install
(cd $ROS_INSTALLDIR_SRC &&
wget https://raw.github.com/jsk-ros-pkg/jsk_common/master/rosdep-update.sh -O - | ROS_DISTRO=$DISTRIBUTION bash)
return 0
}
function rosdep_and_rosmake {
trap error ERR
local package=$1
rosdep install -y $package -v -r -i || echo "error on rosdep, but continues"
rosmake --profile --status-rate=0 $package || rosmake --profile --status-rate=0 $package
}
function compile-pkg {
trap error ERR
local PACKAGES=$@
unset ROS_DISTRO
if ( [[ "$DISTRIBUTION" =~ (electric|fuerte|groovy) ]] ) then
# start rosdep_and_rosmake
. $ROS_INSTALLDIR/setup.sh
rospack profile
for PACKAGE in $PACKAGES
do
rosdep_and_rosmake $PACKAGE
(cd `rospack find $PACKAGE`; [ ! -e ROS_NOBUILD ] && make ) || echo "ROS_NOBUILD found" # make sure to compile package
done
else ## hydro and up, use catkin
. /opt/ros/$DISTRIBUTION/setup.sh
(cd $ROS_INSTALLDIR && LC_ALL=C catkin_make && LC_ALL=C catkin_make install )
## use rosbuild for rest of componentes
(cd $ROS_INSTALLDIR; rm -f .rosinstall; rosws init . $ROS_INSTALLDIR/install )
. $ROS_INSTALLDIR/setup.sh
rospack profile
fi
}
function test-pkg {
trap error ERR
local PACKAGES=$@
. $ROS_INSTALLDIR/setup.sh
# test
export DISPLAY=
export PATH=$PATH:`rospack find roseus`/bin
TEST_FAIL=0
rm -fr $ROS_WORKSPACE/test_results
# for gazebo
if ( [[ "$DISTRIBUTION" =~ (electric|fuerte|groovy) ]] ) then
source `rospack find gazebo`/scripts/setup.sh
export ROS_PACKAGE_PATH=`rosstack find simulator_gazebo`:$ROS_PACKAGE_PATH
for PACKAGE in $PACKAGES
do
(rospack find $PACKAGE && (cd `rospack find $PACKAGE`; make test ) ) || TEST_FAIL=`echo "-- $PACKAGE failed"`
done
else
(cd $ROS_INSTALLDIR && LC_ALL=C catkin_make run_tests)
fi
}
function doc-pkg {
trap error ERR
local PACKAGES=$@
. $ROS_INSTALLDIR/setup.sh
# test
export DISPLAY=:0.0
export PATH=$PATH:`rospack find roseus`/bin
rm -fr $ROS_INSTALLDIR/../../.ros/test_results
for PACKAGE in $PACKAGES
do
(cd `rospack find $PACKAGE`; make test || make tests) # catkin uses make tests, rosbuild uses make test
# chnage to JENKINS_URL and commit for jenkins
if [ "$JENKINS_URL" != "" -a "$SVN_USERNAME" != "" -a "$SVN_PASSWORD" != "" -a -f `rospack find $PACKAGE`/build/index.rst ] ; then
sed -i "s@^.. image:: build/@.. image:: $JENKINS_URL/job/$JOB_NAME/lastSuccessfulBuild/artifact/doc/$PACKAGE/html/_images/@" `rospack find $PACKAGE`/build/index.rst
sed -i "s@^.. video:: build/@.. video:: $JENKINS_URL/job/$JOB_NAME/lastSuccessfulBuild/artifact/doc/$PACKAGE/html/_images/@" `rospack find $PACKAGE`/build/index.rst
(cd `rospack find $PACKAGE`; cp build/index.rst ./; cp build/conf.py ./; svn add --non-interactive --username $SVN_USERNAME --password $SVN_PASSWORD index.rst conf.py; svn commit --non-interactive --username $SVN_USERNAME --password $SVN_PASSWORD -m "update index.rst,conf.py by Jenkins" index.rst conf.py)
fi
done
# if there are xdisplay, generate doc and index doc
if [ "`xdpyinfo > /dev/null || echo "fail"`" == "fail" ] ; then
echo "Could not connect to Xserver, so exit without running launchdoc"
return 0
fi
# doc
mkdir -p $ROS_INSTALLDIR/doc
SVN_REVISION=`LANGUAGE=en LANG=C svn info $ROS_INSTALLDIR/jsk-ros-pkg | grep Revision`
cat<<EOF > $ROS_INSTALLDIR/doc/index.rst
========================================
jsk-ros-pkg($SVN_REVISION) Test Results
========================================
EOF
for PACKAGE in $PACKAGES
do
if [ -f `rospack find $PACKAGE`/index.rst ]; then
(cd $ROS_INSTALLDIR; rm -fr doc; rosdoc_lite `rospack find $PACKAGE`)
(wkhtmltopdf $ROS_INSTALLDIR/doc/html/index.html $ROS_INSTALLDIR/doc/$PACKAGE.pdf; true)
convert $ROS_INSTALLDIR/doc/$PACKAGE.pdf $ROS_INSTALLDIR/doc/$PACKAGE.png
if [ -f $ROS_INSTALLDIR/doc/$PACKAGE.png ]; then
PACKAGEPNG=$PACKAGE.png
else
PACKAGEPNG=$PACKAGE-0.png
fi
cat <<EOF >> $ROS_INSTALLDIR/doc/index.rst
.. image:: $PACKAGEPNG
:width: 320
:target: $PACKAGE/html/index.html
EOF
fi
done
for PACKAGE in $PACKAGES
do
if [ -f `rospack find $PACKAGE`/index.rst ]; then
cat <<EOF >> $ROS_INSTALLDIR/doc/index.rst
$PACKAGE
ros wiki page http://ros.org/wiki/$PACKAGE/
ros api page http://ros.org/doc/api/$PACKAGE/html/
EOF
fi
done
rst2html $ROS_INSTALLDIR/doc/index.rst $ROS_INSTALLDIR/doc/index.html
}
function install-jsk-ros-pkg {
wget 'https://raw.github.com/jsk-ros-pkg/jsk_common/master/jsk.rosinstall' -O /tmp/jsk.rosinstall.$$
if [ "$RTM_ROS_ROBOTICS" = "true" ]; then
wget 'http://rtm-ros-robotics.googlecode.com/svn/trunk/agentsystem_ros_tutorials/rtm-ros-robotics.rosinstall' -O /tmp/rtm-ros-robotics.rosinstall.$$
install-pkg /tmp/jsk.rosinstall.$$ /tmp/rtm-ros-robotics.rosinstall.$$
else
install-pkg /tmp/jsk.rosinstall.$$
fi
rosdep install -y euslisp -v -r -i || echo "error on rosdep, but continues" # y: default-yes, v: verbose, r: continue despite errors, i: ignore packages
if [ "$DISPLAY" != "" ] && [ "`xset -q fp | grep /usr/share/fonts/X11/100dpi`" == "" ]; then
xset +fp /usr/share/fonts/X11/100dpi,/usr/share/fonts/X11/75dpi || return 0
fi
}
function compile-jsk-ros-pkg {
if ( [[ "$DISTRIBUTION" =~ (electric|fuerte|groovy) ]] ) then
sudo apt-get -y --force-yes install ros-$DISTRIBUTION-pr2-applications
fi
compile-pkg pr2eus_openrave elevator_move_base_pr2 detect_cans_in_fridge_201202 jsk_2013_04_pr2_610
}
function test-jsk-ros-pkg {
test-pkg euslisp roseus pr2eus euscollada pr2eus_openrave jsk_pcl_ros kinect_near_mode_calibration elevator_move_base_pr2 detect_cans_in_fridge_201202 jsk_2013_04_pr2_610
}
# show-* option
case "$SHOW" in
install) declare -f setup-ros | awk '/^\ /{print $0}' | sed -e 's/^[ ]*//'; exit 0;;
package) echo "sudo apt-get -y --force-yes install $INSTALL_ROS_PACKAGE" ; exit 0;;
environment) env; return 0;;
esac
# main program
set -x
if [ $# -gt 0 ]; then ## if we have arguments, check functions
$@
else
setup-ros
install-jsk-ros-pkg
compile-jsk-ros-pkg
test-jsk-ros-pkg
fi
#
(which rosrun && rosrun rosunit clean_junit_xml.py; echo "done") # check error