aboutsummaryrefslogtreecommitdiff
path: root/CMakeLists.txt
blob: 554dfa48964943fa7ee84ac78c223f70f8b76f3d (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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
cmake_minimum_required(VERSION 3.10)

set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

if (NOT DEFINED PATTERN)
  set(PATTERN "CandyCane")
endif()

if (NOT DEFINED LED_BYTE_ORDER)
  set(LED_BYTE_ORDER "GRB")
endif()

set(PATTERN ${PATTERN} CACHE STRING "Define the default pattern to use.")
set(LED_BYTE_ORDER ${LED_BYTE_ORDER} CACHE STRING "The byte order to use. This should either be RGB or GRB")

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)

add_compile_definitions(DEFAULT_PATTERN=${PATTERN})

add_compile_definitions(LED_BYTE_ORDER=${LED_BYTE_ORDER})


# 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 -Os -std=gnu99" CACHE INTERNAL "C Compiler options")
set(CMAKE_ASM_FLAGS "-march=rv32imac_zicsr -mabi=ilp32 -lgcc -static -Os -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
          -Xlinker -Map=${CMAKE_BINARY_DIR}/main.map
          -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"
# )