forked from xmos/xmos_cmake_toolchain
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathxmos_macros.cmake
More file actions
241 lines (228 loc) · 9.38 KB
/
xmos_macros.cmake
File metadata and controls
241 lines (228 loc) · 9.38 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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
include_guard(DIRECTORY)
## merge_binaries combines multiple xcore applications into one by extracting
## a tile elf and recombining it into another binary.
## This macro takes an output target name, a base target, a target
## containing a tile to merge, and the tile number to merge.
## The resulting output will be a target named _OUTPUT_TARGET_NAME, which
## contains the _BASE_TARGET application with tile _TILE_TO_MERGE replaced with
## the respective tile from _OTHER_TARGET.
macro(merge_binaries _OUTPUT_TARGET_NAME _BASE_TARGET _OTHER_TARGET _TILE_NUM_TO_MERGE)
get_target_property(BASE_TILE_DIR ${_BASE_TARGET} BINARY_DIR)
get_target_property(BASE_TILE_NAME ${_BASE_TARGET} NAME)
get_target_property(OTHER_TILE_NAME ${_OTHER_TARGET} NAME)
add_custom_target(${_OUTPUT_TARGET_NAME} ALL
COMMAND ${CMAKE_COMMAND} -E make_directory ${OTHER_TILE_NAME}_split
COMMAND xobjdump --split --split-dir ${OTHER_TILE_NAME}_split ${OTHER_TILE_NAME}.xe > ${OTHER_TILE_NAME}_split/output.log
COMMAND xobjdump ${BASE_TILE_NAME}.xe -r 0,${_TILE_NUM_TO_MERGE},${OTHER_TILE_NAME}_split/image_n0c${_TILE_NUM_TO_MERGE}_2.elf >> ${OTHER_TILE_NAME}_split/output.log
COMMAND ${CMAKE_COMMAND} -E copy ${BASE_TILE_NAME}.xe ${_OUTPUT_TARGET_NAME}.xe
DEPENDS
${_BASE_TARGET}
${_OTHER_TARGET}
BYPRODUCTS
${_OUTPUT_TARGET_NAME}.xe
WORKING_DIRECTORY
${BASE_TILE_DIR}
COMMENT
"Merge tile ${_TILE_NUM_TO_MERGE} of ${_OTHER_TARGET}.xe into ${_BASE_TARGET}.xe to create ${_OUTPUT_TARGET_NAME}.xe"
VERBATIM
)
set_target_properties(${_OUTPUT_TARGET_NAME} PROPERTIES
BINARY_DIR ${BASE_TILE_DIR}
ADDITIONAL_CLEAN_FILES "${OTHER_TILE_NAME}_split"
)
endmacro()
## Creates a run target for a provided binary
macro(create_run_target _EXECUTABLE_TARGET_NAME)
add_custom_target(run_${_EXECUTABLE_TARGET_NAME}
COMMAND xrun --xscope ${_EXECUTABLE_TARGET_NAME}.xe
DEPENDS ${_EXECUTABLE_TARGET_NAME}
COMMENT
"Run application"
VERBATIM
)
endmacro()
## Creates a run target for a provided binary. The first argument specifies the file to save to (no extension).
macro(create_run_xscope_to_file_target _EXECUTABLE_TARGET_NAME _XSCOPE_FILE)
add_custom_target(run_xscope_to_file_${_EXECUTABLE_TARGET_NAME}
COMMAND xrun --xscope-file ${_XSCOPE_FILE} ${_EXECUTABLE_TARGET_NAME}.xe
DEPENDS ${_EXECUTABLE_TARGET_NAME}
COMMENT
"Run application"
VERBATIM
)
endmacro()
## Creates a debug target for a provided binary
macro(create_debug_target _EXECUTABLE_TARGET_NAME)
add_custom_target(debug_${_EXECUTABLE_TARGET_NAME}
COMMAND xgdb ${_EXECUTABLE_TARGET_NAME}.xe -ex "connect" -ex "connect --xscope" -ex "run"
DEPENDS ${_EXECUTABLE_TARGET_NAME}
COMMENT
"Debug application"
)
endmacro()
## Creates a filesystem file for a provided binary
## filename must end in "_fat.fs"
## Optional arguments can be used to specify other dependency targets, such as filesystem generators
## create_filesystem_target(_EXECUTABLE_TARGET_NAME _FILESYSTEM_INPUT_DIR _IMAGE_SIZE _OPTIONAL_DEPENDS_TARGETS)
macro(create_filesystem_target)
if(${ARGC} EQUAL 1)
add_custom_target(make_fs_${ARGV0} ALL
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/filesystem_support/${ARGV0}_fat.fs ${ARGV0}_fat.fs
DEPENDS ${ARGV0}_fat.fs
COMMENT
"Move filesystem"
VERBATIM
)
elseif(${ARGC} EQUAL 3)
add_custom_target(make_fs_${ARGV0} ALL
COMMAND fatfs_mkimage --input=${ARGV1} --image_size=${ARGV2} --output=${ARGV0}_fat.fs
BYPRODUCTS
${ARGV0}_fat.fs
COMMENT
"Create filesystem"
VERBATIM
)
elseif(${ARGC} EQUAL 4)
add_custom_target(make_fs_${ARGV0} ALL
COMMAND fatfs_mkimage --input=${ARGV1} --image_size=${ARGV2} --output=${ARGV0}_fat.fs
DEPENDS ${ARGV3}
BYPRODUCTS
${ARGV0}_fat.fs
COMMENT
"Create filesystem"
VERBATIM
)
else()
message(FATAL_ERROR "Invalid number of arguments passed to create_filesystem_target")
endif()
endmacro()
## Creates a directory populated with all components related to the data partition
## folder must end in "_data_partition"
## Optional argument can be used to dependency targets
## create_data_partition_directory(_EXECUTABLE_TARGET_NAME _FILES_TO_COPY _OPTIONAL_DEPENDS_TARGETS)
macro(create_data_partition_directory)
if(${ARGC} EQUAL 2)
add_custom_target(make_data_partition_${ARGV0} ALL
COMMAND ${CMAKE_COMMAND} -E rm -rf ${ARGV0}_data_partition/
COMMAND ${CMAKE_COMMAND} -E make_directory ${ARGV0}_data_partition/
COMMAND ${CMAKE_COMMAND} -E copy ${ARGV1} ${ARGV0}_data_partition/
COMMENT
"Collect data partition components"
VERBATIM
)
elseif(${ARGC} EQUAL 3)
add_custom_target(make_data_partition_${ARGV0} ALL
COMMAND ${CMAKE_COMMAND} -E rm -rf ${ARGV0}_data_partition/
COMMAND ${CMAKE_COMMAND} -E make_directory ${ARGV0}_data_partition/
COMMAND ${CMAKE_COMMAND} -E copy ${ARGV1} ${ARGV0}_data_partition/
DEPENDS
${ARGV2}
COMMENT
"Collect data partition components"
VERBATIM
)
else()
message(FATAL_ERROR "Invalid number of arguments passed to create_data_partition_directory")
endif()
set_target_properties(make_data_partition_${ARGV0} PROPERTIES
ADDITIONAL_CLEAN_FILES ${ARGV0}_data_partition
)
endmacro()
## Creates a flash app target for a provided binary
## Optional arguments can be used to specify boot partition size, data partition contents, and other dependency targets, such as filesystem generators
## create_flash_app_target(_EXECUTABLE_TARGET_NAME _BOOT_PARTITION_SIZE _DATA_PARTITION_CONTENTS _OPTIONAL_DEPENDS_TARGETS)
function(create_flash_app_target)
if(${ARGC} EQUAL 1)
add_custom_target(flash_app_${ARGV0}
COMMAND xflash --quad-spi-clock 50MHz --factory ${ARGV0}.xe
DEPENDS ${ARGV0}
COMMENT
"Flash application"
VERBATIM
)
elseif(${ARGC} EQUAL 2)
add_custom_target(flash_app_${ARGV0}
COMMAND xflash --quad-spi-clock 50MHz --factory ${ARGV0}.xe --boot-partition-size ${ARGV1}
DEPENDS ${ARGV0}
COMMENT
"Flash application with empty data partition"
VERBATIM
)
elseif(${ARGC} EQUAL 3)
add_custom_target(flash_app_${ARGV0}
COMMAND xflash --quad-spi-clock 50MHz --factory ${ARGV0}.xe --boot-partition-size ${ARGV1} --data ${ARGV2}
DEPENDS ${ARGV0}
COMMENT
"Flash application and data partition"
VERBATIM
)
elseif(${ARGC} EQUAL 4)
add_custom_target(flash_app_${ARGV0}
COMMAND xflash --quad-spi-clock 50MHz --factory ${ARGV0}.xe --boot-partition-size ${ARGV1} --data ${ARGV2}
DEPENDS ${ARGV0} ${ARGV3}
COMMENT
"Flash application and data partition"
VERBATIM
)
else()
message(FATAL_ERROR "Invalid number of arguments passed to create_flash_app_target")
endif()
endfunction()
## Creates an install target for a provided binary
macro(create_install_target _EXECUTABLE_TARGET_NAME)
add_custom_target(install_${_EXECUTABLE_TARGET_NAME}
COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_SOURCE_DIR}/dist
COMMAND ${CMAKE_COMMAND} -E copy ${_EXECUTABLE_TARGET_NAME}.xe ${PROJECT_SOURCE_DIR}/dist
DEPENDS ${_EXECUTABLE_TARGET_NAME}
COMMENT
"Install application"
)
endmacro()
## Creates an xflash image upgrade target for a provided binary
macro(create_upgrade_img_target _EXECUTABLE_TARGET_NAME _FACTORY_MAJOR_VER _FACTORY_MINOR_VER)
add_custom_target(create_upgrade_img_${_EXECUTABLE_TARGET_NAME}
COMMAND xflash --factory-version ${_FACTORY_MAJOR_VER}.${_FACTORY_MINOR_VER} --upgrade 0 ${_EXECUTABLE_TARGET_NAME}.xe -o ${_EXECUTABLE_TARGET_NAME}_upgrade.bin
DEPENDS ${_EXECUTABLE_TARGET_NAME}
COMMENT
"Create upgrade image for application"
VERBATIM
)
endmacro()
## Creates an xflash erase all target for a provided target XN file
## Full filepath must be specified for XN file
macro(create_erase_all_target _APP_NAME _TARGET_FILEPATH)
add_custom_target(erase_all_${_APP_NAME}
COMMAND xflash --erase-all --target-file=${_TARGET_FILEPATH}
DEPENDS
COMMENT
"Erase target flash"
VERBATIM
)
endmacro()
## Query the version of the XTC Tools
##
## Populates the following variables:
##
## XTC_VERSION_MAJOR
## XTC_VERSION_MINOR
## XTC_VERSION_PATCH
function(query_tools_version)
# Run cat "$XMOS_TOOL_PATH"/doc/version.txt
execute_process(
COMMAND ${CMAKE_COMMAND} -E cat $ENV{XMOS_TOOL_PATH}/doc/version.txt
OUTPUT_VARIABLE XCC_VERSION_OUTPUT_STRING
)
# Split output semver
string(FIND ${XCC_VERSION_OUTPUT_STRING} " " SPACE_POSITION)
string(SUBSTRING ${XCC_VERSION_OUTPUT_STRING} 0 ${SPACE_POSITION} XCC_SEMVER)
# Parse version fields
string(REPLACE "." ";" XCC_SEMVER_FIELDS ${XCC_SEMVER})
list(LENGTH XCC_SEMVER_FIELDS XCC_SEMVER_FIELDS_LENGTH)
list(GET XCC_SEMVER_FIELDS 0 XCC_VERSION_MAJOR)
list(GET XCC_SEMVER_FIELDS 1 XCC_VERSION_MINOR)
list(GET XCC_SEMVER_FIELDS 2 XCC_VERSION_PATCH)
# Set XTC version env variables
set(XTC_VERSION_MAJOR ${XCC_VERSION_MAJOR} PARENT_SCOPE)
set(XTC_VERSION_MINOR ${XCC_VERSION_MINOR} PARENT_SCOPE)
set(XTC_VERSION_PATCH ${XCC_VERSION_PATCH} PARENT_SCOPE)
endfunction()