なんとかなるさね

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


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

前のエントリで、VMware Playerのハードウェア仮想化されたCOMポート経由でWindowsのPleiades 4.3
KeplerからVMware Player上のUbuntuのネイティブなx86 Linux GCCを実行してビルドする自作のバッチ
ファイルをEXEファイルに変換してみました。今回、そのEXEファイルをPleiades 4.3 Keplerで試してみた
ところ、以下の点で考慮が足りなかったことが分かりましたのでバッチファイルを修正しました。

* Eclipseはユーザの目に見えないところでGCCを起動してインクルードファイルフォルダやライブラリ
 ファイルフォルダのパスを得ているが、この時にGCCがEclipseのホームフォルダ上で起動されている。
 (自作のバッチファイルは仮想ドライブZ:上でGCCが起動されることを前提にしていた。)

* また、この時にGCCが出力するパスは'/'で始まるLinux流のパス表記であるが、Windows版Eclipseの
 プロジェクトエクスプローラーウィンドウで正しく認識されない。(編集ウィンドウやアウトライン
 ウィンドウでは認識されているようなのですが、プロジェクトエクスプローラーウィンドウでは"Z:"
 などのドライブ表記で始まっていないと認識されないようでした。)

バッチファイルを修正した結果、普通に近い手順で作成したGCCプロジェクトでビルド/クリーンが出来る
ようになりました。MinGW GCCプロジェクトやCYGWIN GCCプロジェクトを作成する場合と異なるのは、
Windows版EclipseでLinux GCCプロジェクトを作成している点と環境変数PATHに事前に明示的にGCCの
パスを設定している点です。(ただ、ビルドの中断が出来ないとか、まだ改良すべき点がありますが。)






修正したBATファイルと追加したJSファイルは、以下の通りです。

ファイル: WinLinux.bat
内容:
@echo off
rem This code is in the public domain. You may use, modify or distribute it freely.

rem カレントドライブがZ:でなければカレントフォルダにeclipse.exeやe2studio.exeが
rem あるかどうか調べ、あった場合は取り合えずカレントドライブをZ:へ変更しておく
if /i not '%CD:~0,2%'=='Z:' if exist eclipse.exe cd /d Z:
if /i not '%CD:~0,2%'=='Z:' if exist e2studio.exe cd /d Z:

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 コマンド名文字列の前'''と後'''の除去とコマンド文字列の"Z:/"から"/"への変更
set TEMPSTR=%1
set CMDNAME=%TEMPSTR:~1,-1%
rem rem rem echo CMDNAME=%CMDNAME%
set TEMPSTR=%*
rem rem rem echo WINARGS=%TEMPSTR%
set LINUXARGS=%TEMPSTR:Z:/=/%
rem rem rem echo LINUXARGS=%LINUXARGS%

rem PATH中にcscript.exeが見つからない場合に備えてPATHにcmd.exeのパス部分を追加
set PATH=%PATH%;%COMSPEC:\cmd.exe=%

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


ファイル: gcc_outputconv.js g++_outputconv.js
内容(どちらも同じです):
// This code is in the public domain. You may use, modify or distribute it freely.
var stdin = WScript.StdIn;
var stdout = WScript.StdOut;
var str;

while (!stdin.AtEndOfStream)
{
    str = stdin.ReadLine();

    // 空行ならスキップ
    if (str == "")
    {
        continue;
    }

    // パスを変換
    str = str.replace(/[^a-zA-Z0-9_]\/usr\//g, "Z:/usr/");

    stdout.WriteLine(str);
}


ちなみに、VMware Player上のx86 Linux GCCが出力するLinux流のパス表記のままですと、以下のように
Windows版Eclipseのプロジェクトエクスプローラーウィンドウで正しく認識されません。(各インクルード
ファイルフォルダがグレー表示になってしまっています。他方、編集ウィンドウでiostreamをインクルード
している行が文法エラーになっていなかったり、アウトラインウィンドウでiostreamをダブルクリックする
とiostreamファイルが表示されたりしますので、これらのウィンドウでは認識されているようです。)



以下、プロジェクト作成時の画像を列挙します。















追記 : メモ

今回、VMware Player上のUbuntu 12.04のx86 Linux GCCのデフォルトのインクルードフォルダは以下の
通りでした。

/usr/include
/usr/include/c++/4.6
/usr/include/c++/4.6/backward
/usr/include/c++/4.6/i686-linux-gnu
/usr/include/i386-linux-gnu
/usr/lib/gcc/i686-linux-gnu/4.6/include
/usr/lib/gcc/i686-linux-gnu/4.6/include-fixed
/usr/local/include

なお、これらは自作のバッチファイルにより自動的に以下のように変換され、Pleiades(というかEclipse)に
取り込まれています。

Z:/usr/include
Z:/usr/include/c++/4.6
Z:/usr/include/c++/4.6/backward
Z:/usr/include/c++/4.6/i686-linux-gnu
Z:/usr/include/i386-linux-gnu
Z:/usr/lib/gcc/i686-linux-gnu/4.6/include
Z:/usr/lib/gcc/i686-linux-gnu/4.6/include-fixed
Z:/usr/local/include

関連記事

2014/04/08   blog-entry-437   category: Pleiades & CrossGCC

go page top