なんとかなるさね

マイコンをネタにブログを始めてみました


Win/Linuxクロス開発 | Pleiades Kepler + VMware Player上のx86 Linux GCCでビルド (2) 

以前のエントリで、VMware Playerの共有フォルダ上のソースファイルをWindowsのPleiades 4.3 Keplerで
管理/編集しつつ、VMware Playerのハードウェア仮想化されたCOMポート経由でWindowsのPleiades 4.3
KeplerからVMware Player上のUbuntuのネイティブなx86 Linux GCCを実行してビルドしたことがあります
が、今回、以下のようなWindowsの小技を組み合わせて、その時のやり方をちょっと改良してみました。

Windowsの小技

* Windowsの仮想ドライブにVMware Player上のUbuntuのフォルダをシンボリックリンクする(blog-entry-427)
* Windowsのバッチファイル上でカレントフォルダのパス文字列を取得する
* Windowsのバッチファイル上で文字列の一部分を抽出する
* Windowsのバッチファイル上で文字列の置換を行う
* Windowsのバッチファイル上で、自分自身のバッチファイルのファイル名文字列を取得する

改良点

* UbuntuのGCCを起動するWindowsバッチファイルでWindows側カレントフォルダをUbuntu側へ自動反映する

何のことかと言うと、以前のやり方では、Windows側Eclipse上で選択したビルド対象プロジェクトに応じて
Ubuntu側でGCCが起動されるカレントフォルダをVMware Player上のUbuntuで手作業で適宜変更する必要が
あったのですが、今回のやり方では、バッチファイルで自動化したので手作業が不要になったということです。

今回改良したバッチファイルは、以下の通りです。

ファイル: vmw-gcc.bat vmw-as.bat vmw-rm.bat
内容(3つとも同じです):
@echo off
rem This code is in the public domain. You may use, modify or distribute it freely.

rem Linuxライクなフォルダ階層にしたWindows側のZ:のカレントフォルダのパスを取得
rem rem rem echo WINPATH=%CD%
if /i not '%CD:~0,2%'=='Z:' echo カレントドライブが Z: ではありません & exit /b 1
set TEMPSTR=%CD:~2%

rem 取得したZ:のカレントフォルダのパス文字列のパス区切り文字を'\'から'/'へ変更
set LINUXPATH=%TEMPSTR:\=/%
rem rem rem echo LINUXPATH=%LINUXPATH%

rem Windows側バッチファイル名から先頭の"vmw-"を取り除きLinux側コマンド名を生成
set TEMPSTR=%~n0
set LINUXCMD=%TEMPSTR:~4%

rem VMwareのCOMポートでリモートのLinux側のカレントフォルダ変更後にコマンド実行
rem 日本語コードがUnbutu側とWindows/Eclipse側で異なるので英語モードにしておく
cscript -nologo %~dp0\vmwshdo.js \\.\pipe\vmware-serial-port LANG=en_US ; cd '%LINUXPATH%' ; '%LINUXCMD%' %*


なお、バッチファイルでは、Pleiades 4.3 KeplerのワークスペースがZ:に作成されているものとしています。
(正確には、要件はもう少し緩くて、Eclipseがビルドを実行する時のビルドフォルダがZ:であれば良いです。)



また、今回、今までUbuntuのコマンドプロンプトから手作業で起動していたCOMポート経由で操作するshを、
Ubuntuの自動起動するアプリケーションの1つとして登録し、自動的に起動するようにしました。


名前:       シリアルポートコンソール
コマンド:       sh -c 'sh < /dev/ttyS1 > /dev/ttyS1 2> /dev/ttyS1'


さらに、今までは、/dev/ttyS1などのシリアルポートをアクセス出来るようにする為にUbuntu起動後に毎回
sudo + chmod コマンドでシリアルポートのアクセス属性を変更していましたが、今回から、以下のように
sudo + usermod コマンドでユーザ属性にシリアルポートへのアクセス権限があるグループ属性を追加する
ようにしました。この処置は、1回行ってしまえば、それ以後のUbuntu起動時には自動的に引き継がれます。

ll /dev/ttyS1 /dev/ttyS2 /dev/ttyS3
groups ubuntu
usermod -a -G dialout ubuntu
groups ubuntu



追記 : メモ

その後、sudoコマンドにパスワードを標準入力から読み込む-Sオプションがあったことに気付きましたので、
VMware Playerの共有フォルダのマウントやルートフォルダのリマウントも、Ubuntuの自動起動するアプリ
ケーションとして登録して行うようにしました。(なお、C:\は必要に応じてマウントするだけで充分かと。)

名前:       フォルダのマウント /cygdrive/c
コマンド:       sh -c 'echo ubuntu | sudo -S mount -t vmhgfs .host:/drive_c /cygdrive/c'
名前:       フォルダのマウント /cygdrive/e
コマンド:       sh -c 'echo ubuntu | sudo -S mount -t vmhgfs .host:/drive_e /cygdrive/e'
名前:       フォルダのマウント ~/Galileo
コマンド:       sh -c 'echo ubuntu | sudo -S mount -t vmhgfs .host:/Galileo ~/Galileo
名前:       フォルダのマウント ~/workspace
コマンド:       sh -c 'echo ubuntu | sudo -S mount -t vmhgfs .host:/e2stwsp ~/workspace
名前:       ルートのリマウント ~/root
コマンド:       sh -c 'echo ubuntu | sudo -S mount --bind / ~/root



ちなみに、これらのVMware Playerの共有フォルダですが、どこをどこへマウントするかは過去のエントリで
やっていたことのままになっています。その後、Windowsの仮想ドライブにVMware Player上のUbuntuの
フォルダをシンボリックリンクする(blog-entry-427)ようにした時にWindows側はZ:を使うようにしたので、
Ubuntu側もZ:\だけマウントしておいて他はUbuntu上でシンボリックリンクするようにしても良さそうです。

追記 : メモ

Windowsのバッチファイルの小技の情報は、コマンドプロンプトで以下のコマンドを実行すると得られます。

SET /?
SETLOCAL /?
ENDLOCAL /?
IF /?
FOR /?
CALL /?
SHIFT /?
GOTO /?
EXIT /?

追記 : メモ

参考にさせて頂いたブログ

Windows batファイル 便利コマンド
http://www.hiihah.info/index.php?Windows%20bat%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%20%E4%BE%BF%E5%88%A9%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89

読ませて頂いたブログ

開発に役立つ,BATファイルの書き方・パターン集(コマンドプロンプトの定石を体系的に学び,バッチ中級者になろう)
http://d.hatena.ne.jp/language_and_engineering/20130502/PatternsOfMSDOSorBAT

関連記事

2014/03/31   blog-entry-435   category: Pleiades & CrossGCC

go page top