cmake_minimum_required(VERSION 3.10) set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) include(cmake/fiddle.cmake) project (ch537 LANGUAGES C ASM) # Configure for Bare Metal. set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR riscv32) set(TC_PREFIX riscv32-unknown-elf-) include_directories(include linker ${CMAKE_BINARY_DIR}/generated/fdl) file(GLOB_RECURSE SOURCES "src/*.c" "src/*.s") file(GLOB LINKER_SCRIPT "linker/*.ld") message("Sources ${SOURCES}") file(REAL_PATH "ch-flash/" CH_FLASH_DIR) # Set compiler and tools set(CMAKE_C_COMPILER "${TC_PREFIX}gcc" CACHE INTERNAL "C Compiler") set(CMAKE_OBJCOPY "${TC_PREFIX}objcopy" CACHE INTERNAL "Object Copier") set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # Set compiler and linker flags set(CMAKE_C_FLAGS "-ffreestanding -march=rv32imac_zicsr -mabi=ilp32 -lgcc -static -nostartfiles -O -std=gnu99" CACHE INTERNAL "C Compiler options") set(CMAKE_ASM_FLAGS "-ffreestanding -march=rv32imac_zicsr -mabi=ilp32 -lgcc -static -nostartfiles -O -std=gnu99" CACHE INTERNAL "C Compiler options") set(CMAKE_EXE_LINKER_FLAGS "--xref -static -T ${LINKER_SCRIPT}" CACHE INTERNAL "Linker options") # Add executable with custom linking commands add_executable(main.elf ${SOURCES}) add_dependencies(main.elf fdl_headers) # Replace default link command to use `ld` directly without `-Wl,` prefixes. set_target_properties(main.elf PROPERTIES LINKER_LANGUAGE C LINK_FLAGS "-nostdlib -e 0" # Custom linking command CMAKE_C_LINK_EXECUTABLE "${TC_PREFIX}ld -o ${CMAKE_EXE_LINKER_FLAGS}" ) set(fdl_headers) file(GLOB_RECURSE fdl_files "${CMAKE_SOURCE_DIR}/fdl/*.fdl") fiddle_sources(fdl_headers "${fdl_files}") add_custom_target( fdl_headers DEPENDS ${fdl_headers}) # Generates the binary with objcopy. add_custom_command( OUTPUT main.bin DEPENDS main.elf COMMENT "objcopy -O binary main.elf main.bin" COMMAND ${CMAKE_OBJCOPY} -O binary main.elf main.bin ) add_custom_command( OUTPUT objdump.txt DEPENDS main.elf COMMAND ${TC_PREFIX}objdump -D main.elf > objdump.txt ) add_custom_target(main_bin ALL DEPENDS main.bin objdump.txt) # Generates the flash binary add_custom_command( OUTPUT ${CH_FLASH_DIR}/ch-flash COMMAND cd ${CH_FLASH_DIR} && make ) add_custom_target( flash DEPENDS main.bin ${CH_FLASH_DIR}/ch-flash COMMAND ${CH_FLASH_DIR}/ch-flash -f main.bin ) # Uncomment to add debugging support # add_custom_target( # debug # COMMAND "${TC_PREFIX}gdb" -tui -ex "tar ext :3333" -ex "file main.elf" # )