Now generates _binary_filename_start / _binary_filename_end as well as more useful naming.
--- /dev/null
+#
+# Convert a file (text or binary) into an assembler source file suitable
+# for gcc. Designed to replicate 'objcopy' with more predictable
+# naming, and supports appending a null byte for embedding text as
+# a string.
+#
+# Designed to be run as a script with "cmake -P"
+#
+# Set variables DATA_FILE, SOURCE_FILE, FILE_TYPE when running this.
+#
+# If FILE_TYPE is set to STRING, a null byte is appended to DATA_FILE's contents
+# before SOURCE_FILE is created.
+#
+# If FILE_TYPE is unset (or any other value), DATA_FILE is copied
+# verbatim into SOURCE_FILE.
+#
+#
+if(NOT DATA_FILE)
+ message(FATAL_ERROR "DATA_FILE for converting must be specified")
+endif()
+
+if(NOT SOURCE_FILE)
+ message(FATAL_ERROR "SOURCE_FILE destination must be specified")
+endif()
+
+file(READ "${DATA_FILE}" data HEX)
+
+string(LENGTH "${data}" data_len)
+math(EXPR data_len "${data_len} / 2") # 2 hex bytes per byte
+
+if(FILE_TYPE STREQUAL "TEXT")
+ set(data "${data}00") # null-byte termination
+endif()
+
+## Convert string of raw hex bytes to lines of hex bytes as gcc .byte expressions
+string(REGEX REPLACE "................................" ".byte \\0\n" data "${data}") # 16 bytes per line
+string(REGEX REPLACE "[^\n]+$" ".byte \\0\n" data "${data}") # last line
+string(REGEX REPLACE "[0-9a-f][0-9a-f]" "0x\\0, " data "${data}") # hex formatted C bytes
+string(REGEX REPLACE ", \n" "\n" data "${data}") # trim the last comma
+
+## Come up with C-friendly symbol name based on source file
+get_filename_component(source_filename "${DATA_FILE}" NAME)
+string(MAKE_C_IDENTIFIER "${source_filename}" varname)
+
+function(append str)
+ file(APPEND "${SOURCE_FILE}" "${str}")
+endfunction()
+
+function(append_line str)
+ append("${str}\n")
+endfunction()
+
+function(append_identifier symbol)
+append_line("\n.global ${symbol}")
+append("${symbol}:")
+if(${ARGC} GREATER 1) # optional comment
+ append(" /* ${ARGV1} */")
+endif()
+append("\n")
+endfunction()
+
+file(WRITE "${SOURCE_FILE}" "/*")
+append_line(" * Data converted from ${DATA_FILE}")
+if(FILE_TYPE STREQUAL "TEXT")
+ append_line(" * (null byte appended)")
+endif()
+append_line(" */")
+
+append_line(".data")
+append_identifier("${varname}")
+append_identifier("_binary_${varname}_start" "for objcopy compatibility")
+append("${data}")
+
+append_identifier("_binary_${varname}_end" "for objcopy compatibility")
+
+append_line("")
+if(FILE_TYPE STREQUAL "TEXT")
+ append_identifier("${varname}_length" "not including null byte")
+else()
+ append_identifier("${varname}_length")
+endif()
+append_line(".word ${data_len}")
+++ /dev/null
-#
-# Convert a file (text or binary) into a C source file suitable
-# for gcc. Designed to replicate 'objcopy' with more predictable
-# naming, and supports appending a null byte for embedding text as
-# a string.
-#
-# Designed to be run as a script with "cmake -P"
-#
-# Set variables DATA_FILE, SOURCE_FILE, FILE_TYPE when running this.
-#
-# If FILE_TYPE is set to STRING, a null byte is appended to DATA_FILE's contents
-# before it is embedded.
-#
-# If FILE_TYPE is unset (or any other value), DATA_FILE is embedded
-# verbatim.
-#
-#
-if(NOT DATA_FILE)
- message(FATAL_ERROR "DATA_FILE for converting must be specified")
-endif()
-
-if(NOT SOURCE_FILE)
- message(FATAL_ERROR "SOURCE_FILE destination must be specified")
-endif()
-
-file(READ "${DATA_FILE}" data HEX)
-
-if(FILE_TYPE STREQUAL "TEXT")
- set(data "${data}00") # null-byte terimnation
-endif()
-
-## Convert string of raw hex bytes to lines of hex bytes in C array format
-string(REGEX REPLACE "................................" "\\0\n " data "${data}") # 16 bytes per line
-string(REGEX REPLACE "[0-9a-f][0-9a-f]" "0x\\0, " data "${data}") # hex formatted C bytes
-string(REGEX REPLACE ", $" "" data "${data}") # trim the last comma (cosmetic)
-
-## Come up with C-friendly name for file
-get_filename_component(source_filename "${DATA_FILE}" NAME)
-string(MAKE_C_IDENTIFIER "${source_filename}" varname)
-
-file(WRITE "${SOURCE_FILE}" "/*\n")
-file(APPEND "${SOURCE_FILE}" " * Data converted from ${DATA_FILE}\n")
-if(FILE_TYPE STREQUAL "TEXT")
- file(APPEND "${SOURCE_FILE}" " * (null byte appended)\n")
-endif()
-file(APPEND "${SOURCE_FILE}" " */\n")
-file(APPEND "${SOURCE_FILE}" "#include <stdlib.h>\n")
-file(APPEND "${SOURCE_FILE}" "#include <stddef.h>\n\n")
-
-file(APPEND "${SOURCE_FILE}" "const char ${varname}[] = {\n ${data}\n };\n")
-file(APPEND "${SOURCE_FILE}" "const size_t ${varname}_length = sizeof(${varname});\n\n")
-
-# Backwards compatibility, matches objcopy binary symbol names
-file(APPEND "${SOURCE_FILE}" "/* Backwards compatible names, match objcopy -I binary naming */\n")
-file(APPEND "${SOURCE_FILE}" "const char *_binary_${varname}_start = ${varname};\n")
-file(APPEND "${SOURCE_FILE}" "const char *_binary_${varname}_end = ${varname} + sizeof(${varname});\n")
get_filename_component(embed_file "${embed_file}" ABSOLUTE)
get_filename_component(name "${embed_file}" NAME)
- set(embed_srcfile "${CMAKE_BINARY_DIR}/${name}.c")
+ set(embed_srcfile "${CMAKE_BINARY_DIR}/${name}.S")
add_custom_command(OUTPUT "${embed_srcfile}"
COMMAND "${CMAKE_COMMAND}"
-D "DATA_FILE=${embed_file}"
-D "SOURCE_FILE=${embed_srcfile}"
-D "FILE_TYPE=${embed_type}"
- -P "${IDF_PATH}/tools/cmake/scripts/data_file_to_c.cmake"
+ -P "${IDF_PATH}/tools/cmake/scripts/data_file_embed_asm.cmake"
MAIN_DEPENDENCY "${embed_file}"
+ DEPENDENCIES "${IDF_PATH}/tools/cmake/scripts/data_file_embed_asm.cmake"
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}")
set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "${embed_srcfile}")