Просмотр исходного кода

cmake: fix C identifier generation from embedded file

Renz Bagaporo 5 лет назад
Родитель
Сommit
d41f856576

+ 16 - 18
tools/cmake/scripts/data_file_embed_asm.cmake

@@ -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 - 0
tools/test_apps/build_system/embed_test/CMakeLists.txt

@@ -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 - 0
tools/test_apps/build_system/embed_test/README.txt

@@ -0,0 +1 @@
+This project tests that proper identifiers are generated during build for embedded files.

+ 0 - 0
tools/test_apps/build_system/embed_test/main/2file.txt


+ 4 - 0
tools/test_apps/build_system/embed_test/main/CMakeLists.txt

@@ -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 - 0
tools/test_apps/build_system/embed_test/main/_file.txt


+ 0 - 0
tools/test_apps/build_system/embed_test/main/file.txt


+ 18 - 0
tools/test_apps/build_system/embed_test/main/test_main.c

@@ -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);
+}

+ 2 - 0
tools/test_apps/system/build_test/main/CMakeLists.txt

@@ -1,2 +1,4 @@
 idf_component_register(SRCS "test_main.c"
                        INCLUDE_DIRS ".")
+
+