”かふぇルネ“はルネサス製品に関してユーザ同士が自由に会話をするツールであり、回答者はルネサス社内外の方たちとなります。ルネサス製品やソリューションに関して正式な回答をご希望の場合は、ルネサス技術サポート問合せをご使用ください。

e2 studioでCMakeでビルドする、というアプリケーションノートがあるのですがスマートコンフィグレータは使えるのでしょうか?

こんにちは。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.21
www.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.21

PDF
www.renesas.com/jp/ja/document/apn/integrated-development-environment-e-studio-using-cmake-renesas-cc-rx-compiler-rev201

ZIP
www.renesas.com/jp/ja/document/scd/integrated-development-environment-e-studio-using-cmake-renesas-cc-rx-compiler-rev201-sample-code
 

  • NoMaYさん

    こんにちは、シェルティです。

    あけましておめでとうございます。また本年度もいろいろと情報交換させていただけますと幸いです。

    さてCMakeについてですがまだCMake公式にRXコンパイラ用ファイルを追加してもらう計画はないですね。この機に提案してみます。実は社内GitLabでもRX Driver Package のテストシステムはCMakeでビルド(CC-RX、GCC、IAR)しておりましてCMakeのコミュニティにコミットする材料は整っています。

    NoMaYさんに多大なご協力をいただいたAmazon FreeRTOS移植活動においても、オープンソースコミュニティにコミットしていく意義をMCU界隈の関係者に布教することもできてきました。Linux関係者と違いMCU関係者の間では、Amazon FreeRTOSの活動前までGitHubのプルリクエストってなんだ?というような状態でしたが、Amazon FreeRTOS本家にRXファミリのコードが取り込まれてOSと結合された状態で常に最新版でAWSにて動作検証される、ということが実体験として共有でき実ビジネスにも響いています。

    CMakeもただしく予算化して人を割り当てる提案ができれば、公式にコミットしていくことも可能と思います。その提案にCMake対応することによるビジネス可能性をうまく表現できれば、と思案中です。Amazon FreeRTOSやAzure RTOSなどの著名OSがCMakeを採用しており、MCUベンダ毎の依存コードもCMakeでコンポーネントとしてビルドできる状態でgit submoduleでリンクさせる、という形式がテンプレート化してきており、MCUベンダ側のソフトウェアパッケージ(Flexible Software PackageやRX Driver Package など)もCMakeに対応していないとオープンソースとの組み合わせビルドが困難になり世の中から取り残される、故にCMake対応は必須である、というような提案を書きつつあります。

    引き続き相談させていただけますと幸いです。

    以上です

  • シェルティさん、こんにちは。NoMaYです。#今年も宜しくお願いします。

    人員確保/予算確保は少しまだ先な感じですね。今しばらくはCMakeとCC-RX/CC-RL/CC-RHのことを調べてみようと思いました。ところで、ルネサスさんの社内GitLabのRX Driver Package のテストシステムのCMakeなのですが、先日私が気付いた、ルネサスコンパイラ向け定義ファイルをModules/Compiler/フォルダに追加するやり方のものでしょうか?もしもそうであれば、(ルネサス社としてさっと公開するのは難儀な話なのは分かった上でダメモトですけれど)かふぇルネでリプライに添付するなどで見せて頂くことは出来ますか?(何と言いますか、私は、ゼロから作ることを誇る派ではなく、既にあるものに積み上げることを尊ぶ派(最終的に原型が残ってなくても)なので、その話を聞いて無関心でいられないところでしたので。)(確認してみましたが、GitHubのルネサスさんのRX Driver Packageのリポジトリの中にはCMakeLists.txtや*.cmakeは無かったです。社内システムとのことでしたので無いとは思っていましたけれども。)

  • こんにちは。NoMaYです。

    > > ルネサスコンパイラ(CC-RX/CC-RL/CC-RH)向け定義ファイル
    > IARさんのコンパイラ向けの定義ファイルが既に存在しますので、それを手本にして作成するのが良いですかね、、、

    どうも思うように動いてくれないので調べていたら、Azure RTOSのARM Cortexのサンプルコードで、GNUARMとEWARMのCMakeファイルの記述の違いが、私が思い込んでいたものの斜め上をいく違いでした。互換性が良くないのかな?、、、

    GNUARMの場合 (赤文字箇所の部分も含めてGNURXの場合のスタイルと同様)

    getting-started\cmake\arm-gcc-cortex-toolchain.cmake

    # Copyright (c) Microsoft Corporation.
    # Licensed under the MIT License.

    set(CMAKE_SYSTEM_NAME Generic)

    set(TARGET_TRIPLET "arm-none-eabi-")

    # default to Debug build
    if(NOT CMAKE_BUILD_TYPE)
        set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build, options are: Debug Release." FORCE)
    endif()

    # do some windows specific logic
    if(WIN32)
        set(TOOLCHAIN_EXT ".exe")
    else()
        set(TOOLCHAIN_EXT "")
    endif(WIN32)

    find_program(COMPILER_ON_PATH "${TARGET_TRIPLET}gcc${TOOLCHAIN_EXT}")

    if(DEFINED ENV{ARM_GCC_PATH})
        # use the environment variable first    
        file(TO_CMAKE_PATH $ENV{ARM_GCC_PATH} ARM_TOOLCHAIN_PATH)
        message(STATUS "Using ENV variable ARM_GCC_PATH = ${ARM_TOOLCHAIN_PATH}")
    elseif(COMPILER_ON_PATH)
        # then check on the current path
        get_filename_component(ARM_TOOLCHAIN_PATH ${COMPILER_ON_PATH} DIRECTORY)
        message(STATUS "Using ARM GCC from path = ${ARM_TOOLCHAIN_PATH}")
    else()
        message(FATAL_ERROR "Unable to find ARM GCC. Either add to your PATH, or define ARM_GCC_PATH to the compiler location")
    endif()

    # Perform compiler test with the static library
    set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

    set(CMAKE_C_COMPILER    ${ARM_TOOLCHAIN_PATH}/${TARGET_TRIPLET}gcc${TOOLCHAIN_EXT})
    set(CMAKE_CXX_COMPILER  ${ARM_TOOLCHAIN_PATH}/${TARGET_TRIPLET}g++${TOOLCHAIN_EXT})
    set(CMAKE_ASM_COMPILER  ${ARM_TOOLCHAIN_PATH}/${TARGET_TRIPLET}gcc${TOOLCHAIN_EXT})
    set(CMAKE_LINKER        ${ARM_TOOLCHAIN_PATH}/${TARGET_TRIPLET}gcc${TOOLCHAIN_EXT})
    set(CMAKE_SIZE_UTIL     ${ARM_TOOLCHAIN_PATH}/${TARGET_TRIPLET}size${TOOLCHAIN_EXT})
    set(CMAKE_OBJCOPY       ${ARM_TOOLCHAIN_PATH}/${TARGET_TRIPLET}objcopy${TOOLCHAIN_EXT})
    set(CMAKE_OBJDUMP       ${ARM_TOOLCHAIN_PATH}/${TARGET_TRIPLET}objdump${TOOLCHAIN_EXT})
    set(CMAKE_NM_UTIL       ${ARM_TOOLCHAIN_PATH}/${TARGET_TRIPLET}nm${TOOLCHAIN_EXT})

    set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
    set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
    set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
    set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

    set(CMAKE_COMMON_FLAGS "-g3 --specs=nano.specs -ffunction-sections -fdata-sections -fno-strict-aliasing -fno-builtin -fshort-enums -Wall -Wextra -Wuninitialized -Wmaybe-uninitialized -Wshadow -Wdouble-promotion -Werror -Wno-unused-parameter")
    set(CMAKE_C_FLAGS     "${MCPU_FLAGS} ${VFP_FLAGS} ${CMAKE_COMMON_FLAGS}")
    set(CMAKE_CXX_FLAGS "${MCPU_FLAGS} ${VFP_FLAGS} ${CMAKE_COMMON_FLAGS}")
    set(CMAKE_ASM_FLAGS "${MCPU_FLAGS} ${VFP_FLAGS} ${CMAKE_COMMON_FLAGS}")
    set(CMAKE_EXE_LINKER_FLAGS "${LD_FLAGS} -fno-common -Wl,--gc-sections,-print-memory-usage")

    set(CMAKE_C_FLAGS_DEBUG "-O0")
    set(CMAKE_CXX_ASM_FLAGS_DEBUG "-O0")
    set(CMAKE_ASM_FLAGS_DEBUG "")

    set(CMAKE_C_FLAGS_RELEASE "-Os")
    set(CMAKE_CXX_FLAGS_RELEASE "-Os")
    set(CMAKE_ASM_FLAGS_RELEASE "")

     
    EWARMの場合 (特に赤文字箇所の部分がGNURXの場合のスタイルと異なるのは想定外)

    getting-started\cmake\arm-iar-cortex-toolchain.cmake

    set(CMAKE_SYSTEM_NAME Generic)

    # Set the EW installation root directory
    set(EWARM_ROOT_DIR "C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.4/arm")

    # default to Debug build
    if(NOT CMAKE_BUILD_TYPE)
        set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build, options are: Debug Release." FORCE)
    endif()

    # Set up the CMake variables for compiler and assembler
    set(CMAKE_C_COMPILER "${EWARM_ROOT_DIR}/bin/iccarm.exe" "${CPU_FLAGS} -e")
    set(CMAKE_CXX_COMPILER "${EWARM_ROOT_DIR}/bin/iccarm.exe" "${CPU_FLAGS} --c++")
    set(CMAKE_ASM_COMPILER "${EWARM_ROOT_DIR}/bin/iasmarm.exe" "${CPU_FLAGS}")

    set(CMAKE_C_LINK_FLAGS "--semihosting")
    set(CMAKE_CXX_LINK_FLAGS "--semihosting")

    set(CMAKE_C_FLAGS_DEBUG_INIT "-On")
    set(CMAKE_CXX_FLAGS_DEBUG_INIT "-On")

     

  • こんにちは。NoMaYです。

    以下のアプリケーションノートでは、幾らか無理をしてソースファイルとヘッダファイルの依存関係情報(CC-RXに生成させたもの)をCMake(というかCMakeが生成するmakefile)に認識させようとしているのですが、CMake自体に依存関係を認識する機能があったようですね。そのものズバリのドキュメントには辿り付けていないのですが、たまたま気付いた以下のissueにそれらしき記載がありましたね。(もちろん、コンパイラが生成した依存関係情報を使う方が、正確さの点で勝りますけれど。)

    アプリケーションノート 統合開発環境 e² studio CMakeを使用してCC-RX用ソース・ファイルをビルドする
    R20AN0569JJ0201 Rev.2.01 Pages 12 Sep.15.21
    PDF
    www.renesas.com/jp/ja/document/apn/integrated-development-environment-e-studio-using-cmake-renesas-cc-rx-compiler-rev201
    ZIP
    www.renesas.com/jp/ja/document/scd/integrated-development-environment-e-studio-using-cmake-renesas-cc-rx-compiler-rev201-sample-code

    Oct 16, 2020 11:33pm GMT+0900
    [ENH] Compilation: Source file dependencies managment
    gitlab.kitware.com/cmake/cmake/-/issues/21321

    For Makefiles generators family, the dependencies are identified by CMake itself.

  • こんにちは。NoMaYです。

    > …最終的に望ましいのは以下のフォルダにルネサスコンパイラ(CC-RX/CC-RL/CC-RH)向け定義ファイルが追加されることですね…
    gitlab.kitware.com/cmake/cmake/-/tree/master/Modules/Compiler

    以下のように記述すると、CMakeインストールフォルダ側に定義ファイルを置かずとも、一時しのぎ的にプロジェクトフォルダ側に定義ファイルを置けますね。

    記述例:

    tb_rx65n/cmake/renesas-rx-ccrx-toolchain.cmake

    set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/Modules")

     
    参照される定義ファイルの例:

    tb_rx65n/cmake/Modules/Compiler/RENESAS.cmake
    tb_rx65n/cmake/Modules/Compiler/RENESAS-C.cmake
    tb_rx65n/cmake/Modules/Compiler/RENESAS-CXX.cmake
    tb_rx65n/cmake/Modules/Compiler/RENESAS-ASM.cmake
    tb_rx65n/cmake/Modules/Compiler/RENESAS-DetermineCompiler.cmake

    [関連リンク]

    cmake.org/cmake/help/latest/variable/CMAKE_MODULE_PATH.html
    cmake.org/cmake/help/latest/variable/CMAKE_CURRENT_LIST_DIR.html

    cmake.org/cmake/help/latest/manual/cmake-variables.7.html
     

  • こんにちは。NoMaYです。

    ウェブで調べ物をしていて気付いたのですが、Qt for MCUsがRH850+GHSコンパイラでCMakeでデモプログラムを作っているようですね。CMakeのGHSコンパイラ向け定義ファイルも少し見ておこうかと思いました。

    Qt Quick Ultralite Automotive Cluster Demo
    doc.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.cmake
    gitlab.kitware.com/cmake/cmake/-/blob/master/Modules/Compiler/GHS-C.cmake
    gitlab.kitware.com/cmake/cmake/-/blob/master/Modules/Compiler/GHS-CXX.cmake
    gitlab.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.json
    cmake/renesas-rx-ccrx-rx65n.cmake
    cmake/renesas-rx-ccrx-toolchain.cmake
    cmake/utilities.cmake
    cmake/Modules/Compiler/RENESAS-ASM.cmake
    cmake/Modules/Compiler/RENESAS-C.cmake
    cmake/Modules/Compiler/RENESAS-CXX.cmake
    cmake/Modules/Compiler/RENESAS-DetermineCompiler.cmake
    cmake/Modules/Compiler/RENESAS.cmake
    src/sample_asm.src
    src/sample_cpp.cpp
    src/tb_rx65n.c
    src/smc_gen/...略...
    linker_command.sub
    CMakeLists.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については本スレッドで議論させてください。社内でもコンパイラチームの方とも意見交換を続けております。

    以上です

  • NoMaYさん

    こんにちは、シェルティです。

    本件社内調整を進めております。

    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 flags
    target_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}
    )

     

  • NoMaYさん

    シェルティです、こんにちは。

    ご指摘通りで、まさに社内折衝時に以下コードを実課題(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が受け付けないようだ(後日また調べますけれども)といったこともありますので、上のように言ってサラッとおしまい、というわけにも行きませんけれども。