こんにちは。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です。CMakeにコンパイラを自動認識する処理がありますが、その仕組みは以下のcmakeファイルあたりにありそうです、、、gitlab.kitware.com/cmake/cmake/-/blob/master/Modules/CMakeDetermineCompiler.cmake
こんにちは。NoMaYです。CMakeにコンパイラを自動認識する処理がありますが、コンパイラ定義ファイル内だけでは処理を有効化させることは出来なくて、少なくとも以下のファイルにベンダ名を登録しておく必要があるようです。試しに登録してみたところ、幾らか自動認識する処理が実行されるようになりました。(ただし、うまく認識されない部分も残っていて、手作業で設定している部分が残っていますので、まだ不十分ですけれども、、、)gitlab.kitware.com/cmake/cmake/-/blob/8428e39e/Modules/CMakeCompilerIdDetection.cmake#L43-L100以下、ファイル比較ツールの画面コピーと幾らか自動認識処理が行われるようになった例の画面コピーです。
こんにちは。NoMaYです。CC-RXのアセンブラ(asrx.exe)にはバージョンだけを表示して終了するオプションが無いのですね、、、(CC-RL/RHにはあるけれども、、、) CMakeのアセンブラ自動認識処理が、その機能があることを前提に作られてました、、、gitlab.kitware.com/cmake/cmake/-/blob/8428e39e/Modules/CMakeDetermineASMCompiler.cmake#L56-L123
# Table of per-vendor compiler id flags with expected output. list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS GNU ) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_GNU "--version") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_GNU "(GNU assembler)|(GCC)|(Free Software Foundation)") list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS Clang ) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_Clang "--version") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_Clang "(clang version)") list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS AppleClang ) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_AppleClang "--version") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_AppleClang "(Apple LLVM version)") list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS ARMClang ) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_ARMClang "--version") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_ARMClang "armclang") list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS HP ) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_HP "-V") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_HP "HP C") list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS Intel ) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_Intel "--version") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_Intel "(ICC)") list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS IntelLLVM ) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_IntelLLVM "--version") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_IntelLLVM "(Intel[^\n]+oneAPI)") list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS SunPro ) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_SunPro "-V") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_SunPro "Sun C") list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS XL ) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_XL "-qversion") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_XL "XL C") list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS MSVC ) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_MSVC "-?") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_MSVC "Microsoft") list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS TI ) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_TI "-h") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_TI "Texas Instruments") list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS IAR) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_IAR ) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_IAR "IAR Assembler") list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS ARMCC) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_ARMCC ) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_ARMCC "(ARM Compiler)|(ARM Assembler)|(Arm Compiler)") list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS NASM) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_NASM "-v") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_NASM "(NASM version)") list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS YASM) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_YASM "--version") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_YASM "(yasm)") list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS ADSP) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_ADSP "-version") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_ADSP "Analog Devices") list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS QCC) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_QCC "-V") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_QCC "gcc_nto")
こんにちは。NoMaYです。CMakeでCC-RX/RL/RHのコンパイラ/アセンブラの自動認識機能を有効にするパッチを追加して、今まで同様にファイル一式を以下のzipファイルに固めました。(ただし、先ほど投稿した事情で、まだCC-RXのアセンブラ(asrx.exe)の自動認識には未対応です。) パッチはCMakeのインストールフォルダにファイルをコピーする必要が無いようにしました。CMake_Ninja_XXSC_CCXX_examples_20220207.zip
cmake-3.22.2-original/Modules/CMakeCompilerIdDetection.cmakecmake-3.22.2-original/Modules/CMakeDetermineASMCompiler.cmakecmake-3.22.2-original/Modules/CMakeDetermineCCompiler.cmakecmake-3.22.2-original/Modules/CMakeDetermineCompiler.cmakecmake-3.22.2-original/Modules/CMakeDetermineCompilerId.cmakecmake-3.22.2-original/Modules/CMakeDetermineCXXCompiler.cmakecmake-3.22.2-original/Modules/CMakePlatformId.h.incmake-3.22.2-patch/Modules/CMakeCompilerIdDetection.cmakecmake-3.22.2-patch/Modules/CMakeDetermineASMCompiler.cmakecmake-3.22.2-patch/Modules/CMakeDetermineCCompiler.cmakecmake-3.22.2-patch/Modules/CMakeDetermineCompiler.cmake <-- 未変更cmake-3.22.2-patch/Modules/CMakeDetermineCompilerId.cmakecmake-3.22.2-patch/Modules/CMakeDetermineCXXCompiler.cmakecmake-3.22.2-patch/Modules/CMakePlatformId.h.incmake-3.22.2-patch/Modules/Compiler/RENESAS-ASM.cmakecmake-3.22.2-patch/Modules/Compiler/RENESAS-C.cmakecmake-3.22.2-patch/Modules/Compiler/RENESAS-CXX.cmakecmake-3.22.2-patch/Modules/Compiler/RENESAS-DetermineCompiler.cmakecmake-3.22.2-patch/Modules/Compiler/RENESAS.cmakeRH850F1KM_SampleProject/...略......略...rl78g23_fpb/...略......略...tb_rx65n/...略......略...
以下、ファイル比較ツールとVSCodeの画面コピーです。パッチを当てたファイル (先日の投稿でポイントかと思ったファイルは現状では未変更のままで済んでいます)CC-RXの例CC-RLの例CC-RHの例
こんにちは。NoMaYです。CMakeでCC-RX/RL/RHのライブラリのビルド/リンクが出来るようにしようと調べ始めたところ、過去にCC-RXに関してissueとmerge_requestが出ていたことに気付きました。探せば他にもあるかも知れませんので調べてみようかと思います。一度検索したつもりでしたけど、、、(ひとまず前の投稿でのCC-RXのアセンブラ(asrx.exe)の自動認識対応は後回しにします、、、)CMAKE_LINK_LIBRARY_FILE_FLAG does not behave like CMAKE_LINK_LIBRARY_FLAG.gitlab.kitware.com/cmake/cmake/-/issues/19541Make CMAKE_LINK_LIBRARY_FILE_FLAG work like CMAKE_LINK_LIBRARY_FLAGgitlab.kitware.com/cmake/cmake/-/merge_requests/3641
こんにちは。NoMaYです。CMakeでCC-RX/RL/RHのライブラリのビルド/リンクが出来るようにしてみました。今まで同様にファイル一式を以下のzipファイルに固めました。CMake_Ninja_XXSC_CCXX_examples_20220214.zip
以下、VSCodeの画面コピーです。CC-RXの例CC-RLの例CC-RHの例
こんにちは。NoMaYです。幾つか前の投稿にも書いたのですが、CC-RX/RL/RHが生成したヘッダファイル依存関係情報ファイルをCMakeでうまく使えないケース(CMakeとGeneratorの組み合わせにおいて認識されないケース)があります。実際、e2 studio同梱のmakeの場合(CMakeとUnix Makefiles Generatorの組み合わせに相当する)にはCC-RX/RL/RHが生成したヘッダファイル依存関係情報ファイルがCMakeに認識されません。(なので、CC-RX/RL/RHにヘッダファイル依存関係情報ファイルを生成する機能があっても、この場合は(この組み合わせでは)CC-RX/RL/RHにヘッダファイル依存関係情報ファイルを生成させていません。)その場合でも、CMake自身に備わっているヘッダファイル依存関係スキャン機能によって、CソースやC++ソースでは完全では無いもののヘッダファイル依存関係がチェックされ、必要に応じてソースが再コンパイルされるのですが、CC-RX/RL/RH向けに記述されたアセンブラソースに対しては、スキャン機能が働かない為、ソースの再アセンブルが必要になっても全く行われません。スキャン機能が働かない理由は、CMakeがソースをスキャンする時に以下の正規表現を使用しているのですが、これがCC-RX/RL/RHのアセンブラの文法に適合しないからです。また、この時の正規表現をカスタマイズする機能もCMakeに備わっていません。gitlab.kitware.com/search?group_id=415&project_id=541&repository_ref=v3.22.2&search=INCLUDE_REGEX_LINE
#define INCLUDE_REGEX_LINE \ "^[ \t]*[#%][ \t]*(include|import)[ \t]*[<\"]([^\">]+)([\">])"
他方で、NinjaというビルドツールとCMakeの組み合わせにおいてはCC-RX/RL/RHが生成したヘッダファイル依存関係情報ファイルも認識してくれましたので、makeの代わりにNinjaを使えば良いだけのことだとは思っていたのですが、ふと、泥臭いやり方ですがとりあえず誤魔化すやり方が思い浮かびました。CC-RX/RL/RHのアセンブラの文法に従う本来のインクルード文だけでなくて、以下のようにCMakeのヘッダファイル依存関係スキャン機能の為だけの追加のインクルード文を記述するというやり方です。CC-RX向けのアセンブラソースの場合:
.include test_asm_dep.inc.if 0 ; The following is for the dependency scan by CMake unless Ninja is used.%include "test_asm_dep.inc".endif
CC-RL/CC-RH向けのアセンブラソースの場合:
$include "test_asm_dep.inc"$if 0 ; The following is for the dependency scan by CMake unless Ninja is used.%include "test_asm_dep.inc"$endif
こんにちは。NoMaYです。きゃ、CMakeのコンパイラ定義ファイルでの変数命名スタイルがインクルードとデファインで違ったのですね、、、インクルードオプションを制御する変数の場合:
CMAKE_INCLUDE_FLAG_CCMAKE_INCLUDE_FLAG_CXXCMAKE_INCLUDE_FLAG_ASM${ASM_DIALECT}
デファインオプションを制御する変数の場合:
CMAKE_C_DEFINE_FLAGCMAKE_CXX_DEFINE_FLAGCMAKE_ASM_DEFINE_FLAG (← ${ASM_DIALECT}は付かないっポイけど一抹の不安も、、、)
こんにちは。NoMaYです。この前の2つの投稿の件を反映させました(+αも)。 今まで同様にファイル一式を以下のzipファイルに固めました。CMake_UnixMakefiles_XXSC_CCXX_examples_20220219.zipなお、Ninja向けとUnix Makefiles向けの違いはVSCodeの以下の設定が異なるのみです。(のみに今回からしました。)例) tb_rx65n/.vscode/cmake-kits.jsonNinja向け
[ { "name": "Renesas RX65N CC-RX", "toolchainFile": "${workspaceFolder}/cmake/renesas-rx-ccrx-rx65n.cmake", "preferredGenerator": { "name": "Ninja" } }]
Unix Makefiles向け
[ { "name": "Renesas RX65N CC-RX", "toolchainFile": "${workspaceFolder}/cmake/renesas-rx-ccrx-rx65n.cmake", "preferredGenerator": { "name": "Unix Makefiles" } }]
こんにちは。NoMaYです。幾つか前の投稿に書きましたが、CC-RXのアセンブラ(asrx.exe)にはバージョンだけを表示して終了するオプションが無いのですが(CC-RL/RHにはあるけれども)、その機能があることを前提にCMakeのアセンブラ自動認識処理が作られていました。どうしたものかと試行錯誤していたところ、以下のコマンドライン記述をすれば無理矢理ではありますが、とにもかくにもバージョンを表示させることが出来る(かつ正常終了したことを示す終了コード0で終了させることが出来る)、ということに気付きました。また、良し悪しは別にして、全く同じコマンドライン記述をしてCC-RL/RHでも出来ることに気付きました。ひとまず、このやり方で進めてみようかと思います。(もちろん、CC-RL/RHでも最終的にこのやり方で落ち着くかどうか何とも言えないところですけれども、、、)以下、画面コピーです。CC-RXのアセンブラ(asrx.exe)でバージョンを表示させる(かつ終了コード0で終了させる)ことが出来ることに気付いたCMakeにCC-RXのアセンブラ(asrx.exe)も自動認識させることが出来るようになった(無理矢理ではありますが)CC-RL/RHのアセンブラ(asrl.exe/asrh.exe)でも同じコマンドライン記述で出来る(良し悪しは別にして)調査/試作中のCMakeへのパッチの案gitlab.kitware.com/cmake/cmake/-/blob/8428e39e/Modules/CMakeDetermineASMCompiler.cmake#L56-L123
# Table of per-vendor compiler id flags with expected output. list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS GNU ) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_GNU "--version") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_GNU "(GNU assembler)|(GCC)|(Free Software Foundation)") list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS Clang ) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_Clang "--version") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_Clang "(clang version)") list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS AppleClang ) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_AppleClang "--version") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_AppleClang "(Apple LLVM version)") list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS ARMClang ) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_ARMClang "--version") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_ARMClang "armclang") list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS HP ) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_HP "-V") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_HP "HP C") 途中省略 list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS QCC) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_QCC "-V") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_QCC "gcc_nto") list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS RENESAS) # The CC-RL Assembler and CC-RH Assembler do not accept "-isa=rxv1" but they return exit code 0. # The CC-RX Assembler requires at least one input source file therefore Windows' null device is used. set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_RENESAS "-V;-MM;-isa=rxv1;nul") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_RENESAS "Renesas")
gitlab.kitware.com/cmake/cmake/-/blob/8428e39e/Modules/CMakeDetermineASMCompiler.cmake#L129-L154
if("x${CMAKE_ASM${ASM_DIALECT}_COMPILER_ID}" STREQUAL "xIAR") # primary necessary to detect architecture, so the right archiver and linker can be picked # eg. "IAR Assembler V8.10.1.12857/W32 for ARM" or "IAR Assembler V4.11.1.4666 for Renesas RX" # Cut out identification first, newline handling is a pain string(REGEX MATCH "IAR Assembler[^\r\n]*" _compileid "${CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_OUTPUT}") if("${_compileid}" MATCHES "V([0-9]+\\.[0-9]+\\.[0-9]+)") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_VERSION ${CMAKE_MATCH_1}) endif() string(REGEX MATCHALL "([A-Za-z0-9-]+)" _all_compileid_matches "${_compileid}") if(_all_compileid_matches) list(GET _all_compileid_matches "-1" CMAKE_ASM${ASM_DIALECT}_COMPILER_ARCHITECTURE_ID) endif() elseif("x${CMAKE_ASM${ASM_DIALECT}_COMPILER_ID}" STREQUAL "xRENESAS") # primary necessary to detect architecture, so the right command line options can be used. ex. # RX Family Assembler V3.04.00.01 [10 Sep 2021] # RL78 Family Assembler V1.11.00.02 [10 Sep 2021] # RH850 Family Assembler V2.04.00.01 [10 Sep 2021] if("${CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_OUTPUT}" MATCHES "(.*) Family Assembler V0*([0-9]+)\\.0*([0-9]+)\\.0*([0-9]+)") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ARCHITECTURE_ID ${CMAKE_MATCH_1}) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_VERSION ${CMAKE_MATCH_2}.${CMAKE_MATCH_3}.${CMAKE_MATCH_4}) endif() elseif("x${CMAKE_ASM${ASM_DIALECT}_COMPILER_ID}" STREQUAL "xClang") # Test whether an MSVC-like command-line option works. execute_process(COMMAND ${CMAKE_ASM${ASM_DIALECT}_COMPILER} -? OUTPUT_VARIABLE _clang_output ERROR_VARIABLE _clang_output RESULT_VARIABLE _clang_result) if(_clang_result EQUAL 0) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_FRONTEND_VARIANT "MSVC") set(CMAKE_ASM${ASM_DIALECT}_SIMULATE_ID MSVC) else() set(CMAKE_ASM${ASM_DIALECT}_COMPILER_FRONTEND_VARIANT "GNU") endif() set(_variant " with ${CMAKE_ASM${ASM_DIALECT}_COMPILER_FRONTEND_VARIANT}-like command-line") endif()