Attribute System

ジャンク奇行。 ときどき ラクガキ。

広告

※このエリアは、60日間投稿が無い場合に表示されます。記事を投稿すると、表示されなくなります。

わかる人向け MPLAB XC16 野良ビルド資料。

2016-02-16 23:06:01 | 研究&TIPS
 こんばんはヌキヲです。
今日は Microchip 16bit マイコン向けコンパイラ MPLAB XC16 の野良ビルドについて紹介します。
が、すみません、古い資料が出てきたのでそれの開示だけです。
自分で何とかできる人向けの資料とさせてください。

できた成果物はいつも通り 置き場 に置いておきます。
が、今回の成果物は問題点があります。なんと MPLAB X IDE に統合できません。
IDE を使わずに Makefile を自作する方向けとなります。

うーん、我ながらなんてニッチな情報なんだ(笑

ビルドの仕方の詳細については MPLAB XC32 をビルドした記事でも行ってますので
そちらも参考にしてください。

MPLAB XC32 をクロスビルドした。
MPLAB XC32 v1.33 をビルド。



●事前情報

作業は Ubuntu 12.04 LTS で行い。ビルドする MPLAB XC16 のバージョンは v1.23 です。
開発ツール類は各自インストールし、ソースを展開してください。
ビルド自体はおなじみのシェルスクリプトにて自動で行います。
置き場よりダウンロードし実行してください。
ずっとメンテナンスしていない古いままなのでかなり怪しいですが(汗


●ソースの編集

重要なソースの変更情報を記します。
成果物を頒布するのにこれをするのが必須なので GPL はめんどくさいですね(笑

・pic30.h


-147 #define ASM_SPEC   "%{mpartition=*:--partition %*} %{!.s:%{!.S:--relax}} %{mcpu=*:-p%*} -omf=" OMF
+147 #define ASM_SPEC   "%{mpartition=*:--partition %*} %{!.s:%{!.S:--relax}} %{mcpu=*:-p%*} "

-155   -mresource=%I-../../c30_device.info -omf=" OMF
+155   -mresource=%I-../../c30_device.info "

-157 #define LINK_SPEC   "%{mpartition=*:--partition %*} {mcpu=*:-p%*} -omf=" OMF
+157 #define LINK_SPEC   "%{mpartition=*:--partition %*} %{mcpu=*:-p%*} "



ここらはオプションの編集です。
-omf を指定すると -o が2回指定されているというエラーになる部分ですね。




-245 #define STANDARD_BINDIR_PREFIX "/bin/bin/"
+245 #define STANDARD_BINDIR_PREFIX "/bin"



バイナリファイルのフォルダ構成を変更します。



・gcc.c


-2987  info.name = xmalloc(sizeof("xc16-")+strlen(name)+1);
-2988 if (info.name)
-2989 sprintf(info.name, "xc16-%s", name);
+2987 info.name = xmalloc(sizeof("xc16-")+strlen(name)+16);
+2988 if (info.name)
+2989 sprintf(info.name, "xc16-" OMF "-%s", name);



ツールの呼び出しファイル名を変更します。
オプション -omf の代わりにファイル名で切り替えるわけですね。


・pic30.c


-3972   eds_ptr_type = make_node(POINTER_TYPE);
+3972 eds_ptr_type = make_node(INTEGER_TYPE);



これを忘れると cc1 がセグメントフォルトします。
エラーチェックで INTEGER_TYPE かどうか確認しているので当然です。



・acme > bfd > cpu-pic30.c


-229     tool_name = xmalloc(strlen(resource) + 4 + 40);
+229 tool_name = xmalloc(strlen(resource) + 512 );



こっちは binutiles の方です。
リソースファイルを開く際のパス長が短すぎるので伸ばしました。




●まとめ
変更は以上です。
最後に成果物とフリー版とのマージが必要です。
IDE と統合できないので別フォルダで行うことを推奨いたします。


さて、今回は資料なのでこんなもので終わりです。
もしかしたら xc16-gcc.exe というラッパーアプリを作れば
IDE 統合もできるのではないか?と画策中なのですが、まだできていません。
-omf オプションだけチェックしてその後 xc16-coff-gcc.exe と xc16-elf-gcc.exe を
呼び分けるだけですので意外に簡単に作れるのかな?とは思います。(誰か作ってー)
進展したらまた記事を書きたいと思います。

何か質問意見、叱咤激励等ありましたらコメかメールか Twitter でお願いします。
ご精読ありがとうございました。



□ 2016.02.18 (thu) 追記。
 えー、そもそも野良ビルドって何?という意見をもらいました!
需要をあんまり感じないと思ったら、それ以前に認知度が低すぎたのですね!
というわけで簡単に解説。

MPLAB XC16 XC32 はもともと GCC をベースに作られています。
GCC のライセンスは GPL ですので、
成果物を頒布するにはそのソースをビルド可能な状態で入手可能にする必要があります。
MPLAB XC16 XC32 も例外にもれずソースが公開されています。

さてもう一方、GPL は商用非商用問わず好きに使えるという側面があります。
Microchip ではライセンスマネージャというプログラムで機能を制限し高価な価格を設定しています。
その制限されている項目は GCC に元からついている機能ですので、
ライセンスマネージャが有効でなければ当然制限なく使えてしまいます。

そこで、公開されているソースから、無制限版をビルドして活用しようというのが野良ビルドです。
これが蔓延してしまうと Microchip としては商売あがったりなのですが、ライセンス上は問題ありません。
ただ注意点として、野良ビルドの成果物を頒布する場合、その変更点を記すなりして、
やはり再現可能な状態でソースを公開する必要があります。

私は皆様のマイコンライフが少しでも幸せになれるようにと思い公開します。
コメント (3)   この記事についてブログを書く
« マウスの修復。 | トップ | NAS4Free & Samba4 AD »
最新の画像もっと見る

3 コメント

コメント日が  古い順  |   新しい順
いつも貴重な情報をありがとうございます (TDRK)
2017-04-09 15:40:53
いつも貴重な情報を本当にありがとうございます。

ご提供いただいたmplabxc16-123-mingw32.zipを利用して
Windows環境でMPLABX v3.55へ統合された
ビルド環境が作れたので自分用にメモを残しました。
人様にお見せできるものではないですが、
誰かのお役に立てるかもしれないので載せておきます。

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

野良ビルドされたXC16のGCCは純正のものと
フォルダ構造が異なっている。

野良ビルドさらたXC16にはビルド済みのライブラリはないようだったので、
純正のXC16をインストール後、そこに野良ビルドされたXC16を上書きする形で利用する。

野良ビルドだと\binの下に
xc16-coff-***.exe
xc16-elf-***.exe
があるが、純正だと
C:\Program Files (x86)\Microchip\xc16\v*.**\bin
には
xc16-***.exe
があり、その下の
C:\Program Files (x86)\Microchip\xc16\v*.**\bin\bin
の中に
coff-***.exe
elf-***.exe
がある。

純正ではxc16-***.exeで一旦受けて、
対象のバイナリ形式(coff、elf)によって
下のcoff-***.exe、elf-***.exeの
呼び出しを変えているようだった。

そのため、野良ビルドのxc16-coff-***.exeとxc16-elf-***.exeの
xc16-を取ってcoff-***.exe、elf-***.exeにリネームし、
\bin\binの下に入れたところ、
エラーが"xc16-elf-***.exeが無い"に変わった。

このため、リネームしたelf-***.exeが同じフォルダ内に
xc16-elf-***.exeを探しているのだと考え、
xc16-***-***.exeも\bin\binに置いたところ
ヘッダが見つからないというエラーに変わった。

ヘッダ類は
C:\Program Files (x86)\Microchip\xc16\v*.**
にあったが、xc16-elf-***.exeから
見ると一段上にあったので
全部一段下の\bin内にコピーしたところ、
オブジェクトファイルなどは生成されるものの、
リンクが失敗してバイナリができない状態になった。

調べたところ、リンクオプションの中に"-Wl,,~"のように
カンマが2つ以上続いているところがあり、
これをなくした(ex. ",,,"→",")ところ
リンクが通るようになった。ここに問題があると考えた。

調べるとカンマが続いているところは
xc16-elf-ld.exeに空文字列としてオプションが渡されて、
これがエラーになることがわかった。
ビルドオプションの変更ではこのカンマが続く部分を無くす方法がわからなかった。

このため中継ソフトを作り、
実行時引数の空文字列の取り除くようにしたところ、
きちんとコンパイルができるようになった。

中継ソフトはQtを使っているが以下のようなソースの
コマンドラインアプリ。
==================
#include <QCoreApplication>

#include <QDebug>
#include <QString>
#include <QProcess>

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

QStringList argsOrg = QCoreApplication::arguments();
argsOrg.erase(argsOrg.begin());
QStringList argsMod;
for (QString arg : argsOrg) {
if (arg != "") {
argsMod.push_back(arg);
}
}

QString path = QCoreApplication::applicationDirPath() + "/xc16-elf-ld-org.exe";
QProcess::execute(path, argsMod);

return 0;
}
==================

オリジナルのxc16-elf-ld.exeを
xc16-elf-ld-org.exeとリネームし、
このソースをビルドして作ったxc16-elf-ld.exeと
組み合わせて利用する。

問題点が把握できたので
手をかければもうちょっとスマートにできると思う。
Re : いつも貴重な情報を本当にありがとうございます。 (ヌキヲ)
2017-04-09 18:48:47
TDRK さん初めまして、コメントありがとうございます、ヌキヲです。
こちらこそ貴重な IDE 統合の検証をしていただきありがとうございます。

ところで、コメントにあった方法で作った環境は、
MPLAB X IDE からはどのようになっているのでしょうか?
"-Os"などのすべてのオプションは使えていますでしょうか?
なんとなく xc16-lm.exe をうまく騙さないといけないような気がしていますが・・・。

問題のバイナリファイルのフォルダ構成と、その依存関係、
またビルドオプションのエラー"-Wl,,~"などは、クロスビルド時に直せる気がしています。

というのも、XC16 のファルダ構成が独自仕様バリバリだったので、
現在は gcc のデフォルトに近い状態に戻してビルドしているのです。
正確には /pic-coff/bin /pic-elf/bin フォルダを使ってます。

もし、コメントの状態で IDE 統合とフルオプションの使用が可能なら、
ビルド時にすべて対応してしまう価値があると思うので、
ぜひ研究したいと思います。
よろしくお願いします。
ミス (ヌキヲ)
2017-04-10 01:15:05
>正確には /pic-coff/bin /pic-elf/bin フォルダを使ってます。

すみません、ここミスです。
/pic30-coff/bin と /pic30-elf/bin でした。

コメントを投稿

研究&TIPS」カテゴリの最新記事