こんにちは。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です。Ninjaも使えそうです。以前に試してうまく行かなかったのは、くだんのアプリケーションノートのCMakeファイルに記述されていたオプションで依存関係ファイルを生成させたのが良く無かったようです。そのオプションで依存関係ファイルを生成させると、makeでは読み込める内容であっても、Ninjaでは読み込めない(以前に試した時はCMakeでも読み込めない)内容になるようです。(実は、たまたま、何か勘違いをして)あっさりしたオプションで試したらうまく行きました、、、Ninjaninja-build.org/くだんのアプリケーションノートのcmakeファイルに記述されていたオプション (右端の方で -MT が2つなのが良く無さそう)
########## Add function to scan and generate dependency filesfunction(dep_scan out_objects) string(REPLACE " -" ";-" DEPENDENCY_C_OPTIONS ${CMAKE_C_FLAGS}) string(REPLACE " -" ";-" DEPENDENCY_CPP_OPTIONS ${CMAKE_CXX_FLAGS}) string(REPLACE " -" ";-" DEPENDENCY_ASM_OPTIONS ${CMAKE_ASM_FLAGS}) set(result) foreach(in_f ${ARGN}) get_filename_component(ext ${in_f} LAST_EXT) file(RELATIVE_PATH rel_f ${CMAKE_CURRENT_SOURCE_DIR} ${in_f}) set(depend_f "CMakeFiles/${PROJECT_NAME}.dir/${rel_f}.d") set(obj_f "CMakeFiles/${PROJECT_NAME}.dir/${rel_f}.obj") if(${ext} STREQUAL ".c") add_custom_command ( COMMENT "Generate dependency: ${depend_f}" OUTPUT ${depend_f} COMMAND ${CMAKE_C_COMPILER} ${DEPENDENCY_C_OPTIONS} -MM -MP -output=dep=${depend_f} -MT=${obj_f} -MT=${depend_f} ${in_f} DEPENDS "${in_f}" VERBATIM ) elseif(${ext} STREQUAL ".cpp") add_custom_command ( COMMENT "Generate dependency: ${depend_f}" OUTPUT ${depend_f} COMMAND ${CMAKE_CXX_COMPILER} ${DEPENDENCY_CPP_OPTIONS} -MM -MP -output=dep=${depend_f} -MT=${obj_f} -MT=${depend_f} ${in_f} DEPENDS "${in_f}" VERBATIM ) elseif((${ext} STREQUAL ".asm") OR (${ext} STREQUAL ".s") OR (${ext} STREQUAL ".src")) add_custom_command ( COMMENT "Generate dependency: ${depend_f}" OUTPUT ${depend_f} COMMAND ${CMAKE_ASM_COMPILER} ${DEPENDENCY_ASM_OPTIONS} -MM -MP -output=${depend_f} -MF=${depend_f} -MT=${obj_f} -MT=${depend_f} ${in_f} DEPENDS "${in_f}" VERBATIM ) endif() list(APPEND result ${depend_f}) endforeach() set(${out_objects} "${result}" PARENT_SCOPE)endfunction()########## Call dep_scandep_scan(d_files ${SOURCE} ${src_asm})
調査/試作中のコンパイラ定義ファイルでの例 (右端の方です)
if("${CMAKE_${lang}_COMPILER_ARCHITECTURE_ID}" STREQUAL "RX") set(CMAKE_INCLUDE_FLAG_${lang} "-include=") set(CMAKE_DEFINE_FLAG_${lang} "-define=") # Note: <FLAGS> includes CMAKE_${lang}_FLAGS, CMAKE_${lang}_FLAGS_<config> and `lang standard option(s)` # FIXME: Should ${RENESAS_${lang}_FLAGS} be used? set(CMAKE_${lang}_COMPILE_OBJECT "<CMAKE_${lang}_COMPILER> -nologo ${RENESAS_${lang}_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -output=obj=<OBJECT> <SOURCE>" "<CMAKE_${lang}_COMPILER> -nologo ${RENESAS_${lang}_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -MM -output=dep=<DEP_FILE> <SOURCE>") set(CMAKE_${lang}_CREATE_PREPROCESSED_SOURCE "<CMAKE_${lang}_COMPILER> -nologo ${RENESAS_${lang}_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -output=prep=<PREPROCESSED_SOURCE> <SOURCE>") set(CMAKE_${lang}_CREATE_ASSEMBLY_SOURCE "<CMAKE_${lang}_COMPILER> -nologo ${RENESAS_${lang}_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -output=src=<ASSEMBLY_SOURCE> <SOURCE>") elseif("${CMAKE_${lang}_COMPILER_ARCHITECTURE_ID}" STREQUAL "RL78") set(CMAKE_DEFINE_FLAG_ASM "-D") # This is the same as default setting. set(CMAKE_INCLUDE_FLAG_ASM "-I") # This is the same as default setting. # Note: <FLAGS> includes CMAKE_${lang}_FLAGS, CMAKE_${lang}_FLAGS_<config> and `lang standard option(s)` # FIXME: Should ${RENESAS_${lang}_FLAGS} be used? set(CMAKE_${lang}_COMPILE_OBJECT "<CMAKE_${lang}_COMPILER> ${RENESAS_${lang}_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -c -o <OBJECT> <SOURCE>" "<CMAKE_${lang}_COMPILER> ${RENESAS_${lang}_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -MM -o <DEP_FILE> <SOURCE>") set(CMAKE_${lang}_CREATE_PREPROCESSED_SOURCE "<CMAKE_${lang}_COMPILER> ${RENESAS_${lang}_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -P -o <PREPROCESSED_SOURCE> <SOURCE>") set(CMAKE_${lang}_CREATE_ASSEMBLY_SOURCE "<CMAKE_${lang}_COMPILER> ${RENESAS_${lang}_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -S -o <ASSEMBLY_SOURCE> <SOURCE>") elseif("${CMAKE_${lang}_COMPILER_ARCHITECTURE_ID}" STREQUAL "RH850") set(CMAKE_DEFINE_FLAG_ASM "-D") # This is the same as default setting. set(CMAKE_INCLUDE_FLAG_ASM "-I") # This is the same as default setting. # Note: <FLAGS> includes CMAKE_${lang}_FLAGS, CMAKE_${lang}_FLAGS_<config> and `lang standard option(s)` # FIXME: Should ${RENESAS_${lang}_FLAGS} be used? set(CMAKE_${lang}_COMPILE_OBJECT "<CMAKE_${lang}_COMPILER> ${RENESAS_${lang}_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -c -o<OBJECT> <SOURCE>" "<CMAKE_${lang}_COMPILER> ${RENESAS_${lang}_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -MM -Xno_warning=11123 -o<DEP_FILE> <SOURCE>") set(CMAKE_${lang}_CREATE_PREPROCESSED_SOURCE "<CMAKE_${lang}_COMPILER> ${RENESAS_${lang}_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -P -o<PREPROCESSED_SOURCE> <SOURCE>") set(CMAKE_${lang}_CREATE_ASSEMBLY_SOURCE "<CMAKE_${lang}_COMPILER> ${RENESAS_${lang}_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -S -o<ASSEMBLY_SOURCE> <SOURCE>") endif()
if("${CMAKE_ASM${ASM_DIALECT}_COMPILER_ARCHITECTURE_ID}" STREQUAL "RX") set(CMAKE_DEFINE_FLAG_ASM "-define=") set(CMAKE_INCLUDE_FLAG_ASM "-include=") # Note: <FLAGS> includes CMAKE_ASM_FLAGS, CMAKE_ASM_FLAGS_<config> # FIXME: Should ${RENESAS_ASM_FLAGS} be used? set(CMAKE_ASM_COMPILE_OBJECT "<CMAKE_ASM_COMPILER> -nologo ${RENESAS_ASM_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -output=<OBJECT> <SOURCE>" "<CMAKE_ASM_COMPILER> -nologo ${RENESAS_ASM_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -MM -MF=<DEP_FILE> <SOURCE>") set(CMAKE_ASM_SOURCE_FILE_EXTENSIONS src;asm;s)elseif("${CMAKE_ASM${ASM_DIALECT}_COMPILER_ARCHITECTURE_ID}" STREQUAL "RL78") set(CMAKE_DEFINE_FLAG_ASM "-define=") set(CMAKE_INCLUDE_FLAG_ASM "-include=") # Note: <FLAGS> includes CMAKE_ASM_FLAGS, CMAKE_ASM_FLAGS_<config> # FIXME: Should ${RENESAS_ASM_FLAGS} be used? set(CMAKE_ASM_COMPILE_OBJECT "<CMAKE_ASM_COMPILER> ${RENESAS_ASM_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -output=<OBJECT> <SOURCE>" "<CMAKE_ASM_COMPILER> ${RENESAS_ASM_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -MM -MF=<DEP_FILE> <SOURCE>") set(CMAKE_ASM_SOURCE_FILE_EXTENSIONS asm;s)elseif("${CMAKE_ASM${ASM_DIALECT}_COMPILER_ARCHITECTURE_ID}" STREQUAL "RH850") set(CMAKE_DEFINE_FLAG_ASM "-D") # This is the same as default setting. set(CMAKE_INCLUDE_FLAG_ASM "-I") # This is the same as default setting. # Note: <FLAGS> includes CMAKE_ASM_FLAGS, CMAKE_ASM_FLAGS_<config> # FIXME: Should ${RENESAS_ASM_FLAGS} be used? set(CMAKE_ASM_COMPILE_OBJECT "<CMAKE_ASM_COMPILER> ${RENESAS_ASM_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -o<OBJECT> <SOURCE>" "<CMAKE_ASM_COMPILER> ${RENESAS_ASM_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -MM -MF=<DEP_FILE> <SOURCE>") set(CMAKE_ASM_SOURCE_FILE_EXTENSIONS asm;s)endif()
[関連リンク]C/C++ header dependencies - Ninjaマニュアルninja-build.org/manual.html#ref_headersOptions Controlling the Preprocessor - GCCドキュメントgcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html [追記]なお、CC-RX(やCC-RLやCC-RHも?)では、-M や -MD や -MMD といったオプションは、受け付けないようです。[追記2]CC-RLとCC-RHのコンパイラの方は -M オプションは受け付けますね。(アセンブラの方は受け付けません。)