aboutsummaryrefslogtreecommitdiff
path: root/CMakeLists.txt
blob: 792547f3c5c002f39cf7cd78f4ec7a36d7fb934e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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 <LINK_FLAGS> <OBJECTS> -o <TARGET> ${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"
# )