かふぇるねにてHEW出力ファイルについて質問に回答しました。
質問の内容は「一度のビルドで複数のオブジェクトファイルを出力したい」と捉えて回答しています。また、マイコンはRXを仮定しています。
オブジェクトファイルを複数出力するには
- ビルドフェーズを追加する
- makeビルドを行い、makeファイルを編集する
の2通りのやり方があると思います。
ビルドフェーズの追加
一見するとこちらの方法が簡単そうに見ええますが、ビルドフェーズにて対応する場合はコマンドラインにて処理する必要があるため、リンカの取り扱いや環境変数の設定にある程度詳しくないと対応が困難です。
また、プロジェクトの内容(リンク条件など)が変わると当然ながら追加したビルドフェーズのメンテナンスも必要になるため、おすすめできません。
makeファイルでビルド
推奨する方法はこちらです。makeファイルの記述方法を理解されている方はゴリ押しで行けますし、分からない場合は以下の方法で差分を取って記述します。
- makeファイルの出力(mot)
- makeファイルの出力(bin)
- makeファイルの比較
- makeファイルの編集
- makeビルドに切り替え
- ビルド結果の確認
対象となるプロジェクトのリンカ出力設定からモトローラ形式である事を確認します。
続いてmot出力条件でのmakeファイルを作成します。
今回はファイル名を「プロジェクト名_コンフィギュレーション名_mot.mak」としました。makeファイルはプロジェクトフォルダの直下に作成されます。
続いてリンカ出力設定をバイナリ形式に変更し、もう一度makeファイルを出力します。
こちらはファイル名を「プロジェクト名_コンフィギュレーション名_bin.mak」としました。
まずはmakeファイルが出力されているか確認します。
プロジェクト名:make、コンフィギュレーション名:Debugであることから、「make_Debug_mot.mak」「make_Debug_bin.mak」の両ファイルが存在していることが確認できました。
続いて内容を比較します。
makeファイル上の相違点はリンカの「出力するファイル名」と「出力フォーマット」のみです。
では実際に編集します。編集ファイルは「make_Debug_mot.mak」をベースとして差分を記述し、「make_Debug.mak」に保存します。
################################################ # Make file generated by HEW # ############################ # Toolchain directory define # If incorrect, change to the location of the RX Standard Toolchain toolchain TC_INSTALL_DIR = c:\program files (x86)\renesas\hew_001\tools\renesas\rx\1_2_1 ##################################################### # # Details: # Project: make # Configuration: Debug # Toolchain: Renesas RX Standard Toolchain # ##################################################### ################ # Main Defines # Renesas RX C/C++ Library Generator01 phase MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_EXE=lbgrx.exe MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_EXEDIR=$(TC_INSTALL_DIR)\bin MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_OUTFILESC0="Debug\make.lib" MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_DEPFILESC0="$(TC_INSTALL_DIR)\bin\libinc_C89.pak" # Renesas RX C/C++ Compiler02 phase MAKE_DEBUG_RX_CC_COMPILER02_EXE=ccrx.exe MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC0="Debug\dbsct.obj" MAKE_DEBUG_RX_CC_COMPILER02_DEPFILESC0="typedefine.h" MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC1="Debug\lowsrc.obj" MAKE_DEBUG_RX_CC_COMPILER02_DEPFILESC1="$(TC_INSTALL_DIR)\include\string.h" "$(TC_INSTALL_DIR)\include\macro.h" "$(TC_INSTALL_DIR)\include\sys\yvals.h" \ "$(TC_INSTALL_DIR)\include\stdarg.h" "$(TC_INSTALL_DIR)\include\errno.h" "$(TC_INSTALL_DIR)\include\stdio.h" \ "$(TC_INSTALL_DIR)\include\stddef.h" "lowsrc.h" MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC2="Debug\sbrk.obj" MAKE_DEBUG_RX_CC_COMPILER02_DEPFILESC2="$(TC_INSTALL_DIR)\include\stddef.h" "$(TC_INSTALL_DIR)\include\macro.h" "$(TC_INSTALL_DIR)\include\sys\yvals.h" \ "$(TC_INSTALL_DIR)\include\stdarg.h" "$(TC_INSTALL_DIR)\include\errno.h" "$(TC_INSTALL_DIR)\include\stdio.h" \ "typedefine.h" "sbrk.h" MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC3="Debug\intprg.obj" MAKE_DEBUG_RX_CC_COMPILER02_DEPFILESC3="$(TC_INSTALL_DIR)\include\machine.h" "$(TC_INSTALL_DIR)\include\macro.h" "$(TC_INSTALL_DIR)\include\builtin.h" \ "vect.h" MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC4="Debug\vecttbl.obj" MAKE_DEBUG_RX_CC_COMPILER02_DEPFILESC4="vect.h" MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC5="Debug\resetprg.obj" MAKE_DEBUG_RX_CC_COMPILER02_DEPFILESC5="$(TC_INSTALL_DIR)\include\machine.h" "$(TC_INSTALL_DIR)\include\macro.h" "$(TC_INSTALL_DIR)\include\builtin.h" \ "$(TC_INSTALL_DIR)\include\_h_c_lib.h" "typedefine.h" "stacksct.h" MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC6="Debug\hwsetup.obj" MAKE_DEBUG_RX_CC_COMPILER02_DEPFILESC6="iodefine.h" MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC7="Debug\make.obj" # Renesas RX Assembler03 phase MAKE_DEBUG_RX_ASSEMBLER03_EXE=asrx.exe MAKE_DEBUG_RX_ASSEMBLER03_OUTFILESC0="Debug\lowlvl.obj" # Renesas OptLinker04 phase MAKE_DEBUG_OPTLINKER04_EXE=LnkSpawn.exe MAKE_DEBUG_OPTLINKER04_INFILESC0="Debug\dbsct.obj" "Debug\hwsetup.obj" "Debug\intprg.obj" "Debug\lowlvl.obj" "Debug\lowsrc.obj" \ "Debug\make.lib" "Debug\make.obj" "Debug\resetprg.obj" "Debug\sbrk.obj" "Debug\vecttbl.obj" MAKE_DEBUG_OPTLINKER04_OUTFILESC0="Debug\make.mot" "Debug\make.abs" "Debug\make.map" MAKE_DEBUG_OPTLINKER04_OUTFILESC1="Debug\make.bin" "Debug\make.abs" ####################### # nmake "all" statement ALL: MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_ENVC0 \ $(MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_OUTFILESC0) \ $(MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC0) \ $(MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC1) \ $(MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC2) \ $(MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC3) \ $(MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC4) \ $(MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC5) \ $(MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC6) \ $(MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC7) \ $(MAKE_DEBUG_RX_ASSEMBLER03_OUTFILESC0) \ $(MAKE_DEBUG_OPTLINKER04_OUTFILESC0) \ $(MAKE_DEBUG_OPTLINKER04_OUTFILESC1) #################### # Description blocks !MESSAGE !MESSAGE Executing Renesas RX C/C++ Library Generator01 phase !MESSAGE MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_ENVC0 : set INC_RX=$(TC_INSTALL_DIR)\include set PATH=$(TC_INSTALL_DIR)\bin set BIN_RX=$(TC_INSTALL_DIR)\bin set TMP_RX=C:\Users\kon-n\AppData\Local\Temp $(MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_OUTFILESC0) : $(MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_DEPFILESC0) "$(MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_EXEDIR)\$(MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_EXE)" -subcommand=<< -cpu=rx600 -endian=big -dbl_size=8 -signed_char -bit_order=left -int_to_short -exception -fint_register=1 -base=rom=R12,ram=R11 -output="Debug\make.lib" -head=runtime,ctype,math,stdarg,stdio,stdlib,string << !MESSAGE !MESSAGE Executing Renesas RX C/C++ Compiler02 phase !MESSAGE $(MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC0) : "dbsct.c" $(MAKE_DEBUG_RX_CC_COMPILER02_DEPFILESC0) "$(MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_EXEDIR)\$(MAKE_DEBUG_RX_CC_COMPILER02_EXE)" -subcommand=<< -cpu=rx600 -endian=big -dbl_size=8 -signed_char -bit_order=left -int_to_short -fint_register=1 -base=rom=R12,ram=R11 -lang=c -output=obj="Debug\dbsct.obj" -debug "dbsct.c" -nologo << ~以降、コンパイラフェーズ略~ !MESSAGE !MESSAGE Executing Renesas RX Assembler03 phase !MESSAGE $(MAKE_DEBUG_RX_ASSEMBLER03_OUTFILESC0) : "lowlvl.src" "$(MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_EXEDIR)\$(MAKE_DEBUG_RX_ASSEMBLER03_EXE)" -subcommand=<< "lowlvl.src" -cpu=rx600 -endian=big -fint_register=1 -base=rom=R12,ram=R11 -debug -output="Debug\lowlvl.obj" -nologo << !MESSAGE !MESSAGE Executing Renesas OptLinker04 phase !MESSAGE $(MAKE_DEBUG_OPTLINKER04_OUTFILESC0) : $(MAKE_DEBUG_OPTLINKER04_INFILESC0) $(MAKE_DEBUG_OPTLINKER04_EXE) -subcommand=<< noprelink rom D=R,D_1=R_1,D_2=R_2 nomessage list "Debug\make.map" nooptimize -start=B_1,R_1,B_2,R_2,B,R,SU,SI/01000,PResetPRG/0FFFF8000,C_1,C_2,C,C$*,D_1,D_2,D,P,PIntPRG,W*,L/0FFFF8100,FIXEDVECT/0FFFFFFD0 nologo -input="Debug\dbsct.obj" -input="Debug\hwsetup.obj" -input="Debug\intprg.obj" -input="Debug\lowlvl.obj" -input="Debug\lowsrc.obj" -input="Debug\make.obj" -input="Debug\resetprg.obj" -input="Debug\sbrk.obj" -input="Debug\vecttbl.obj" -library="Debug\make.lib" -output="Debug\make.abs" end -input="Debug\make.abs" form stype output "Debug\make.mot" << $(MAKE_DEBUG_OPTLINKER04_OUTFILESC1) : $(MAKE_DEBUG_OPTLINKER04_INFILESC0) $(MAKE_DEBUG_OPTLINKER04_EXE) -subcommand=<< noprelink rom D=R,D_1=R_1,D_2=R_2 nomessage nooptimize -start=B_1,R_1,B_2,R_2,B,R,SU,SI/01000,PResetPRG/0FFFF8000,C_1,C_2,C,C$*,D_1,D_2,D,P,PIntPRG,W*,L/0FFFF8100,FIXEDVECT/0FFFFFFD0 nologo -input="Debug\dbsct.obj" -input="Debug\hwsetup.obj" -input="Debug\intprg.obj" -input="Debug\lowlvl.obj" -input="Debug\lowsrc.obj" -input="Debug\make.obj" -input="Debug\resetprg.obj" -input="Debug\sbrk.obj" -input="Debug\vecttbl.obj" -library="Debug\make.lib" -output="Debug\make.abs" end -input="Debug\make.abs" form binary output "Debug\make.bin" -exit <<
ハイライト箇所が追加、修正したところになります。
修正コンセプトは「既存リンカ(mot出力)を活かし、同一フェーズ(リンカフェーズ)で複数オブジェクトを出力する」です。
よって、リンカが参照するINPUTFILEは共通にしています。また、1回目のリンカ処理でmapは出力しているので2回目のリンカ処理では省いています。内容がよく分からない場合は、「ふんふん、そうやるのか」程度でいいと思います。
makeファイルができたらHEWビルドからmakeビルドに変更します。以下の手順で行ってください。
「makeファイルを使ったビルド」にチェックを付け、今回作成したmakeファイルを指示してください。
初回は必ず「BUILD ALL」をかけてください。2回目以降は通常BUILDでも構いません。
ビルドが無事成功しました。Warnningはいくつか出ていますが問題となる内容ではありませんでした。
ファイルを確認します。
motとbinの両方が同時(更新日時が同じ)に作成されています。
セクション情報を追加、移動、削除を行った場合や、コンパイル対象の増減があった場合にはmakeファイルをメンテナンスする必要があります。
それでもビルドフェーズを追加する方法よりは手間が少なくて済みますのでお試しください。