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
 

Parents
  • こんにちは。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()

     

Reply
  • こんにちは。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()

     

Children
No Data