Win/Linuxクロス開発 | Pleiades Kepler + VMware Player上のx86 Linux GCCでビルド
以前、VMware Toolsを使ってWindowsとVMware Player上のUbuntuでフォルダを共有したり、ハードウェア
仮想化されたCOMポート経由でWindowsからVMware Player上のUbuntuのコマンドを実行したりしたことが
あったのですが、今回、この2つを組み合わせて、共有フォルダ上のソースファイルをWindowsのPleiades 4.3
Keplerで管理/編集しつつ、VMware Player上のUbuntuのネイティブなx86 Linux GCCを実行してビルドする
ようにしてみました。


プロジェクトの作成は、以下のようにしました。




ここで、Windowsエクスプローラーで必要なソースファイルをプロジェクトフォルダにコピーし、Eclipse
上でプロジェクトをリフレッシュしました。また、元々のプログラムに.Cファイルをインクルードしている
箇所があり、そのままビルドするとリンク時にシンボル重複エラーになってしまうので、その.Cファイルを
ビルドから除外しました。また、ビルドに必要なバッチファイルやスクリプトファイルも追加しました。





ワークスペースの設定は、3つ前のエントリに書いた設定と同じままにしました。
プロジェクトのプロパティは、以下のようにしました。今回、GCCをバッチファイル経由で呼び出すように
しています。










また、rmコマンドもバッチファイル経由で呼び出す必要がありましたので試行錯誤したところ、Eclipseの
プロジェクトファイルである.cprojectファイルに対し、以下の置換を2箇所行えば良さそうなことが分かり
ました。そこで、エディタで置換を行いました。
ファイル: .cproject
置換内容: rm -rf → vmw-rm.bat -rf
その後、この内容を反映させるため、一旦、Eclipseをリスタートさせました。

WindowsとVMware Player上のUbuntuで、以下のようにフォルダを共有するように設定しました。


mkdir ~/kensa_VMWCGPJ
sudo mount -t vmhgfs .host:/kensa_VMWCGPJ ~/kensa_VMWCGPJ
ls ~/kensa_VMWCGPJ

その後、WindowsとMVware Player上のUbuntuで、以下のようにWindowsからのコマンドを待つように
しました。
mkdir ~/kensa_VMWCGPJ/Debug
cd ~/kensa_VMWCGPJ/Debug
export LANG=en_US
sudo chmod o+rw /dev/ttyS1
sh < /dev/ttyS1 > /dev/ttyS1 2> /dev/ttyS1
使用したバッチファイルやスクリプトは、以下の通りです。
ファイル: vmw-gcc.bat
内容:
@rem This code is in the public domain. You may use, modify or distribute it freely.
@cscript -nologo %~dp0\vmwshdo.js \\.\pipe\vmware-serial-port gcc %*
ファイル: vmw-as.bat
内容:
@rem This code is in the public domain. You may use, modify or distribute it freely.
@cscript -nologo %~dp0\vmwshdo.js \\.\pipe\vmware-serial-port as %*
ファイル: vmw-rm.bat
内容:
@rem This code is in the public domain. You may use, modify or distribute it freely.
@cscript -nologo %~dp0\vmwshdo.js \\.\pipe\vmware-serial-port rm %*
ファイル: vmwshdoexit.cmd
内容:
@rem This code is in the public domain. You may use, modify or distribute it freely.
@cscript -nologo %~dp0\vmwshdo.js \\.\pipe\vmware-serial-port exit
ファイル: vmwshdo.js
内容:
// This code is in the public domain. You may use, modify or distribute it freely.
var fso, f, ts, str;
var ForReading = 1, ForWriting = 2, ForAppending = 8;
var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0;
var VMwareSerialMaxRetry = 10;
var VMwareSerialPortPipe = WScript.Arguments(0);
var VMwareExecuteCommand = "";
for (i = 1; i < WScript.Arguments.length; i++)
{
VMwareExecuteCommand += WScript.Arguments(i) + " ";
}
fso = new ActiveXObject("Scripting.FileSystemObject");
for( i = 0; i < VMwareSerialMaxRetry; i++ )
{
try
{
f = fso.GetFile(VMwareSerialPortPipe);
break;
}
catch(e)
{
if( i == VMwareSerialMaxRetry - 1 ){
// 指定された名前付きパイプが見つからなかった
WScript.Quit(1);
}
WScript.Sleep(100); // ms
}
}
// コマンドの送信(実行終了の目印に[[[END]]]が来るよう"; echo [[[END]]]"を付加して送信する)
for( i = 0; i < VMwareSerialMaxRetry; i++ )
{
try
{
ts = f.OpenAsTextStream(ForAppending, TristateFalse);
break;
}
catch(e)
{
if( i == VMwareSerialMaxRetry - 1 ){
// 指定された名前付きパイプを他のプログラムが使用している(or 取られた)?
WScript.Quit(1);
}
WScript.Sleep(100); // ms
}
}
str = VMwareExecuteCommand;
// パス区切り文字を変更し、最後に"; echo [[[END]]]"を付加する
str = str.replace(/\\/g,"/") + "; echo [[[END]]]";
ts.WriteLine(str);
ts.Close();
// 実行結果の受信(実行終了の目印の[[[END]]]が来るまで受信する)
for( i = 0; i < VMwareSerialMaxRetry; i++ )
{
try
{
ts = f.OpenAsTextStream(ForReading, TristateFalse);
break;
}
catch(e)
{
if( i == VMwareSerialMaxRetry - 1 ){
// 指定された名前付きパイプを他のプログラムが使用している(or 取られた)?
WScript.Quit(1);
}
WScript.Sleep(100); // ms
}
}
while (1)
{
for( i = 0; i < VMwareSerialMaxRetry; i++ )
{
try
{
// しまった。ブロッキングリードだから最大リトライ回数チェックは無駄だった。
str = ts.ReadLine();
break;
}
catch(e)
{
if( i == VMwareSerialMaxRetry - 1 ){
WScript.Quit(1);
}
WScript.Sleep(100); // ms
}
}
if (str.search(/exit ; echo \[\[\[END\]\]\]$/) != -1)
{
// exitコマンドでは目印の[[[END]]]が来ないので待たずに終了
break;
}
if (str.search(/^\[\[\[END\]\]\]/) != -1)
{
// コマンドの実行終了の目印の[[[END]]]が来たら終了
break;
}
if (str.search(/ ; echo \[\[\[END\]\]\]$/) == -1 && str.search(/^[ \t]*$/) == -1)
{
// コマンドのエコーバックと空行を除きコマンドの実行結果を画面に表示する
WScript.Echo(str);
}
}
ts.Close();
WScript.Quit(0)
クリーン時には、以下のように、vmw-rm.batコマンドが実行されます。

なお、ビルドログは以下の通りでした。
BuildLog.txt
追記 : メモ
この'kensa'プログラムは、元々CEV-RZ/A1Lで動かすプログラムなので、VMware Player上のUbuntuでは
動作しません。それでも、起動ぐらいは出来そうですので、TeraTermからハードウェア仮想化されたCOM
ポート経由で接続して、GDBでmain()の先頭まで実行させてみました。



後になって気付いたのですが、Ubuntuのx86のGNUコンパイラもLinaroなのですね。GDBだけでなくGCCも
'Ubuntu/Linaro'となっていました。

追記 : メモ
もっとも、このようなビルドの仕方をしなくても、Windows上で動作するx86 Linux GCCがあれば事足りる
ことなので、そのようなバイナリパッケージがウェブ上にないか、あるいは、CEV Linux SDK V2.00.00の
セットアップスクリプトで'gccをlinaroバイナリからgcc-4.7.3ソースからコンパイルするように変更'された
箇所を改造して、VMware Player上のUbuntuでLinux版ARM Linux GCCだけでなくWindows版ARM Linux
GCCに加えてWindows版x86 Linux GCCもコンパイルされるように出来ないか、調べてみたいと思います。
仮想化されたCOMポート経由でWindowsからVMware Player上のUbuntuのコマンドを実行したりしたことが
あったのですが、今回、この2つを組み合わせて、共有フォルダ上のソースファイルをWindowsのPleiades 4.3
Keplerで管理/編集しつつ、VMware Player上のUbuntuのネイティブなx86 Linux GCCを実行してビルドする
ようにしてみました。


プロジェクトの作成は、以下のようにしました。




ここで、Windowsエクスプローラーで必要なソースファイルをプロジェクトフォルダにコピーし、Eclipse
上でプロジェクトをリフレッシュしました。また、元々のプログラムに.Cファイルをインクルードしている
箇所があり、そのままビルドするとリンク時にシンボル重複エラーになってしまうので、その.Cファイルを
ビルドから除外しました。また、ビルドに必要なバッチファイルやスクリプトファイルも追加しました。





ワークスペースの設定は、3つ前のエントリに書いた設定と同じままにしました。
プロジェクトのプロパティは、以下のようにしました。今回、GCCをバッチファイル経由で呼び出すように
しています。










また、rmコマンドもバッチファイル経由で呼び出す必要がありましたので試行錯誤したところ、Eclipseの
プロジェクトファイルである.cprojectファイルに対し、以下の置換を2箇所行えば良さそうなことが分かり
ました。そこで、エディタで置換を行いました。
ファイル: .cproject
置換内容: rm -rf → vmw-rm.bat -rf
その後、この内容を反映させるため、一旦、Eclipseをリスタートさせました。

WindowsとVMware Player上のUbuntuで、以下のようにフォルダを共有するように設定しました。


mkdir ~/kensa_VMWCGPJ
sudo mount -t vmhgfs .host:/kensa_VMWCGPJ ~/kensa_VMWCGPJ
ls ~/kensa_VMWCGPJ

その後、WindowsとMVware Player上のUbuntuで、以下のようにWindowsからのコマンドを待つように
しました。
mkdir ~/kensa_VMWCGPJ/Debug
cd ~/kensa_VMWCGPJ/Debug
export LANG=en_US
sudo chmod o+rw /dev/ttyS1
sh < /dev/ttyS1 > /dev/ttyS1 2> /dev/ttyS1

使用したバッチファイルやスクリプトは、以下の通りです。
ファイル: vmw-gcc.bat
内容:
@rem This code is in the public domain. You may use, modify or distribute it freely.
@cscript -nologo %~dp0\vmwshdo.js \\.\pipe\vmware-serial-port gcc %*
ファイル: vmw-as.bat
内容:
@rem This code is in the public domain. You may use, modify or distribute it freely.
@cscript -nologo %~dp0\vmwshdo.js \\.\pipe\vmware-serial-port as %*
ファイル: vmw-rm.bat
内容:
@rem This code is in the public domain. You may use, modify or distribute it freely.
@cscript -nologo %~dp0\vmwshdo.js \\.\pipe\vmware-serial-port rm %*
ファイル: vmwshdoexit.cmd
内容:
@rem This code is in the public domain. You may use, modify or distribute it freely.
@cscript -nologo %~dp0\vmwshdo.js \\.\pipe\vmware-serial-port exit
ファイル: vmwshdo.js
内容:
// This code is in the public domain. You may use, modify or distribute it freely.
var fso, f, ts, str;
var ForReading = 1, ForWriting = 2, ForAppending = 8;
var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0;
var VMwareSerialMaxRetry = 10;
var VMwareSerialPortPipe = WScript.Arguments(0);
var VMwareExecuteCommand = "";
for (i = 1; i < WScript.Arguments.length; i++)
{
VMwareExecuteCommand += WScript.Arguments(i) + " ";
}
fso = new ActiveXObject("Scripting.FileSystemObject");
for( i = 0; i < VMwareSerialMaxRetry; i++ )
{
try
{
f = fso.GetFile(VMwareSerialPortPipe);
break;
}
catch(e)
{
if( i == VMwareSerialMaxRetry - 1 ){
// 指定された名前付きパイプが見つからなかった
WScript.Quit(1);
}
WScript.Sleep(100); // ms
}
}
// コマンドの送信(実行終了の目印に[[[END]]]が来るよう"; echo [[[END]]]"を付加して送信する)
for( i = 0; i < VMwareSerialMaxRetry; i++ )
{
try
{
ts = f.OpenAsTextStream(ForAppending, TristateFalse);
break;
}
catch(e)
{
if( i == VMwareSerialMaxRetry - 1 ){
// 指定された名前付きパイプを他のプログラムが使用している(or 取られた)?
WScript.Quit(1);
}
WScript.Sleep(100); // ms
}
}
str = VMwareExecuteCommand;
// パス区切り文字を変更し、最後に"; echo [[[END]]]"を付加する
str = str.replace(/\\/g,"/") + "; echo [[[END]]]";
ts.WriteLine(str);
ts.Close();
// 実行結果の受信(実行終了の目印の[[[END]]]が来るまで受信する)
for( i = 0; i < VMwareSerialMaxRetry; i++ )
{
try
{
ts = f.OpenAsTextStream(ForReading, TristateFalse);
break;
}
catch(e)
{
if( i == VMwareSerialMaxRetry - 1 ){
// 指定された名前付きパイプを他のプログラムが使用している(or 取られた)?
WScript.Quit(1);
}
WScript.Sleep(100); // ms
}
}
while (1)
{
for( i = 0; i < VMwareSerialMaxRetry; i++ )
{
try
{
// しまった。ブロッキングリードだから最大リトライ回数チェックは無駄だった。
str = ts.ReadLine();
break;
}
catch(e)
{
if( i == VMwareSerialMaxRetry - 1 ){
WScript.Quit(1);
}
WScript.Sleep(100); // ms
}
}
if (str.search(/exit ; echo \[\[\[END\]\]\]$/) != -1)
{
// exitコマンドでは目印の[[[END]]]が来ないので待たずに終了
break;
}
if (str.search(/^\[\[\[END\]\]\]/) != -1)
{
// コマンドの実行終了の目印の[[[END]]]が来たら終了
break;
}
if (str.search(/ ; echo \[\[\[END\]\]\]$/) == -1 && str.search(/^[ \t]*$/) == -1)
{
// コマンドのエコーバックと空行を除きコマンドの実行結果を画面に表示する
WScript.Echo(str);
}
}
ts.Close();
WScript.Quit(0)
クリーン時には、以下のように、vmw-rm.batコマンドが実行されます。

なお、ビルドログは以下の通りでした。
BuildLog.txt
追記 : メモ
この'kensa'プログラムは、元々CEV-RZ/A1Lで動かすプログラムなので、VMware Player上のUbuntuでは
動作しません。それでも、起動ぐらいは出来そうですので、TeraTermからハードウェア仮想化されたCOM
ポート経由で接続して、GDBでmain()の先頭まで実行させてみました。



後になって気付いたのですが、Ubuntuのx86のGNUコンパイラもLinaroなのですね。GDBだけでなくGCCも
'Ubuntu/Linaro'となっていました。

追記 : メモ
もっとも、このようなビルドの仕方をしなくても、Windows上で動作するx86 Linux GCCがあれば事足りる
ことなので、そのようなバイナリパッケージがウェブ上にないか、あるいは、CEV Linux SDK V2.00.00の
セットアップスクリプトで'gccをlinaroバイナリからgcc-4.7.3ソースからコンパイルするように変更'された
箇所を改造して、VMware Player上のUbuntuでLinux版ARM Linux GCCだけでなくWindows版ARM Linux
GCCに加えてWindows版x86 Linux GCCもコンパイルされるように出来ないか、調べてみたいと思います。
- 関連記事
-
- RZマイコン基板(CEV-RZ/A1L) | 'kensa'プログラムをPleiades Kepler + KPIT ARM-RZでビルド→失敗
- RZマイコン基板(CEV-RZ/A1L) | 'kensa'プログラムをPleiades Kepler + Visual C++でビルド→失敗
- RZマイコン基板(CEV-RZ/A1L) | Pleiades Keplerでソースコードをプロジェクト間で共有
- RZマイコン基板(CEV-RZ/A1L) | 'kensa'プログラムをPleiades Kepler + Cygwin GDBでデバッグ
- RZマイコン基板(CEV-RZ/A1L) | 'kensa'プログラムをPleiades Kepler + Cygwin GCCでビルド
- RZマイコン基板(CEV-RZ/A1L) | 'kensa'プログラムをPleiades Kepler + MinGW GCCでビルド→失敗
- Win/Linuxクロス開発 | Pleiades Kepler + VMware Player上のx86 Linux GDBでデバッグ
- Win/Linuxクロス開発 | Pleiades Kepler + VMware Player上のx86 Linux GCCでビルド
- RZマイコン基板(CEV-RZ/A1L) | Pleiades Kepler + Windows版Linaro ARM Linux GCCでビルド (3)
- RZマイコン基板(CEV-RZ/A1L) | Pleiades Kepler + Windows版Linaro ARM Linux GCCでビルド (2)
- RZマイコン基板(CEV-RZ/A1L) | Pleiades Kepler + Windows版Linaro ARM Linux GCCでビルド (1)
- RZマイコン基板(CEV-RZ/A1L) | Windows版Linaro ARM Linux GCCで'kensa'プログラムをビルド
- RZマイコン基板(CEV-RZ/A1L) | Windows版Linaro ARM Linux GCCを使えば事足りるのかも
- RZマイコン基板(CEV-RZ/A1L) | CEV Linux SDK V2.00.00がリリースされていた
- Win/Linuxクロス開発 | WindowsからVMware Player上のUbuntuのコマンドを実行
2013/12/11 blog-entry-382 category: Pleiades & CrossGCC
| h o m e |