cmake: fix C identifier generation from embedded file
This commit is contained in:
parent
4395be9697
commit
01a7db799f
9 changed files with 47 additions and 18 deletions
|
@ -38,13 +38,11 @@ string(REGEX REPLACE "[^\n]+$" ".byte \\0\n" data "${data}")
|
|||
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 variable name based on source file
|
||||
# unless VARIABLE_BASENAME is set
|
||||
# Use source file name as variable name unless VARIABLE_BASENAME is set
|
||||
if(NOT VARIABLE_BASENAME)
|
||||
get_filename_component(source_filename "${DATA_FILE}" NAME)
|
||||
string(MAKE_C_IDENTIFIER "${source_filename}" varname)
|
||||
get_filename_component(varname "${DATA_FILE}" NAME)
|
||||
else()
|
||||
string(MAKE_C_IDENTIFIER "${VARIABLE_BASENAME}" varname)
|
||||
set(varname "${VARIABLE_BASENAME}")
|
||||
endif()
|
||||
|
||||
function(append str)
|
||||
|
@ -55,13 +53,14 @@ 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")
|
||||
function(make_and_append_identifier str)
|
||||
string(MAKE_C_IDENTIFIER "${str}" symbol)
|
||||
append_line("\n.global ${symbol}")
|
||||
append("${symbol}:")
|
||||
if(${ARGC} GREATER 1) # optional comment
|
||||
append(" /* ${ARGV1} */")
|
||||
endif()
|
||||
append("\n")
|
||||
endfunction()
|
||||
|
||||
file(WRITE "${SOURCE_FILE}" "/*")
|
||||
|
@ -73,16 +72,15 @@ append_line(" */")
|
|||
|
||||
append_line(".data")
|
||||
append_line(".section .rodata.embedded")
|
||||
append_identifier("${varname}")
|
||||
append_identifier("_binary_${varname}_start" "for objcopy compatibility")
|
||||
make_and_append_identifier("${varname}")
|
||||
make_and_append_identifier("_binary_${varname}_start" "for objcopy compatibility")
|
||||
append("${data}")
|
||||
|
||||
append_identifier("_binary_${varname}_end" "for objcopy compatibility")
|
||||
make_and_append_identifier("_binary_${varname}_end" "for objcopy compatibility")
|
||||
|
||||
append_line("")
|
||||
if(FILE_TYPE STREQUAL "TEXT")
|
||||
append_identifier("${varname}_length" "not including null byte")
|
||||
make_and_append_identifier("${varname}_length" "not including null byte")
|
||||
else()
|
||||
append_identifier("${varname}_length")
|
||||
make_and_append_identifier("${varname}_length")
|
||||
endif()
|
||||
append_line(".word ${data_len}")
|
||||
|
|
6
tools/test_apps/build_system/embed_test/CMakeLists.txt
Normal file
6
tools/test_apps/build_system/embed_test/CMakeLists.txt
Normal file
|
@ -0,0 +1,6 @@
|
|||
# The following lines of boilerplate have to be in your project's
|
||||
# CMakeLists in this exact order for cmake to work correctly
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
|
||||
project(file_embed_test)
|
1
tools/test_apps/build_system/embed_test/README.txt
Normal file
1
tools/test_apps/build_system/embed_test/README.txt
Normal file
|
@ -0,0 +1 @@
|
|||
This project tests that proper identifiers are generated during build for embedded files.
|
0
tools/test_apps/build_system/embed_test/main/2file.txt
Normal file
0
tools/test_apps/build_system/embed_test/main/2file.txt
Normal file
|
@ -0,0 +1,4 @@
|
|||
idf_component_register(SRCS "test_main.c"
|
||||
INCLUDE_DIRS "."
|
||||
# Test file names starting with a number, a letter and an underscore.
|
||||
EMBED_TXTFILES "2file.txt" "file.txt" "_file.txt")
|
0
tools/test_apps/build_system/embed_test/main/_file.txt
Normal file
0
tools/test_apps/build_system/embed_test/main/_file.txt
Normal file
0
tools/test_apps/build_system/embed_test/main/file.txt
Normal file
0
tools/test_apps/build_system/embed_test/main/file.txt
Normal file
18
tools/test_apps/build_system/embed_test/main/test_main.c
Normal file
18
tools/test_apps/build_system/embed_test/main/test_main.c
Normal file
|
@ -0,0 +1,18 @@
|
|||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
extern uint8_t _2file_start[] asm("_binary_2file_txt_start");
|
||||
extern uint8_t _2file_end[] asm("_binary_2file_txt_end");
|
||||
extern uint8_t file_start[] asm("_binary_file_txt_start");
|
||||
extern uint8_t file_end[] asm("_binary_file_txt_start");
|
||||
extern uint8_t _file_start[] asm("_binary__file_txt_start");
|
||||
extern uint8_t _file_end[] asm("_binary__file_txt_start");
|
||||
|
||||
#define PRINT_ADDR(f) printf("%s -> start: %p end:%p\n", #f, f ## _start, f ## _end);
|
||||
|
||||
void app_main(void)
|
||||
{
|
||||
PRINT_ADDR(_2file);
|
||||
PRINT_ADDR(file);
|
||||
PRINT_ADDR(_file);
|
||||
}
|
|
@ -1,2 +1,4 @@
|
|||
idf_component_register(SRCS "test_main.c"
|
||||
INCLUDE_DIRS ".")
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue