diff --git a/components/ulp/component_ulp_common.cmake b/components/ulp/component_ulp_common.cmake index 0d2ec262a..ce207f802 100644 --- a/components/ulp/component_ulp_common.cmake +++ b/components/ulp/component_ulp_common.cmake @@ -1,63 +1,18 @@ -if(NOT CMAKE_BUILD_EARLY_EXPANSION) - spaces2list(ULP_S_SOURCES) - foreach(ulp_s_source ${ULP_S_SOURCES}) - get_filename_component(ulp_s_source ${ulp_s_source} ABSOLUTE) - list(APPEND ulp_s_sources ${ulp_s_source}) - endforeach() +message(WARNING "Embedding ULP binary by including \ +${IDF_PATH}/components/ulp/component_ulp_common.cmake is deprecated. Use `ulp_embed_binary` instead. \ +See API Guide for more details.") - foreach(ulp_s_source ${ulp_s_sources}) - get_filename_component(ulp_ps_source ${ulp_s_source} NAME_WE) - set(ulp_ps_output ${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME}/${ulp_ps_source}.ulp.S) - list(APPEND ulp_ps_sources ${ulp_ps_output}) - endforeach() +spaces2list(ULP_S_SOURCES) +spaces2list(ULP_EXP_DEP_SRCS) - set(ulp_artifacts_prefix ${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME}/${ULP_APP_NAME}) +foreach(ulp_s_source ${ULP_S_SOURCES}) + get_filename_component(ulp_src ${ulp_s_source} ABSOLUTE BASE_DIR ${COMPONENT_DIR}) + list(APPEND ulp_srcs ${ulp_src}) +endforeach() - set(ulp_artifacts ${ulp_artifacts_prefix}.bin - ${ulp_artifacts_prefix}.ld - ${ulp_artifacts_prefix}.h) +foreach(ulp_exp_dep_src ${ULP_EXP_DEP_SRCS}) + get_filename_component(ulp_dep_src ${ulp_exp_dep_src} ABSOLUTE BASE_DIR ${COMPONENT_DIR}) + list(APPEND ulp_dep_srcs ${ulp_dep_src}) +endforeach() - set(ulp_artifacts_extras ${ulp_artifacts_prefix}.map - ${ulp_artifacts_prefix}.sym - ${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME}/esp32.ulp.ld) - - # Replace the separator for the list of ULP source files that will be passed to - # the external ULP project. This is a workaround to the bug https://public.kitware.com/Bug/view.php?id=16137. - string(REPLACE ";" "|" ulp_s_sources "${ulp_s_sources}") - - idf_build_get_property(sdkconfig_header SDKCONFIG_HEADER) - idf_build_get_property(idf_path IDF_PATH) - idf_build_get_property(python PYTHON) - externalproject_add(${ULP_APP_NAME} - SOURCE_DIR ${idf_path}/components/ulp/cmake - BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME} - INSTALL_COMMAND "" - CMAKE_ARGS -DCMAKE_GENERATOR=${CMAKE_GENERATOR} - -DCMAKE_TOOLCHAIN_FILE=${idf_path}/components/ulp/cmake/toolchain-ulp.cmake - -DULP_S_SOURCES=${ulp_s_sources} -DULP_APP_NAME=${ULP_APP_NAME} - -DCOMPONENT_DIR=${COMPONENT_DIR} - # Even though this resolves to a ';' separated list, this is fine. This must be special behavior - # for generator expressions. - -DCOMPONENT_INCLUDES=$ - -DIDF_PATH=${idf_path} - -DSDKCONFIG=${sdkconfig_header} - -DPYTHON=${python} - BUILD_COMMAND ${CMAKE_COMMAND} --build ${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME} --target build - BUILD_BYPRODUCTS ${ulp_artifacts} ${ulp_artifacts_extras} ${ulp_ps_sources} - ${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME}/${ULP_APP_NAME} - BUILD_ALWAYS 1 - LIST_SEPARATOR | - ) - - spaces2list(ULP_EXP_DEP_SRCS) - set_source_files_properties(${ULP_EXP_DEP_SRCS} PROPERTIES OBJECT_DEPENDS ${ulp_artifacts}) - - include_directories(${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME}) - - add_custom_target(${ULP_APP_NAME}_artifacts DEPENDS ${ULP_APP_NAME}) - - add_dependencies(${COMPONENT_LIB} ${ULP_APP_NAME}_artifacts) - - target_linker_script(${COMPONENT_LIB} ${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME}/${ULP_APP_NAME}.ld) - target_add_binary_data(${COMPONENT_LIB} ${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME}/${ULP_APP_NAME}.bin BINARY) -endif() \ No newline at end of file +ulp_embed_binary(${ULP_APP_NAME} ${ulp_srcs} ${ulp_dep_srcs}) diff --git a/components/ulp/project_include.cmake b/components/ulp/project_include.cmake new file mode 100644 index 000000000..b5ac4c54e --- /dev/null +++ b/components/ulp/project_include.cmake @@ -0,0 +1,67 @@ +# ulp_embed_binary +# +# Create ULP binary and embed into the application. +function(ulp_embed_binary app_name s_sources exp_dep_srcs) + if(NOT CMAKE_BUILD_EARLY_EXPANSION) + spaces2list(s_sources) + foreach(source ${s_sources}) + get_filename_component(source ${source} ABSOLUTE BASE_DIR ${CMAKE_CURRENT_LIST_DIR}) + list(APPEND sources ${source}) + endforeach() + + foreach(source ${sources}) + get_filename_component(ps_source ${source} NAME_WE) + set(ps_output ${CMAKE_CURRENT_BINARY_DIR}/${app_name}/${ps_source}.ulp.S) + list(APPEND ps_sources ${ps_output}) + endforeach() + + set(ulp_artifacts_prefix ${CMAKE_CURRENT_BINARY_DIR}/${app_name}/${app_name}) + + set(ulp_artifacts ${ulp_artifacts_prefix}.bin + ${ulp_artifacts_prefix}.ld + ${ulp_artifacts_prefix}.h) + + set(ulp_artifacts_extras ${ulp_artifacts_prefix}.map + ${ulp_artifacts_prefix}.sym + ${CMAKE_CURRENT_BINARY_DIR}/${app_name}/esp32.ulp.ld) + + # Replace the separator for the list of ULP source files that will be passed to + # the external ULP project. This is a workaround to the bug https://public.kitware.com/Bug/view.php?id=16137. + string(REPLACE ";" "|" ulp_s_sources "${ulp_s_sources}") + + idf_build_get_property(sdkconfig_header SDKCONFIG_HEADER) + idf_build_get_property(idf_path IDF_PATH) + idf_build_get_property(python PYTHON) + externalproject_add(${app_name} + SOURCE_DIR ${idf_path}/components/ulp/cmake + BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${app_name} + INSTALL_COMMAND "" + CMAKE_ARGS -DCMAKE_GENERATOR=${CMAKE_GENERATOR} + -DCMAKE_TOOLCHAIN_FILE=${idf_path}/components/ulp/cmake/toolchain-ulp.cmake + -DULP_S_SOURCES=${sources} -DULP_APP_NAME=${app_name} + -DCOMPONENT_DIR=${COMPONENT_DIR} + # Even though this resolves to a ';' separated list, this is fine. This must be special behavior + # for generator expressions. + -DCOMPONENT_INCLUDES=$ + -DIDF_PATH=${idf_path} + -DSDKCONFIG=${SDKCONFIG_HEADER} + BUILD_COMMAND ${CMAKE_COMMAND} --build ${CMAKE_CURRENT_BINARY_DIR}/${app_name} --target build + BUILD_BYPRODUCTS ${ulp_artifacts} ${ulp_artifacts_extras} ${ulp_ps_sources} + ${CMAKE_CURRENT_BINARY_DIR}/${app_name}/${app_name} + BUILD_ALWAYS 1 + LIST_SEPARATOR | + ) + + spaces2list(exp_dep_srcs) + set_source_files_properties(${exp_dep_srcs} PROPERTIES OBJECT_DEPENDS ${ulp_artifacts}) + + include_directories(${CMAKE_CURRENT_BINARY_DIR}/${app_name}) + + add_custom_target(${app_name}_artifacts DEPENDS ${app_name}) + + add_dependencies(${COMPONENT_LIB} ${app_name}_artifacts) + + target_linker_script(${COMPONENT_LIB} ${CMAKE_CURRENT_BINARY_DIR}/${app_name}/${app_name}.ld) + target_add_binary_data(${COMPONENT_LIB} ${CMAKE_CURRENT_BINARY_DIR}/${app_name}/${app_name}.bin BINARY) + endif() +endfunction() \ No newline at end of file diff --git a/components/ulp/test/CMakeLists.txt b/components/ulp/test/CMakeLists.txt index 20a82c897..296fda014 100644 --- a/components/ulp/test/CMakeLists.txt +++ b/components/ulp/test/CMakeLists.txt @@ -5,8 +5,7 @@ set(COMPONENT_REQUIRES unity ulp soc esp_common) register_component() -set(ULP_APP_NAME ulp_test_app) -set(ULP_S_SOURCES "ulp/test_jumps.S") -set(ULP_EXP_DEP_SRCS "test_ulp_as.c") -idf_build_get_property(idf_path IDF_PATH) -include(${idf_path}/components/ulp/component_ulp_common.cmake) \ No newline at end of file +set(ulp_app_name ulp_test_app) +set(ulp_s_sources "ulp/test_jumps.S") +set(ulp_exp_dep_srcs "test_ulp_as.c") +ulp_embed_binary(${ulp_app_name} ${ulp_s_sources} ${ulp_exp_dep_srcs})