はじめに

euslispチュートリアルをやるために、Gentoo上のROSに環境を整備する。
ROSは、ros-overlayのmelodicを使用している。

roseusのインストール

# emerge --ask ros-melodic/roseus

一発で終わるはず…だった。

emergeの際に謎のエラーが発生。

(エラーメッセージ一部抜粋)
-- gcc dumpmachine returns x86_64-pc-linux-gnu
CMake Error at CMakeLists.txt:29 (message):
  -- -- This machine is not supported


-- Configuring incomplete, errors occurred!
See also "/var/tmp/portage/ros-melodic/euslisp-9.25.0/work/euslisp-9.25.0_build/CMakeFiles/CMakeOutput.log".
 * ERROR: ros-melodic/euslisp-9.25.0::ros-overlay failed (configure phase):
 *   cmake failed

なんだかコンパイル以前にconfigureで弾かれたらしい。

configureについてはこの辺で調べた。
configureのbuild、host、targetの違い
組み込みシステム用クロスコンパイラの作成

それで、targetを弾いているらしいCMakeLists.txtをeuslispのgithubでみてみたところ…

(一部抜粋)
# check arch and os
execute_process(COMMAND bash -c "gcc -dumpmachine" OUTPUT_VARIABLE gcc_dump_machine OUTPUT_STRIP_TRAILING_WHITESPACE)
message("-- gcc dumpmachine returns ${gcc_dump_machine}")
if(gcc_dump_machine MATCHES "x86_64-linux-.*" OR gcc_dump_machine MATCHES "x86_64-redhat-linux")
  set(ARCHDIR "Linux64")
  set(MAKEFILE "Makefile.Linux64")
elseif(gcc_dump_machine MATCHES "i686-linux-.*" OR gcc_dump_machine MATCHES "i686-redhat-linux")
  set(ARCHDIR "Linux")
  set(MAKEFILE "Makefile.Linux.thread")
elseif(gcc_dump_machine MATCHES "arm.*-.*")
  set(ARCHDIR "LinuxARM")
  set(MAKEFILE "Makefile.LinuxARM")
elseif(gcc_dump_machine MATCHES "aarch64.*-.*")
  set(ARCHDIR "LinuxARM")
  set(MAKEFILE "Makefile.LinuxARM")
elseif(gcc_dump_machine MATCHES "cygwin.*-.*")
  set(ARCHDIR "Cygwin")
  set(MAKEFILE "Makefile.Cygwin")
elseif(gcc_dump_machine MATCHES ".*darwin.*")
  set(ARCHDIR "Darwin")
  set(MAKEFILE "Makefile.Darwin")
else()
  message(FATAL_ERROR "-- -- This machine is not supported")
endif()

ということで、”x86_64-linux-“で始まるtargetじゃないといけないらしい。
うちのGentooでは何やら”x86_64-pc-linux-“と余計な”-pc”が入ってたので謎のアーキテクチャーとして弾かれたらしい。
知らんがな、同じx86のlinux何だから受け入れてくれよ…

ということで、Gentooの柔軟性(…ただコンパイル面倒なだけ…ではないことを祈っているが)をフル活用して、自前のパッチを用意して回避することにした。
パッチの作り方はここを参考にする。

Gentooのebuildにパッチを当てる方法は以下を参考にした。
Gentoo Wiki /etc/portage/patches
Gentoo – add own patches to ebuild
EAPIが6になって、いちいちシェルスクリプトとかでパッチする関数を呼び出さなくてもパッチファイルを/etc/portage/patchに放り込むだけでよくなったらしい。
これでeuslispのコンパイルは通った。

これでホット一息と思ったら、お次は ros-melodic/jskeus-1.2.0-r3 がコンパイルエラー。
今度はインストールエラーらしい。
さっきみたいに色々Makifileまわりをいじったけど全然ダメ。
しょうがないから、github(link)でソース落としてきてmakeしてみると、ここではコンパイルエラー。
emergeのログも合わせて見てみると、どうもgccのmath.hあたりの定義がおかしくなってるらしく、リンクに失敗している。
いろいろたどって、irteus/PQP/src/PQP_Compile.h の

// Prevents compiler warnings when PQP_REAL is float.
// This block is disabled on macOS clang >= 9.0.0 (e.g. High Sierra)
// or GNU GCC >= 7 to avoid undefined exception and redefinition error.

#if ! ( (defined(__APPLE__) && __clang_major__ >= 9) || (defined(__GNUC__) && (__GNUC__ >= 7) ) )
#include 
inline float sqrt(float x) { return (float)sqrt((double)x); }
inline float cos(float x) { return (float)cos((double)x); }
inline float sin(float x) { return (float)sin((double)x); }
inline float fabs(float x) { return (float)fabs((double)x); }
#endif

をコメントアウトするパッチをかけたらようやく通った。

最後に、何かroseusを起動すると/opt/ros/melodic/share/euslisp/jskeus/irteus/irteus が無駄にループしてると言われたので、サクッとシンボリックリンクを消したところ無事に動いた。
感無量。

euslisp tutorialの準備

euslispチュートリアル
をやるために準備する。

catkinワークスペースがない場合は準備する。

jsk_commonを導入

jsk_commonをcatkinワークスペースにcloneしてコンパイルした。

その際に、map_serverがないと言われたので、

# emerge --ask ros-melodic/map_server

でインストールした。
コンパイルエラーを何回か起こしたが、何度かcatkin_makeしたらうまくいった。
おそらく、emergeとかでもよく起こるmakeの並列化あたりの問題の可能性がある。

rtmros_commonを導入

rtmros_common (github)
のReadmeのとおりにソースからインストール

$ wstool set rtm-ros-robotics/rtmros_common https://github.com/start-jsk/rtmros_common --git -y
$ wstool update
$ cd ..
$ source /opt/ros/hydro/setup.bash
$ rosdep install -v -r --from-paths src --ignore-src -y
$ catkin_make

catkin_makeでopenrtm_aistがいるといわれたのでインストール。

wstool merge https://raw.github.com/start-jsk/openrtm_aist_core/master/.rosinstall -y

なんかmd5sumエラーが出てコンパイルできんぞ

おわりに

1からコンパイルするって大変です。
aptみたいにバイナリ落としてくるパッケージマネージャーだったらものすごく楽なのに…

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください