aboutsummaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt64
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
)