こんにちは。NoMaYです。Visual Studio 2022を触っていて、これからVisual Studio上でCC-RX/CC-RL/CC-RHを使うならCMakeを使うのが良いのかな?と思い始めたところ、ルネサスさんから以下のアプリケーションノートが発行されていたことを思い出したので目を通してみたのですが、どうもこれではスマートコンフィグレータどころかコンパイルオプションの設定すらe2 studio上では出来ないのでは?という気がしてきました。実際、どうなのでしょう?御存知の方はいらっしゃいますでしょうか?アプリケーションノート 統合開発環境 e² studio CMakeプロジェクトを作成してビルドするR20AN0613JJ0200 Rev.2.00 Pages 10 Jun.30.21www.renesas.com/jp/ja/document/apn/e-studio-creating-and-executing-build-cmake-project [追記] 2021/12/31 11:00ひとつ調査漏れに気付きました。こういうアプリケーションノートも出ていたのですね。アプリケーションノート 統合開発環境 e² studio CMakeを使用してCC-RX用ソース・ファイルをビルドするR20AN0569JJ0201 Rev.2.01 Pages 12 Sep.15.21PDFwww.renesas.com/jp/ja/document/apn/integrated-development-environment-e-studio-using-cmake-renesas-cc-rx-compiler-rev201ZIPwww.renesas.com/jp/ja/document/scd/integrated-development-environment-e-studio-using-cmake-renesas-cc-rx-compiler-rev201-sample-code
こんにちは。NoMaYです。ウェブで調べ物をしていて気付いたのですが、Qt for MCUsがRH850+GHSコンパイラでCMakeでデモプログラムを作っているようですね。CMakeのGHSコンパイラ向け定義ファイルも少し見ておこうかと思いました。Qt Quick Ultralite Automotive Cluster Demodoc.qt.io/archives/QtForMCUs-1.9/quickultralite-automotive-src-hmi-input-rh850-d1m1a-baremetal-cmakelists-txt.html
こんにちは。NoMaYです。> CMakeのGHSコンパイラ向け定義ファイルも少し見ておこうかと思いました。見て不思議に思ったのですが、IARコンパイラ向け定義ファイルと較べて、いくら何でもあっさりし過ぎてますね。何かカラクリがあるのかなぁ、、、gitlab.kitware.com/cmake/cmake/-/blob/master/Modules/Compiler/GHS.cmakegitlab.kitware.com/cmake/cmake/-/blob/master/Modules/Compiler/GHS-C.cmakegitlab.kitware.com/cmake/cmake/-/blob/master/Modules/Compiler/GHS-CXX.cmakegitlab.kitware.com/cmake/cmake/-/blob/master/Modules/Compiler/GHS-DetermineCompiler.cmake以下、ファイル比較ツールで比較した時の画面コピーです。
こんにちは。NoMaYです。試しにCC-RX用のCMakeのコンパイラ定義ファイルを作ろうとしているのですが、以下の点でCC-RXは他のコンパイラと比べてクセがあるような感じですね。(1) LIBGENを使ってユーザ自身が標準ライブラリやランタイムライブラリをビルドしなければならない(プリビルド版が提供されていない)(2) e2 studio(and VSCode and Visual Studio 2022)でデバッグするには実行形式ファイルコンバータを実行しなければならない(3) 環境変数Pathと環境変数BIN_RXにコンパイラのbinフォルダのパスが指定されていなければならない試行錯誤していて気付いたのですが、CMakeのコンパイラ定義ファイルの中のリンクコマンド指定部には以下のように複数コマンドを記述出来るようです。この記述方法を使用すれば、上記の(1)や(2)のCC-RXのクセをCMakeLists.txtでケアしなくてもよくなる(他のコンパイラと特に異なる部分が無くなる)といったような使い方に少し近づけることが出来るかも知れません。
if(RENESAS_XCONVERTER) set(CMAKE_${lang}_LINK_EXECUTABLE "<CMAKE_COMMAND> -E echo Library Generator:" "\"${RENESAS_LIBRARY_GENERATOR}\" -nologo ${RENESAS_LIBRARY_GENERATOR_FLAGS} ${RENESAS_${lang}_FLAGS} <FLAGS> -output=<TARGET>.lib" "<CMAKE_COMMAND> -E echo Linker:" "<CMAKE_LINKER> -nologo <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <LINK_LIBRARIES> <OBJECTS> -form=abs -output=<TARGET>" "<CMAKE_COMMAND> -E echo X Converter:" "\"${RENESAS_XCONVERTER}\" <TARGET> <TARGET>.x ${RENESAS_XCONVERTER_FLAGS}" )else() set(CMAKE_${lang}_LINK_EXECUTABLE "<CMAKE_COMMAND> -E echo Library Generator:" "\"${RENESAS_LIBRARY_GENERATOR}\" -nologo ${RENESAS_LIBRARY_GENERATOR_FLAGS} ${RENESAS_${lang}_FLAGS} <FLAGS> -output=<TARGET>.lib" "<CMAKE_COMMAND> -E echo Linker:" "<CMAKE_LINKER> -nologo <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <LINK_LIBRARIES> <OBJECTS> -form=abs -output=<TARGET>" )endif()
他方、上記の(3)については、私は、以下のスレッドで知見がありましたので、すぐ状況を理解出来ましたが、そうで無い人への対策としてどうあるのが良いのか、悩ましそうです。一応、CMake上で環境変数を操作することは出来そうですけれど、CMakeでのコンフィグレーション後のmake実行時やninja実行時にそれを行わせる手が無さそうな気配を感じています。(もっとも、ninjaに関しては、CC-RXが生成するヘッダファイル依存関係情報ファイルがmakefile互換であるものの実はGCCとは異なっていて(MSVCとも異なっていて)試した時はninjaで弾かれてしまったので、そもそも使えないことになるかも知れない、ようにも感じています。ただ、Microsoftさんはninjaがお好きなご様子で、、、)cc-rxでのプリプロセッサ指令japan.renesasrulz.com/cafe_rene/f/forum5/7012/cc-rx/37630#37630[追記]環境変数の件は、さしあたっては、toolchainファイルというものでエラーメッセージを詳しくっぽくしてみる、ことかなぁ、という気がしましたので、こうしてみました。(以下はMicrosoftさんのAzure RTOSのRX65Nのサンプルコード(CMake+GNURX+VSCode)のCMakeファイルのtoolchainファイルを土台にして、試しにCC-RX用に変更しようとしているtoolchainファイルの途中です。)
set(TOOLCHAIN_EXT ".exe")find_program(COMPILER_ON_PATH "ccrx${TOOLCHAIN_EXT}")if(COMPILER_ON_PATH) # check on the current path get_filename_component(RX_TOOLCHAIN_PATH ${COMPILER_ON_PATH} DIRECTORY) string(REPLACE "/" "\\" _RX_TOOLCHAIN_PATH "${RX_TOOLCHAIN_PATH}") message(STATUS "Using RX CC-RX from path = ${_RX_TOOLCHAIN_PATH}") # check the BIN_RX environment variable for libgen if(NOT DEFINED ENV{BIN_RX}) message(NOTICE "Error: The BIN_RX environment variable is not defined.\n" "RX CC-RX compiler needs its `bin` folder path in the BIN_RX." ) message(FATAL_ERROR "Aborted due to runtime environment error.") elseif(NOT ($ENV{BIN_RX} STREQUAL ${_RX_TOOLCHAIN_PATH})) message(NOTICE "Error: Other RX CC-RX is specified in the BIN_RX = $ENV{BIN_RX}\n" "The same RX CC-RX should be specified in the BIN_RX" ) message(FATAL_ERROR "Aborted due to runtime environment error.") endif() unset(_RX_TOOLCHAIN_PATH)else() # not found message(NOTICE "Error: Unable to find RX CC-RX compiler on the PATH = $ENV{Path}\n" "RX CC-RX compiler needs its `bin` folder path in the PATH." ) # check the BIN_RX environment variable for libgen if(NOT DEFINED ENV{BIN_RX}) message(NOTICE "Error: The BIN_RX environment variable is not defined.\n" "RX CC-RX compiler needs its `bin` folder path in the BIN_RX." ) endif() message(FATAL_ERROR "Aborted due to runtime environment error.")endif()find_program(CONVERTER_ON_PATH "renesas_cc_converter${TOOLCHAIN_EXT}")if(CONVERTER_ON_PATH) # check on the current path get_filename_component(RX_EXTERNAL_TOOLCHAIN_PATH ${CONVERTER_ON_PATH} DIRECTORY) string(REPLACE "/" "\\" _RX_EXTERNAL_TOOLCHAIN_PATH "${RX_EXTERNAL_TOOLCHAIN_PATH}") message(STATUS "Using e2 studio's X Converter from path = ${_RX_EXTERNAL_TOOLCHAIN_PATH}") unset(_RX_EXTERNAL_TOOLCHAIN_PATH)else() # not found message(NOTICE "Warning: Unable to find e2 studio's X Converter on the PATH = $ENV{Path}\n" "Debugging with RX GDB is not available when the converter is not executed." )endif()
こんにちは。NoMaYです。試しに、CC-RX(+VSCode)版の簡単なRXスマートコンフィグレータプロジェクト向けCMakeファイルをMicrosoftさんのAzure RTOSのRX65Nのサンプルコード(CMake+GNURX+VSCode)のCMakeファイルを元にして作ってみました。コンパイラ定義ファイルはIARコンパイラ向け定義ファイルを元にしました(残骸が沢山そのまま残ってます)。まだライブラリはビルド出来ないと思います。ファイルは以下のzipファイルに固めました。CMake_RXSC_CCRX_example_20220118.zip
.vscode/cmake-kits.jsoncmake/renesas-rx-ccrx-rx65n.cmakecmake/renesas-rx-ccrx-toolchain.cmakecmake/utilities.cmakecmake/Modules/Compiler/RENESAS-ASM.cmakecmake/Modules/Compiler/RENESAS-C.cmakecmake/Modules/Compiler/RENESAS-CXX.cmakecmake/Modules/Compiler/RENESAS-DetermineCompiler.cmakecmake/Modules/Compiler/RENESAS.cmakesrc/sample_asm.srcsrc/sample_cpp.cppsrc/tb_rx65n.csrc/smc_gen/...略...linker_command.subCMakeLists.txt
以下、VSCodeの画面コピーです。
こんにちは。NoMaYです。この後、こんな感じの順で調べていくことになるかなぁ、と思ってます、、、(後半は取らぬ狸の皮算用かも?、、、)(1) CC-RLでは?CC-RHでは?(あと、CC-RX V3.04の-type_size_access_to_volatileを追加)(2) 追加/削除されたソースファイルやインクルードフォルダを自動認識するようにするには?(3) (単体)スマートコンフィグレータと良い塩梅に組み合わせて使えるようにならないものか?(4) コンパイラが生成した依存関係情報ファイルを使うようにするには?(それとも使えない?)(5) Ninjaというツールと組み合わせられるようにするには?(それとも組み合わせられない?)(6) 簡単なライブラリをビルド出来るようにする(7) Azure RTOSやAmazon FreeRTOSに関連したCMakeを使う大きなプロジェクトでは?(8) こまごまとした調整など[追記]あと、どこかで発作的に、、、(A) CMakeがコンパイラを自動認識する処理をちゃんと動かせなかったので無効にしてあるけれども何とかするあと、別系列で、、、(a) Visual Studio 2022で使うには?(b) VSCodeやVisual Studio 2022のエラーパーサー向けの小細工(別スレッド版は行頭の[build]のせいで機能しない筈)
NoMaYさん
こんにちはシェルティです。
少し前にいただいたリクエストについてです。
>>ルネサスさんの社内GitLabのRX Driver Package のテストシステムのCMakeなのですが、先日私が気付いた、
>>ルネサスコンパイラ向け定義ファイルをModules/Compiler/フォルダに追加するやり方のものでしょうか?
>>もしもそうであれば、(ルネサス社としてさっと公開するのは難儀な話なのは分かった上でダメモトですけれど)かふぇルネでリプライに添付するなどで見せて頂くことは出来ますか?
まだNoMaYさんの返信を完全に読めておらず「多分少し違います」という感じに答えになると思います。
以下RX Driver Packageのテストシステムのスクリーンショットです。GitLabというシステムを使ってCI/CDを組んでおりCMake対応というよりは従来手作業で実行していたマイコンボードを用いたテストを自動化する方向で優先的に作っており、CMake対応は実はやっつけ仕事になっています。図の通りトップ階層のCMakeLists.txtに全テスト用のソースコードの在処を記載していく方法にしています。*.cmake自体はそのうち綺麗にして公式にプルリクエストすることを想定して共用の別リポジトリから読み込ませるようにしてあります。たぶんNoMaYさんが欲しい情報とは少し違うような気がしますが情報提供します。引き続きCMakeについては本スレッドで議論させてください。社内でもコンパイラチームの方とも意見交換を続けております。
以上です
こんにちは、シェルティです。
本件社内調整を進めております。
CMake対応(本家へのプルリクエスト含む)をコンパイラチームとして公式に検討開始することができそうです。
引き続き情報交換させていただけますと幸いです。
シェルティさん、こんにちは。NoMaYです。連絡ありがとうございます。もう暫く調べてみます。それから、1つ前のリプライありがとうございました。それで、リプライの中で、コンパイラ定義ファイル、といったようなたぐいの言葉がありませんでしたので、たぶん、toolsフォルダのcc-rx.cmake等のファイルは、内容を整理しただけでは、CMakeのリポジトリにコミットするものにはならない、かなぁ、と今までに調べて来たり試行錯誤して来たりしたことからは推測されるのです。CMakeから見れば、あくまでそれはユーザ側にて記述する部分のもの、という位置付けにとどまってしまう、かなぁ、と思われるのです。ですので、今後ルネサスさんの中で作業をされる方の作業の内容を検討する時には、その点は確認した方が良さそうな気がします。とは言え、GHSコンパイラ向けのコンパイラ定義ファイルが、あまりにもあっさりとした内容だった例がありますので、CMakeのリポジトリにコミットするのに、そういった内容でも良いのかも知れませんけど、例えば、Amazon FreeRTOSのリポジトリで以下のように無理矢理コメントアウトされている記述が通るようになっていて欲しいものではあります。(もっとも、ただ単にコメントアウトを解除するだけで良いようにする、という話でも無く、くだんのコンパイラ定義ファイルの内容との辻褄合わせもやらなければいけない、あるいは更に、STM32とかESP32とかの記述に似せた方が良いのかも知れない、という話になるとは思いますけど。)github.com/renesas/amazon-freertos/blob/5e4d219/vendors/renesas/boards/rx65n-rsk/CMakeLists.txt#L38
# -------------------------------------------------------------------------------------------------# Compiler settings## Note1: Cmake doesn't support cc-rx compiler. The settings are commented out.# Note2: The settings below are NOT test yet. Some flags might be wrong and some might be missing.# -------------------------------------------------------------------------------------------------afr_mcu_port(compiler)#set(compiler_flags# -isa=rxv2 -fpu -branch=32 -preinclude="implicitlyinclude.h"# -nomessage=11174,21644,20010,23034,23035,20177,23033 -output=obj -debug -nologo# -obj_path=${workspace_loc:/${ProjName}/${ConfigName}}#)# Compiler flags.target_compile_options( AFR::compiler::mcu_port INTERFACE $<$<COMPILE_LANGUAGE:C>:${compiler_flags}>)#set(assembler_flags# -isa=rxv2 -fpu -debug -nologo# -output=${workspace_loc:/${ProjName}/${ConfigName}}#)# Assembler flagstarget_compile_options( AFR::compiler::mcu_port INTERFACE $<$<COMPILE_LANGUAGE:ASM>:${assembler_flags}>)#set(linker_flags# -noprelink -form=absolute -nomessage -vect=_undefined_interrupt_source_isr -list=${exe_target}.map# -nooptimize -rom=D=R,D_1=R_1,D_2=R_2 -nologo#)target_link_options( AFR::compiler::mcu_port INTERFACE ${linker_flags})
シェルティです、こんにちは。
ご指摘通りで、まさに社内折衝時に以下コードを実課題(CC-RXがCMake対応していないので、Amazon FreeRTOSのカーネルに以下注意文とともに3年も放置されている) として提起しました。
https://github.com/aws/amazon-freertos/blob/f86418a59a640f2602aefd0d2b748c55bd437bf0/tools/cmake/toolchains/cc-rx.cmake#L1
# Note, Cmake doesn't support cc-rx compiler.
# Even it finds the executable, it doesn't know its identificatioin.# TODO: create a patch to Cmake
今後、活動の行き着く先は、Amazon FreeRTOS、Azure RTOSのRX用ディストリビューションがCMakeで正しくビルドできるようになる、というのが最小要件になります。その際にNoMaYさんがおっしゃるように他マイコンベンダやコンパイラ環境の*.cmakeの書きぶりをベンチマークするなども必要と思います。
シェルティさん、こんにちは。NoMaYです。> CC-RXがCMake対応していない些細な書き間違いかもとも思うのですが、そうではなくて本当にこのニュアンスで打ち合わせがあったとすると、後のことが多大な後戻り工数を必要とすることになるかも知れない不安がしましたので念の為に書いておきますけれども、文面としては逆であって、状況をより正確に表すのは以下の文面になりますね。● CMakeがCC-RX対応していないもっと言ってしまうと、こうですね。● CMakeがCC-RX/CC-RL/CC-RH対応していない別の書き方では、こうでもよいのかも、とも思います。● CMakeのインストールフォルダの中にCC-RX/CC-RL/CC-RH向けコンパイラ定義ファイルが用意されていない(ゆえに、かなり無理矢理なことをしてCMakeLists.txtやクロスコンパイル用ユーザ責任○△□Toolchain◎▽◇.cmakeを記述しないといけない) (もしくは、それこそ最低限のことしか出来ない) (あるいは、手に負えずにギブアップせざるを得ない)[追記]なお、幾つか前の投稿に書いたように、(単にコマンドラインオプションがGCC/Clang/MSVCと異なること以上に)CC-RXが他のコンパイラと違った“クセ”があることや、CC-RXが生成するヘッダファイル依存関係情報ファイルが(GCCともMSVCとも異なるフォーマットであるが故に)CMakeやNinjaが受け付けないようだ(後日また調べますけれども)といったこともありますので、上のように言ってサラッとおしまい、というわけにも行きませんけれども。