こんにちは。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です。MicrosoftさんのAzure RTOSのRX65Nのサンプルコード(CMake+GNURX+VSCode)のCMakeファイルを元にして、簡単なRXスマートコンフィグレータプロジェクト向けCMakeファイル(GNURX+VSCode)を作ってみました。ファイルは以下のzipファイルに固めました。CMake_RXSC_GNURX_example_20220103.zip
.vscode/cmake-kits.json ← MicrosoftさんのAzure RTOSのRX65Nのサンプルコードのパスのみ変更cmake/renesas-rx-gcc-rx65n.cmake ← 上記のサンプルコードのままcmake/renesas-rx-gcc-toolchain.cmake ← 上記のサンプルコードのままcmake/utilities.cmake ← 上記のサンプルコードのままCMakeLists.txt
基本的に運用方法(GNURX+VSCode)としては以下となりますね。(1) 別途e2 studioのRXスマートコンフィグレータでコード生成する(2) RXスマートコンフィグレータでコンポーネントの追加/削除を行ったら手作業でファイルを変更する(3) 同様に自身のソースファイル/ヘッダファイルの追加/削除を行った場合も手作業でファイルを変更する(4) コンパイルオプション/リンクオプションを変更するときは手作業でファイルを変更する以下、CMakeファイルの内容とVSCodeの画面コピーです。CMakeLists.txt (赤文字部分を手作業で変更します)
# Copyright (c) Microsoft Corporation.# Licensed under the MIT License.# Modified by NoMaY for RX SmartConfigurator simple projectcmake_minimum_required(VERSION 3.13 FATAL_ERROR)set(CMAKE_C_STANDARD 99)set(GSG_BASE_DIR ${CMAKE_SOURCE_DIR})# use the repo version of ninja on Windows as there is no Ninja installerif(WIN32) set(CMAKE_MAKE_PROGRAM "C:\\Program Files\\Ninja\\ninja.exe" CACHE STRING "Ninja location")endif()# Set the toolchain if not definedif(NOT CMAKE_TOOLCHAIN_FILE) if(CMAKE_C_COMPILER_ID STREQUAL "IAR") set(CMAKE_TOOLCHAIN_FILE "${GSG_BASE_DIR}/cmake/renesas-rx-iar-rx65n.cmake") elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU") set(CMAKE_TOOLCHAIN_FILE "${GSG_BASE_DIR}/cmake/renesas-rx-gcc-rx65n.cmake") endif()endif()include(${GSG_BASE_DIR}/cmake/utilities.cmake)# Define the Projectproject(tb_rx65n C ASM)set(SOURCES src/smc_gen/general/r_cg_hardware_setup.c src/smc_gen/general/r_smc_cgc.c src/smc_gen/general/r_smc_cgc_user.c src/smc_gen/general/r_smc_interrupt.c src/smc_gen/r_bsp/board/generic_rx65n/hwsetup.c src/smc_gen/r_bsp/mcu/all/dbsct.c src/smc_gen/r_bsp/mcu/all/lowlvl.c src/smc_gen/r_bsp/mcu/all/mcu_locks.c src/smc_gen/r_bsp/mcu/all/r_bsp_common.c src/smc_gen/r_bsp/mcu/all/r_bsp_cpu.c src/smc_gen/r_bsp/mcu/all/r_bsp_interrupts.c src/smc_gen/r_bsp/mcu/all/r_bsp_locking.c src/smc_gen/r_bsp/mcu/all/r_bsp_mcu_startup.c src/smc_gen/r_bsp/mcu/all/r_bsp_software_interrupt.c src/smc_gen/r_bsp/mcu/all/r_rx_intrinsic_functions.c src/smc_gen/r_bsp/mcu/all/reset_program.S src/smc_gen/r_bsp/mcu/all/resetprg.c src/smc_gen/r_bsp/mcu/all/sbrk.c src/smc_gen/r_bsp/mcu/rx65n/mcu_clocks.c src/smc_gen/r_bsp/mcu/rx65n/mcu_init.c src/smc_gen/r_bsp/mcu/rx65n/mcu_interrupts.c src/smc_gen/r_bsp/mcu/rx65n/mcu_mapped_interrupts.c src/smc_gen/r_bsp/mcu/rx65n/vecttbl.c src/smc_gen/r_pincfg/Pin.c src/tb_rx65n.c)add_executable(${PROJECT_NAME} ${SOURCES})target_include_directories(${PROJECT_NAME} PRIVATE src/smc_gen/general src/smc_gen/r_bsp src/smc_gen/r_bsp/mcu/all src/smc_gen/r_config src/smc_gen/r_pincfg)if(CMAKE_C_COMPILER_ID STREQUAL "IAR") set_target_linker(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR}/startup/iar/linker_script.icf)else() set_target_linker(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR}/src/linker_script.ld) target_link_options(${PROJECT_NAME} PRIVATE -Wl,-e_PowerON_Reset)endif()post_build(${PROJECT_NAME})
.vscode/cmake-kits.json (基本的に変更の必要は無いです)
[ { "name": "Renesas RX65N GCC", "toolchainFile": "${workspaceFolder}/cmake/renesas-rx-gcc-rx65n.cmake" } ]
# Copyright (c) Microsoft Corporation. # Licensed under the MIT License. # Define the CPU architecture for Threadx set(THREADX_ARCH "rxv2") set(THREADX_TOOLCHAIN "gnu") set(MCPU_FLAGS "-m64bit-doubles -mcpu=rx64m -misa=v2 -mlittle-endian-data") include(${CMAKE_CURRENT_LIST_DIR}/renesas-rx-gcc-toolchain.cmake)
# Copyright (c) Microsoft Corporation. # Licensed under the MIT License. set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR rx) set(TARGET_TRIPLET "rx-elf-") # do some windows specific logic if(WIN32) set(TOOLCHAIN_EXT ".exe") else() set(TOOLCHAIN_EXT "") endif(WIN32) # default to Release build if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build, options are: Debug Release." FORCE) endif() find_program(COMPILER_ON_PATH "${TARGET_TRIPLET}gcc${TOOLCHAIN_EXT}") if(DEFINED ENV{RX_GCC_PATH}) # use the environment variable first file(TO_CMAKE_PATH $ENV{RX_GCC_PATH} RX_TOOLCHAIN_PATH) message(STATUS "Using ENV variable RX_GCC_PATH = ${RX_TOOLCHAIN_PATH}") elseif(COMPILER_ON_PATH) # then check on the current path get_filename_component(RX_TOOLCHAIN_PATH ${COMPILER_ON_PATH} DIRECTORY) message(STATUS "Using RX GCC from path = ${RX_TOOLCHAIN_PATH}") endif() # perform compiler test with the static library set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) set(CMAKE_C_COMPILER ${RX_TOOLCHAIN_PATH}/${TARGET_TRIPLET}gcc${TOOLCHAIN_EXT} CACHE STRING "") set(CMAKE_CXX_COMPILER ${RX_TOOLCHAIN_PATH}/${TARGET_TRIPLET}g++${TOOLCHAIN_EXT} CACHE STRING "") set(CMAKE_ASM_COMPILER ${RX_TOOLCHAIN_PATH}/${TARGET_TRIPLET}gcc${TOOLCHAIN_EXT}) set(CMAKE_LINKER ${RX_TOOLCHAIN_PATH}/${TARGET_TRIPLET}gcc${TOOLCHAIN_EXT}) set(CMAKE_SIZE_UTIL ${RX_TOOLCHAIN_PATH}/${TARGET_TRIPLET}size${TOOLCHAIN_EXT}) set(CMAKE_OBJCOPY ${RX_TOOLCHAIN_PATH}/${TARGET_TRIPLET}objcopy${TOOLCHAIN_EXT}) set(CMAKE_OBJDUMP ${RX_TOOLCHAIN_PATH}/${TARGET_TRIPLET}objdump${TOOLCHAIN_EXT}) set(CMAKE_NM_UTIL ${RX_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 "-ffunction-sections -fdata-sections -fdiagnostics-parseable-fixits -fno-strict-aliasing -fno-builtin -fshort-enums -Wuninitialized -Wdouble-promotion -Werror -Wno-unused-function -Wno-unused-parameter -Wno-incompatible-pointer-types") set(CMAKE_C_FLAGS "${MCPU_FLAGS} ${VFP_FLAGS} ${CMAKE_COMMON_FLAGS} ${LIBC_INCLUDE}") set(CMAKE_CXX_FLAGS "${MCPU_FLAGS} ${VFP_FLAGS} ${CMAKE_COMMON_FLAGS}") set(CMAKE_ASM_FLAGS "${MCPU_FLAGS} ${VFP_FLAGS}") set(CMAKE_EXE_LINKER_FLAGS "${LD_FLAGS} -fno-common -nostartfiles -Wl,--gc-sections --specs=nano.specs") set(CMAKE_C_FLAGS_DEBUG "-O0 -g3") set(CMAKE_CXX_ASM_FLAGS_DEBUG "-O0 -g3") set(CMAKE_ASM_FLAGS_DEBUG "-g3") set(CMAKE_C_FLAGS_RELEASE "-Os") set(CMAKE_CXX_FLAGS_RELEASE "-Os") set(CMAKE_ASM_FLAGS_RELEASE "")
# Copyright (c) Microsoft Corporation. # Licensed under the MIT License. function(post_build TARGET) if(CMAKE_C_COMPILER_ID STREQUAL "IAR") add_custom_target(${TARGET}.bin ALL DEPENDS ${TARGET} COMMAND ${CMAKE_IAR_ELFTOOL} --bin ${TARGET}.elf ${TARGET}.bin) elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU") add_custom_target(${TARGET}.bin ALL DEPENDS ${TARGET} COMMAND ${CMAKE_OBJCOPY} -Obinary ${TARGET}.elf ${TARGET}.bin COMMAND ${CMAKE_OBJCOPY} -Oihex ${TARGET}.elf ${TARGET}.hex) else() message(FATAL_ERROR "Unknown CMAKE_C_COMPILER_ID ${CMAKE_C_COMPILER_ID}") endif() endfunction() function(set_target_linker TARGET LINKER_SCRIPT) if(CMAKE_C_COMPILER_ID STREQUAL "IAR") target_link_options(${TARGET} PRIVATE --config ${LINKER_SCRIPT}) target_link_options(${TARGET} PRIVATE --map=${TARGET}.map) elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU") target_link_options(${TARGET} PRIVATE -T${LINKER_SCRIPT}) target_link_options(${TARGET} PRIVATE -Wl,-Map=${TARGET}.map) set_target_properties(${TARGET} PROPERTIES SUFFIX ".elf") else() message(FATAL_ERROR "Unknown CMAKE_C_COMPILER_ID ${CMAKE_C_COMPILER_ID}") endif() endfunction() macro(print_all_variables) message(STATUS "print_all_variables------------------------------------------{") get_cmake_property(_variableNames VARIABLES) foreach (_variableName ${_variableNames}) message(STATUS "${_variableName}=${${_variableName}}") endforeach() message(STATUS "print_all_variables------------------------------------------}") endmacro()