[Lazurite 920J #5] Lazurite IDEのビルドを高速化

Lazurite IDEに同封のライブラリで発生する、Warningを調べていたところ、
> プログラムのビルド、転送とも、結構時間がかかると感じた。（[[Lazurite 920J #3] Lチカ](http://qiita.com/matsujirushi/items/1183a2e421b970f46d40)）

の、プログラムのビルドを時間短縮する方法が見つかったのでアップします。
> こちらの方がスマートに実現できました。
> [[Lazurite 920J #6] Lazurite IDEのビルドを高速化 その２](http://qiita.com/matsujirushi/items/58a766287a2adc85c601)

#Lazurite IDEのビルド処理
Lazurite IDEでblue_led.cをビルドすると、下図赤枠の部分にワァーっと文字が流れていき、.binができあがります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/90ae1495-578a-f83b-7d94-eeba50748a54.png)

このワァーをじっくりと見ると、.cファイルと.asmファイルをコマンドラインでコンパイル&リンクして.binファイルを生成していることがわかります。.c->.asm->.obj->.abs->.hex->.binという流れですね。
##![1.png](https://qiita-image-store.s3.amazonaws.com/0/109634/25fb02f4-71b0-e9bb-165b-5b1d0426dc2b.png)

コンパイルの対象ファイル数は32。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/109634/01daf1e3-5828-7432-091b-0a7423dbf2b1.png)

MakeやCMakeが使われていないようで、2回目以降のビルドでも、**全てのファイルに対してコンパイルしているぅ！**

#調査
##.objは残っているか？
*2回目以降のビルドのときまで、コンパイルした結果の.objは残っているか？（Lazurite IDEによって消されていないか？）*
ソースファイルのobjフォルダ配下に残っていました。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/109634/0a3dfd8b-2477-b25d-fd9a-115a3399bc87.png)

##Make/CMakeにできないか？
*Lazurite IDEでビルドしたときに、Make/CMakeを呼び出すようにできないか？*
Lazurite IDEが（バッチファイルなどを介さずに）コマンドラインを直接呼びしているようで、介入する手段が無さそう。
> ダメモトで、後日、ロームさんにフィードバックしてみよう。

#CCU8/RASU8を偽装できないか？
*CCU8/RASU8を偽装するプログラムを仕込んで、.c/.asmと.objの最終更新日をチェックして本物のCCU8/RASU8を呼び出すことはできないか？*
まぁ、できそうではある。

#マイコンボードの種類を増やせないか？
*マイコンボードの種類を増やして、初回用と2回目以降用のビルドを用意できないか？*
C:\LazuriteIDE\hardwareフォルダに.bpfファイルを追加することで、マイコンボードの種類を増やすことができた。また、.bpfファイルに追記することで、**マイコンボードのオプションを増やす**こともできた。
さらに、ビルドで**コンパイル&リンクする.c/.asmがC:\LazuriteIDE\hardware\lazurite_mini\build\lazurite_mini.bldに書かれてる**ことが分かった。

#ビルドの時間短縮方法
2回目以降用の、マイコンボードのオプションを増やすことで、ビルド時間短縮を実現しましょう。

##2ndビルドの設定を作成
C:\LazuriteIDE\hardware\lazurite_mini\buildフォルダに、lazurite_mini_2nd.bldファイルを作成します。
> コンパイル対象から外すためにPRJSRCをエイヤッと消して、リンクには含めるようLNKOPTを追加しています。

```lazurite_mini_2nd.bld
# Build option file
# INCPATH: file path of include file
# PRJSRC:  Source file
# CMPOPT:  Compile option
# ASMOPT:  ASM option
# PRNDIR:  PRN file output directories
# LNKOPT:  Link options
# PRJLIB:  Project libraries

###### Include Path
INCPATH=hardware\\lazurite_subghz
INCPATH=hardware\\lazurite_subghz\\lazurite
INCPATH=hardware\\lazurite_subghz\\lazurite
INCPATH=hardware\\lazurite_subghz\\ml620q504
INCPATH=hardware\\lazurite_subghz\\ml620q504\\clock
INCPATH=hardware\\lazurite_subghz\\ml620q504\\common
INCPATH=hardware\\lazurite_subghz\\ml620q504\\irq
INCPATH=hardware\\lazurite_subghz\\ml620q504\\lp
INCPATH=hardware\\lazurite_subghz\\ml620q504\\mcu_small
INCPATH=hardware\\lazurite_subghz\\ml620q504\\wdt
INCPATH=hardware\\lazurite_subghz\\SUB_GHZ\\
INCPATH=hardware\\lazurite_subghz\\SUB_GHZ\\CTI\\api
INCPATH=hardware\\lazurite_subghz\\SUB_GHZ\\CTI\\core
INCPATH=hardware\\lazurite_subghz\\SUB_GHZ\\CTI\\hwif
INCPATH=hardware\\lazurite_subghz\\SUB_GHZ\\CTI\\others

###### Compiling source files

###### Compiling option
CMPOPT=/TML620504F
CMPOPT=/MS
CMPOPT=/near
CMPOPT=/SD
CMPOPT=/SL65
CMPOPT=/Ot
CMPOPT=/Oa
CMPOPT=/SS512
CMPOPT=/W3
CMPOPT=/Lv
CMPOPT=/D_ML620Q504
CMPOPT=/DSUBGHZ
CMPOPT=/DLAZURITE_MINI
CMPOPT=/DLAZURITE_IDE
#POWER LED Control for Lazurite Mini
CMPOPT=/DPWR_LED
#LDO power mode control for Lazurite Mini
CMPOPT=/DLDO_CNT

OBJDIR=obj\\

ASMOPT=/MS
ASMOPT=/DN
ASMOPT=/CD
ASMOPT=/SD
ASMOPT=/SL66
ASMOPT=/WRPEAST
ASMOPT=/L
ASMOPT=/S
ASMOPT=/R
ASMOPT=/SF
ASMOPT=/PL60
ASMOPT=/PW79
ASMOPT=/T8
ASMOPT=/NE

PRNDIR=_prn\\

LNKOPT=/STACK(512)
LNKOPT=/D
LNKOPT=/SD
LNKOPT=/S
LNKOPT=/CC

LNKOPT=obj\\ml620504f.obj obj\\main.obj obj\\lazurite_system.obj obj\\flash.obj obj\\analogio.obj obj\\print.obj obj\\digitalio.obj obj\\serial.obj obj\\tone.obj obj\\WInterrupts.obj obj\\wiring_shift.obj obj\\WMath.obj obj\\driver_adc.obj obj\\driver_extirq.obj obj\\driver_gpio.obj obj\\driver_i2c.obj obj\\driver_irq.obj obj\\driver_timer.obj obj\\driver_ftm_timer.obj obj\\driver_tmout.obj obj\\driver_uart.obj obj\\driver_flash.obj obj\\lp_manage.obj obj\\wdt.obj obj\\subghz_api.obj obj\\bp3596.obj obj\\ml7396.obj obj\\hal_lazurite.obj obj\\ml7396_hwif_hal.obj obj\\spi0.obj obj\\wire0.obj

PRJLIB=bin\\u8dev\\Lib\\LU8100SW.lib
PRJLIB=bin\\u8dev\\Lib\\LONGU8.lib
PRJLIB=bin\\u8dev\\Lib\\DOUBLEU8.LIB
PRJLIB=bin\\u8dev\\Lib\\FLOATU8.LIB
PRJLIB=bin\\u8dev\\Lib\\LU8100LW.lib
PRJLIB=bin\\u8dev\\Lib\\muldivu8.lib
```

##マイコンボードのオプションを追加
C:\LazuriteIDE\hardware\lazurite_mini.bpfファイルを編集します。
> **LAZURITE mini series(2nd build)**というオプションを追加するために、ファイルの最後に3行追加しています。

```lazurite_mini.bpf
# MCU BOARD PROJECT FILE
# FILE NAME:  lazurite.pref

MCUBOARD_NAME=LAZURITE mini

MANUFACTURER_NAME=LAPIS
DESCRIPTION_NAME=LAZURITE mini series
CTRL_DRIVER=bin\\lazurite_ft232_ctrl.exe


OPTION_NAME=LAZURITE mini series
OPTION_BUILD=hardware\\lazurite_mini\\build\\lazurite_mini.bld
OPTION_HEADER=hardware\\lazurite_subghz\\lazurite\\lazurite.h

OPTION_NAME=LAZURITE mini series(2nd build)
OPTION_BUILD=hardware\\lazurite_mini\\build\\lazurite_mini_2nd.bld
OPTION_HEADER=hardware\\lazurite_subghz\\lazurite\\lazurite.h
```

##マイコンボードのオプションを変更

プログラムの2回目以降のビルド時は、マイコンボードのオプションを**LAZURITE mini series(2nd build)**にします。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/109634/38bad4a8-ef6b-d4ad-04f0-7cdf004b4586.png)

#あとがき
手動切替が必要なので若干手間ですが、ムチャしない形で改善できたので満足。さらに、LIBU8でライブラリにしておくのが良さそう。
次は、Lazurite 920Jへの転送を高速にしたいところ。
こんなことをやっていては、いつまでたっても無線通信に着手できないなぁ。