CMakeLists.txt 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. cmake_minimum_required(VERSION 3.16)
  2. include(${IDF_PATH}/tools/cmake/utilities.cmake)
  3. project(${ULP_APP_NAME} ASM C)
  4. option(ULP_COCPU_IS_RISCV "Use RISC-V based ULP" OFF)
  5. set(version_pattern "[a-z0-9\.-]+")
  6. # Check assembler version
  7. execute_process(
  8. COMMAND ${CMAKE_ASM_COMPILER} --version
  9. OUTPUT_VARIABLE as_output
  10. ERROR_QUIET)
  11. string(REGEX MATCH "\\(GNU Binutils\\) (${version_pattern})" as_version ${as_output})
  12. set(as_version ${CMAKE_MATCH_1})
  13. message(STATUS "Building ULP app ${ULP_APP_NAME}")
  14. if(ULP_COCPU_IS_RISCV)
  15. set(ULP_LD_TEMPLATE ${IDF_PATH}/components/ulp/ld/ulp_riscv.ld)
  16. else()
  17. message(STATUS "ULP assembler version: ${as_version}")
  18. # Check the supported assembler version
  19. file(STRINGS ${IDF_PATH}/components/ulp/toolchain_ulp_version.mk version_file_contents)
  20. string(REGEX MATCH
  21. "SUPPORTED_ULP_ASSEMBLER_VERSION = (${version_pattern})"
  22. as_supported_version
  23. ${version_file_contents})
  24. set(as_supported_version ${CMAKE_MATCH_1})
  25. if(NOT as_version STREQUAL as_supported_version)
  26. message(WARNING "WARNING: ULP assembler version ${as_version} is not supported. Expected to see version: \
  27. ${as_supported_version}. Please check ESP-IDF ULP setup instructions and update \
  28. the toolchain, or proceed at your own risk.")
  29. endif()
  30. set(ULP_LD_TEMPLATE ${IDF_PATH}/components/ulp/ld/ulp_fsm.ld)
  31. endif()
  32. set(ULP_MAP_GEN ${PYTHON} ${IDF_PATH}/components/ulp/esp32ulp_mapgen.py)
  33. get_filename_component(sdkconfig_dir ${SDKCONFIG_HEADER} DIRECTORY)
  34. foreach(include ${COMPONENT_INCLUDES})
  35. list(APPEND component_includes -I${include})
  36. endforeach()
  37. list(APPEND ULP_PREPROCESSOR_ARGS ${component_includes})
  38. list(APPEND ULP_PREPROCESSOR_ARGS -I${COMPONENT_DIR})
  39. list(APPEND ULP_PREPROCESSOR_ARGS -I${sdkconfig_dir})
  40. include_directories(${COMPONENT_INCLUDES})
  41. list(APPEND ULP_PREPROCESSOR_ARGS -D__ASSEMBLER__)
  42. # Preprocess linker script, pre-linking
  43. get_filename_component(ULP_LD_SCRIPT ${ULP_LD_TEMPLATE} NAME)
  44. add_custom_command(OUTPUT ${ULP_LD_SCRIPT}
  45. COMMAND ${CMAKE_C_COMPILER} -E -P -xc -o ${ULP_LD_SCRIPT} ${ULP_PREPROCESSOR_ARGS} ${ULP_LD_TEMPLATE}
  46. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  47. DEPENDS ${ULP_LD_TEMPLATE} ${SDKCONFIG_HEADER}
  48. VERBATIM)
  49. add_custom_target(${ULP_APP_NAME}_ld_script
  50. DEPENDS ${ULP_LD_SCRIPT}
  51. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
  52. # To avoid warning "Manually-specified variables were not used by the project"
  53. set(bypassWarning "${IDF_TARGET}")
  54. if(ULP_COCPU_IS_RISCV)
  55. #risc-v ulp uses extra files for building:
  56. list(APPEND ULP_S_SOURCES
  57. "${IDF_PATH}/components/ulp/ulp_riscv/ulp_core/start.S"
  58. "${IDF_PATH}/components/ulp/ulp_riscv/ulp_core/ulp_riscv_adc.c"
  59. "${IDF_PATH}/components/ulp/ulp_riscv/ulp_core/ulp_riscv_lock.c"
  60. "${IDF_PATH}/components/ulp/ulp_riscv/ulp_core/ulp_riscv_uart.c"
  61. "${IDF_PATH}/components/ulp/ulp_riscv/ulp_core/ulp_riscv_print.c"
  62. "${IDF_PATH}/components/ulp/ulp_riscv/ulp_core/ulp_riscv_utils.c")
  63. #dummy loop to force pre-processed linker file generation:
  64. foreach(ulp_s_source ${ULP_S_SOURCES})
  65. set(noop ${ulp_s_source})
  66. add_custom_command(OUTPUT ${noop}
  67. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  68. COMMAND cmake -E echo
  69. DEPENDS ${ULP_LD_SCRIPT}
  70. )
  71. set_source_files_properties(${noop} PROPERTIES NOOP_PROPERTY ${ULP_LD_SCRIPT})
  72. endforeach()
  73. #creates the executable:
  74. add_executable(${ULP_APP_NAME} ${ULP_S_SOURCES})
  75. set(DUMP_SYMBOL_ARGS -g)
  76. set(MAP_GEN_EXTRA_ARGS --riscv)
  77. set(EXTRA_LINKER_ARGS "-nostartfiles")
  78. list(APPEND EXTRA_LINKER_ARGS "-Wl,--gc-sections")
  79. list(APPEND EXTRA_LINKER_ARGS "-Wl,-Map=\"${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME}.map\"")
  80. #Makes the csr utillies for riscv visible:
  81. target_include_directories(${ULP_APP_NAME} PRIVATE "${IDF_PATH}/components/ulp/ulp_riscv/ulp_core/include"
  82. "${IDF_PATH}/components/ulp/ulp_riscv/shared/include")
  83. target_link_libraries(${ULP_APP_NAME} "-T \"${IDF_PATH}/components/ulp/ld/${IDF_TARGET}.periperals.ld\"")
  84. target_compile_definitions(${ULP_APP_NAME} PRIVATE IS_ULP_COCPU)
  85. else()
  86. foreach(ulp_s_source ${ULP_S_SOURCES})
  87. get_filename_component(ulp_ps_source ${ulp_s_source} NAME_WE)
  88. set(ulp_ps_output ${CMAKE_CURRENT_BINARY_DIR}/${ulp_ps_source}.ulp.S)
  89. # Generate preprocessed assembly files.
  90. add_custom_command(OUTPUT ${ulp_ps_output}
  91. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  92. COMMAND ${CMAKE_C_COMPILER} -E -P -xc ${ULP_PREPROCESSOR_ARGS}
  93. -o ${ulp_ps_output} ${ulp_s_source}
  94. DEPENDS ${ulp_s_source} ${ULP_LD_SCRIPT}
  95. VERBATIM)
  96. # During assembly file compilation, output listing files as well.
  97. set_source_files_properties(${ulp_ps_output}
  98. PROPERTIES COMPILE_FLAGS
  99. "-al=${CMAKE_CURRENT_BINARY_DIR}/${ulp_ps_source}.lst")
  100. list(APPEND ULP_PS_SOURCES ${ulp_ps_output})
  101. endforeach()
  102. # Create an executable
  103. add_executable(${ULP_APP_NAME} ${ULP_PS_SOURCES})
  104. set(DUMP_SYMBOL_ARGS -g -f posix)
  105. set(MAP_GEN_EXTRA_ARGS .)
  106. set(EXTRA_LINKER_ARGS "-Map=\"${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME}.map\"")
  107. endif()
  108. # Dump the list of global symbols in a convenient format
  109. add_custom_command(OUTPUT ${ULP_APP_NAME}.sym
  110. COMMAND ${CMAKE_NM} ${DUMP_SYMBOL_ARGS} $<TARGET_FILE:${ULP_APP_NAME}> > ${ULP_APP_NAME}.sym
  111. DEPENDS ${ULP_APP_NAME}
  112. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
  113. # Dump the binary for inclusion into the project
  114. add_custom_command(OUTPUT ${ULP_APP_NAME}.bin
  115. COMMAND ${CMAKE_OBJCOPY} -O binary $<TARGET_FILE:${ULP_APP_NAME}> ${ULP_APP_NAME}.bin
  116. DEPENDS ${ULP_APP_NAME}
  117. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
  118. add_custom_command(OUTPUT ${ULP_APP_NAME}.ld ${ULP_APP_NAME}.h
  119. COMMAND ${ULP_MAP_GEN} ${MAP_GEN_EXTRA_ARGS} -s ${ULP_APP_NAME}.sym -o ${ULP_APP_NAME}
  120. DEPENDS ${ULP_APP_NAME}.sym
  121. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
  122. # Building the component separately from the project should result in
  123. # ULP files being built.
  124. add_custom_target(build
  125. DEPENDS ${ULP_APP_NAME} ${ULP_APP_NAME}.bin ${ULP_APP_NAME}.sym
  126. ${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME}.ld
  127. ${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME}.h
  128. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
  129. target_link_libraries(${ULP_APP_NAME} "-T\"${CMAKE_CURRENT_BINARY_DIR}/${ULP_LD_SCRIPT}\"")
  130. target_link_libraries(${ULP_APP_NAME} ${EXTRA_LINKER_ARGS})
  131. set_target_properties(${ULP_APP_NAME} PROPERTIES LINK_DEPENDS ${ULP_LD_SCRIPT})