-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
160 lines (137 loc) · 4.76 KB
/
CMakeLists.txt
File metadata and controls
160 lines (137 loc) · 4.76 KB
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
cmake_minimum_required(VERSION 3.27)
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
if(NOT CMAKE_C_COMPILER)
find_program(ARM_GCC arm-none-eabi-gcc)
find_program(ARM_GXX arm-none-eabi-g++)
find_program(ARM_OBJCOPY arm-none-eabi-objcopy)
find_program(ARM_SIZE arm-none-eabi-size)
if(NOT ARM_GCC OR NOT ARM_GXX)
message(FATAL_ERROR "arm-none-eabi-gcc/g++ not found; set CMAKE_C_COMPILER and CMAKE_CXX_COMPILER")
endif()
set(CMAKE_C_COMPILER ${ARM_GCC})
set(CMAKE_CXX_COMPILER ${ARM_GXX})
set(CMAKE_ASM_COMPILER ${ARM_GCC})
else()
find_program(ARM_OBJCOPY arm-none-eabi-objcopy)
find_program(ARM_SIZE arm-none-eabi-size)
endif()
project(rpi_infones C CXX ASM)
set(CMAKE_CXX_STANDARD 17)
option(TIMER_TEST "Enable 1Hz timer ping prints" OFF)
option(SD_TEST "Enable SD card smoke test" ON)
option(RPI_ENABLE_MMU "Enable pinned MMU + D-cache" ON)
option(PERF_TEST "Enable CPU load prints" OFF)
set(SD_TEST_MAX_ENTRIES 8 CACHE STRING "Max SD test entries to list")
set(FPU_FLAGS "-mhard-float -mfpu=vfpv2")
set(OPT_LEVEL "1")
set(COMMON_FLAGS
"-mcpu=arm1176jzf-s -mtune=arm1176jzf-s ${FPU_FLAGS} \
-specs=nosys.specs -specs=nano.specs \
-ffunction-sections -fdata-sections -fmessage-length=0 -mno-unaligned-access \
-u _printf_float -O${OPT_LEVEL} -ggdb -Wall")
set(CMAKE_C_FLAGS "${COMMON_FLAGS} -std=gnu11")
set(CMAKE_CXX_FLAGS "${COMMON_FLAGS} -fpermissive -fno-exceptions -fno-rtti -std=gnu++17")
set(CMAKE_ASM_FLAGS "-mcpu=arm1176jzf-s -mtune=arm1176jzf-s ${FPU_FLAGS}")
set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/platform/memmap.ld)
set(INFONES_SRC
infones/InfoNES.cpp
infones/InfoNES_Mapper.cpp
infones/InfoNES_pAPU.cpp
infones/K6502.cpp
)
set(SRC
main.cpp
splash.cpp
DefaultSS444.c
DefaultSS555.c
app/FrensFonts.cpp
app/FrensHelpers_rpi.cpp
app/ffwrappers.cpp
app/gamepad.cpp
app/nespad.cpp
app/wiipad.cpp
app/menu.cpp
app/RomLister.cpp
app/settings.cpp
app/crc32.cpp
platform/boot.cpp
platform/rpi.c
platform/rpi_fb.c
platform/small-libpi.c
platform/syscalls.c
platform/diskio_emmc.c
platform/staff-start.S
platform/uart.s
platform/fpu.s
platform/tick_handler.c
platform/bcm2835/fb.c
platform/bcm2835/mbox.c
platform/bcm2835/mbox_props.c
platform/bcm2835/mmu.c
platform/bcm2835/irq.c
platform/bcm2835/tick.c
platform/bcm2835/interrupt-asm.S
vendor/doom-external/emmc.c
vendor/fatfs/ff.c
vendor/fatfs/ffunicode.c
vendor/fatfs/ffsystem.c
)
add_library(infones_core STATIC ${INFONES_SRC})
# We don't want to heavily modify the 6502 core, so apply these warnings only to infoNES
target_compile_options(infones_core PRIVATE
-Wno-unused-variable -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-function)
target_include_directories(infones_core PRIVATE
${CMAKE_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/infones
${CMAKE_SOURCE_DIR}/app
${CMAKE_SOURCE_DIR}/platform
${CMAKE_SOURCE_DIR}/platform/bcm2835
${CMAKE_SOURCE_DIR}/vendor/doom-external
${CMAKE_SOURCE_DIR}/vendor/fatfs
${CMAKE_SOURCE_DIR}/vendor/fatfs/conf
)
add_executable(${PROJECT_NAME}.elf ${SRC})
target_link_libraries(${PROJECT_NAME}.elf PRIVATE infones_core)
if(TIMER_TEST)
target_compile_definitions(${PROJECT_NAME}.elf PRIVATE TIMER_TEST=1)
endif()
if(SD_TEST)
target_compile_definitions(${PROJECT_NAME}.elf PRIVATE SD_TEST=1 SD_TEST_MAX_ENTRIES=${SD_TEST_MAX_ENTRIES})
endif()
if(RPI_ENABLE_MMU)
target_compile_definitions(${PROJECT_NAME}.elf PRIVATE RPI_ENABLE_MMU=1)
endif()
if(PERF_TEST)
target_compile_definitions(${PROJECT_NAME}.elf PRIVATE PERF_TEST=1)
endif()
target_include_directories(${PROJECT_NAME}.elf PRIVATE
${CMAKE_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/infones
${CMAKE_SOURCE_DIR}/app
${CMAKE_SOURCE_DIR}/platform
${CMAKE_SOURCE_DIR}/platform/bcm2835
${CMAKE_SOURCE_DIR}/vendor/doom-external
${CMAKE_SOURCE_DIR}/vendor/fatfs
${CMAKE_SOURCE_DIR}/vendor/fatfs/conf
)
target_link_options(${PROJECT_NAME}.elf PRIVATE
"-Wl,-gc-sections,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map,-T${LINKER_SCRIPT}"
)
if(ARM_SIZE)
add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
COMMAND ${ARM_SIZE} -G -d $<TARGET_FILE:${PROJECT_NAME}.elf>
COMMENT "Running arm-none-eabi-size"
)
endif()
if(ARM_OBJCOPY)
add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
COMMAND ${ARM_OBJCOPY} -Oihex $<TARGET_FILE:${PROJECT_NAME}.elf> ${PROJECT_NAME}.hex
COMMENT "Generating HEX"
)
add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
COMMAND ${ARM_OBJCOPY} -Obinary $<TARGET_FILE:${PROJECT_NAME}.elf> ${PROJECT_NAME}.bin
COMMENT "Generating BIN"
)
endif()