aboutsummaryrefslogtreecommitdiff
path: root/rv64cpu/sw/CMakeLists.txt
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-03-15 16:07:39 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-03-15 16:07:39 +0800
commitf6441a2e6f901748b504ef93872649c9463a404e (patch)
tree54332548c2e2b74b44aba646a09cffb543856050 /rv64cpu/sw/CMakeLists.txt
downloadrcc-project-f6441a2e6f901748b504ef93872649c9463a404e.tar.gz
rcc-project-f6441a2e6f901748b504ef93872649c9463a404e.tar.xz
initial commit: project architecture
Diffstat (limited to 'rv64cpu/sw/CMakeLists.txt')
-rw-r--r--rv64cpu/sw/CMakeLists.txt71
1 files changed, 71 insertions, 0 deletions
diff --git a/rv64cpu/sw/CMakeLists.txt b/rv64cpu/sw/CMakeLists.txt
new file mode 100644
index 0000000..c43580f
--- /dev/null
+++ b/rv64cpu/sw/CMakeLists.txt
@@ -0,0 +1,71 @@
+# ─── Software Build (Bare-Metal) ─────────────────────────────────────────────────
+#
+# This CMakeLists.txt is only included when BUILD_SW=ON and requires
+# the RISC-V cross-compilation toolchain:
+#
+# cmake -B build_sw -DBUILD_SW=ON \
+# -DCMAKE_TOOLCHAIN_FILE=tools/toolchain-riscv64.cmake
+#
+# ─────────────────────────────────────────────────────────────────────────────────
+
+enable_language(ASM)
+
+set(LINKER_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/common/link.ld)
+set(STARTUP_SRC ${CMAKE_CURRENT_SOURCE_DIR}/common/start.S)
+
+# ─── Helper: create a bare-metal firmware target ─────────────────────────────────
+function(add_firmware)
+ cmake_parse_arguments(FW "" "NAME" "SOURCES" ${ARGN})
+
+ add_executable(${FW_NAME}.elf
+ ${STARTUP_SRC}
+ ${FW_SOURCES}
+ )
+
+ target_include_directories(${FW_NAME}.elf PRIVATE
+ ${CMAKE_CURRENT_SOURCE_DIR}/common
+ )
+
+ target_link_options(${FW_NAME}.elf PRIVATE
+ -T${LINKER_SCRIPT}
+ -Wl,-Map=${FW_NAME}.map
+ )
+
+ # Generate .bin
+ add_custom_command(TARGET ${FW_NAME}.elf POST_BUILD
+ COMMAND ${CMAKE_OBJCOPY} -O binary
+ ${FW_NAME}.elf ${FW_NAME}.bin
+ COMMENT "Generating ${FW_NAME}.bin"
+ )
+
+ # Generate .hex (for $readmemh)
+ add_custom_command(TARGET ${FW_NAME}.elf POST_BUILD
+ COMMAND ${CMAKE_OBJCOPY} -O verilog
+ ${FW_NAME}.elf ${FW_NAME}.hex
+ COMMENT "Generating ${FW_NAME}.hex"
+ )
+
+ # Print size
+ add_custom_command(TARGET ${FW_NAME}.elf POST_BUILD
+ COMMAND ${CMAKE_SIZE} ${FW_NAME}.elf
+ )
+endfunction()
+
+# ═══════════════════════════════════════════════════════════════════════════════════
+# Firmware Targets — uncomment as you create the source files
+# ═══════════════════════════════════════════════════════════════════════════════════
+#
+# add_firmware(
+# NAME hello_uart
+# SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/baremetal/hello_uart/main.c
+# )
+#
+# add_firmware(
+# NAME timer_irq
+# SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/baremetal/timer_irq/main.c
+# )
+#
+# add_firmware(
+# NAME cache_test
+# SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/baremetal/cache_test/main.c
+# )