cmake_minimum_required(VERSION 3.10) set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) set(TC_PREFIX riscv32-picolibc-elf-) # Set compiler and tools set(CMAKE_C_COMPILER "${TC_PREFIX}gcc" CACHE INTERNAL "C Compiler") find_program(CMAKE_OBJCOPY "${TC_PREFIX}objcopy") if (CMAKE_OBJCOPY) message(STATUS "Found objcopy at ${CMAKE_OBJCOPY}") else() message(FATAL_ERROR "Could not find ${TC_PREFIX}objcopy.") endif() find_program(CMAKE_OBJDUMP "${TC_PREFIX}objdump") if (CMAKE_OBJDUMP) message(STATUS "Found objdump at ${CMAKE_OBJDUMP}") else() message(FATAL_ERROR "Could not find ${TC_PREFIX}objdump.") endif() set(CMAKE_EXPORT_COMPILE_COMMANDS ON) file(REAL_PATH "stubs/libgloss_stub.c" LIBGLOSS_STUB) # Configure for Bare Metal. set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR riscv32) include(cmake/fiddle.cmake) project (ch537 LANGUAGES C ASM) # Set compiler and linker flags file(GLOB LINKER_SCRIPT "linker/*.ld") set(CMAKE_C_FLAGS "-march=rv32imac_zicsr -mabi=ilp32 -lgcc -static -O -std=gnu99" CACHE INTERNAL "C Compiler options") set(CMAKE_ASM_FLAGS "-march=rv32imac_zicsr -mabi=ilp32 -lgcc -static -O -std=gnu99" CACHE INTERNAL "C Compiler options") set(CMAKE_EXE_LINKER_FLAGS "-static -L ${CMAKE_BINARY_DIR}/lib -lmain -T ${LINKER_SCRIPT}" CACHE INTERNAL "Linker options") include_directories(include linker ${CMAKE_BINARY_DIR}/generated/fdl) file(GLOB_RECURSE SOURCES "src/*.c" "src/*.s") message("Sources ${SOURCES}") file(REAL_PATH "ch-flash/" CH_FLASH_DIR) add_library(libmain STATIC ${SOURCES}) set_target_properties(libmain PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib OUTPUT_NAME main ) add_library(libgloss_stub STATIC ${LIBGLOSS_STUB}) set_target_properties(libgloss_stub PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib OUTPUT_NAME gloss ) add_dependencies(libmain fdl_headers) 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}) add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/main.elf DEPENDS libmain libgloss_stub COMMENT "Link main.elf" COMMAND ${CMAKE_C_COMPILER} -nostartfiles -lgcc -static -L ${CMAKE_BINARY_DIR}/lib -T ${LINKER_SCRIPT} -o ${CMAKE_BINARY_DIR}/main.elf -Wl,--no-whole-archive -Wl,--whole-archive ${CMAKE_BINARY_DIR}/lib/libmain.a -Wl,--no-whole-archive ) # Generates the binary with objcopy. add_custom_command( OUTPUT main.bin DEPENDS ${CMAKE_BINARY_DIR}/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 ${CMAKE_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" # )