diff options
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r-- | CMakeLists.txt | 64 |
1 files changed, 39 insertions, 25 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 792547f..1fdfa58 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,56 +1,70 @@ cmake_minimum_required(VERSION 3.10) + set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) -include(cmake/fiddle.cmake) +set(TC_PREFIX riscv32-picolibc-elf-) +# 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) +file(REAL_PATH "stubs/libgloss_stub.c" LIBGLOSS_STUB) -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(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") -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) - +add_library(libmain STATIC ${SOURCES}) +set_target_properties(libmain PROPERTIES + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib + OUTPUT_NAME main +) -# 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 <LINK_FLAGS> <OBJECTS> -o <TARGET> ${CMAKE_EXE_LINKER_FLAGS}" +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 ${TC_PREFIX}gcc -nostartfiles -lgcc + -static -L ${CMAKE_BINARY_DIR}/lib -lmain -T ${LINKER_SCRIPT} + -o ${CMAKE_BINARY_DIR}/main.elf + ${CMAKE_BINARY_DIR}/lib/libmain.a +) + # Generates the binary with objcopy. add_custom_command( OUTPUT main.bin - DEPENDS main.elf + DEPENDS ${CMAKE_BINARY_DIR}/main.elf COMMENT "objcopy -O binary main.elf main.bin" COMMAND ${CMAKE_OBJCOPY} -O binary main.elf main.bin ) |