CMakeLists.txt 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. # Append nanopb path to CMAKE_MODULE_PATH for finding the nanopb package
  2. cmake_minimum_required(VERSION 3.16)
  3. message(STATUS "==================================================================================")
  4. message(STATUS "=== PLATFORM PROTOBUF GENERATION ==")
  5. message(STATUS "==================================================================================")
  6. include(protobuf_utils.cmake)
  7. configure_env()
  8. add_subdirectory(proto)
  9. file(MAKE_DIRECTORY "${GENERATED_DIRECTORY}")
  10. file(MAKE_DIRECTORY "${GENERATED_PY_DIRECTORY}")
  11. file(MAKE_DIRECTORY "${GENERATED_JS_DIRECTORY}")
  12. # Custom command to run protodot when a .proto file changes
  13. foreach(PROTO_FILE IN ITEMS ${PROTO_FILES})
  14. get_filename_component(PROTO_NAME ${PROTO_FILE} NAME_WE)
  15. set(GENERATED_PY "${GENERATED_PY_DIRECTORY}/${PROTO_NAME}_pb2.py")
  16. set(GENERATED_JS "${GENERATED_JS_DIRECTORY}/${PROTO_NAME}_pb2.js")
  17. set(GENERATED_DOT "${GENERATED_DIRECTORY}/${PROTO_NAME}.dot")
  18. # Prepare the protodot command and its arguments
  19. set(PROTODOT_COMMAND
  20. ${PROTODOT_BINARY}
  21. -src ${PROTO_FILE}
  22. -select "*"
  23. -config ${CONFIG_FILE}
  24. -output ${PROTO_NAME}
  25. -generated "${GENERATED_DIRECTORY}"
  26. -inc "${PROTO_INCLUDE_DIRECTORIES}"
  27. )
  28. add_custom_command(
  29. OUTPUT ${GENERATED_DOT}
  30. COMMAND ${PROTODOT_COMMAND}
  31. DEPENDS ${PROTO_FILE}
  32. COMMENT "Generating DOT file for ${PROTO_NAME}"
  33. VERBATIM
  34. )
  35. list(APPEND GENERATED_PY_FILES ${GENERATED_PY} )
  36. list(APPEND GENERATED_JS_FILES ${GENERATED_JS} )
  37. list(APPEND GENERATED_DOT_FILES ${GENERATED_DOT})
  38. endforeach()
  39. set(PROTOC_PATH_LIST
  40. --proto_path=${TOOLS_DIR}/protoc_utils
  41. --proto_path=${CMAKE_CURRENT_SOURCE_DIR}/proto
  42. --proto_path=${NANOPB_GENERATOR_SOURCE_DIR}/proto
  43. --proto_path=${CMAKE_CURRENT_BINARY_DIR}/proto/nanopb/generator/proto
  44. )
  45. # now generate python files
  46. set(PROTOC_PYTHON_ARGS
  47. --python_out=${GENERATED_PY_DIRECTORY}
  48. # --js_out=${GENERATED_JS_DIRECTORY}
  49. ${PROTOC_PATH_LIST}
  50. ${PROTO_FILES}
  51. )
  52. add_custom_command(
  53. OUTPUT ${GENERATED_PY_FILES}
  54. COMMAND ${PROTOC_BINARY}
  55. ARGS ${PROTOC_PYTHON_ARGS}
  56. DEPENDS ${PROTO_FILES}
  57. COMMENT "Generating Python source ${GENERATED_PY_FILES}"
  58. )
  59. add_custom_target(generate_graph_files DEPENDS ${GENERATED_DOT_FILES} )
  60. add_custom_target(generate_py_files DEPENDS ${GENERATED_PY_FILES} )
  61. set_source_files_properties(${GENERATED_DOT_FILES} ${GENERATED_PY_FILES} PROPERTIES GENERATED TRUE)
  62. add_dependencies(generate_py_files generate_system_proto )
  63. set(PROTOC_UTILS_DIR ${TOOLS_DIR}/protoc_utils)
  64. set(GENERATED_PLUGIN_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/plugins")
  65. file(MAKE_DIRECTORY "${GENERATED_PLUGIN_DIRECTORY}")
  66. set(ENV{PATH} "${PROTOC_UTILS_DIR};$ENV{PATH}")
  67. if(CMAKE_HOST_UNIX)
  68. file(GLOB PLUGINS_EXECUTABLES "${PROTOC_UTILS_DIR}/protoc-gen-*")
  69. # Add custom target to set executable permissions for plugin executables
  70. add_custom_target(set_proto_plugins_permissions
  71. COMMAND ${CMAKE_COMMAND} -E echo "**** Setting permissions for required files"
  72. COMMAND chmod +x ${PLUGINS_EXECUTABLES}
  73. COMMAND ${CMAKE_COMMAND} -E echo "**** Permissions set for plugin executables"
  74. COMMAND ${CMAKE_COMMAND} -E echo "************************************************************************************************"
  75. )
  76. # Add a dependency to ensure permissions are set before building cspot component
  77. add_dependencies(generate_py_files set_proto_plugins_permissions)
  78. endif()
  79. set(GENERATED_BIN_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin")
  80. set(PROTO_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/proto;${NANOPB_GENERATOR_SOURCE_DIR}/proto")
  81. file(MAKE_DIRECTORY "${GENERATED_BIN_DIRECTORY}")
  82. string(REPLACE ":" "%3A" GENERATED_PY_DIRECTORY_ENC ${GENERATED_PY_DIRECTORY})
  83. string(REPLACE ":" "%3A" GENERATED_BIN_DIRECTORY_ENC ${GENERATED_BIN_DIRECTORY})
  84. list(APPEND PROTOC_PATH_LIST "--proto_path=${GENERATED_PY_DIRECTORY}")
  85. array_to_delimited("?" PROTOC_PATH_LIST )
  86. string(REPLACE "--proto_path=" "" PROTOC_PATH_LIST_DELIMITED ${PROTOC_PATH_LIST_DELIMITED})
  87. # message(STATUS "Encoded bin folder ${GENERATED_BIN_DIRECTORY_ENC}")
  88. # message(STATUS "Encoded protoc path list ${PROTOC_PATH_LIST_DELIMITED}")
  89. set(DEFAULTS_OUTPUT "${CMAKE_SOURCE_DIR}/spiffs/Config_defaults_pb.bin")
  90. set(PLUGINS_OPT
  91. --plugin=protoc-gen-ZZZZ=${PROTOC_UTILS_DIR}/protoc-gen-ZZZZ${PROTOC_PLUGIN_SUFFIX}
  92. --ZZZZ_out=main_class=sys.Config!sys.Status!sys.State:${GENERATED_PLUGIN_DIRECTORY}
  93. --ZZZZ_opt=options=customoptions
  94. --ZZZZ_opt=path=${PROTOC_PATH_LIST_DELIMITED}
  95. --ZZZZ_opt=binpath=${GENERATED_BIN_DIRECTORY}
  96. --ZZZZ_opt=const_prefix=squeezelite-
  97. --ZZZZ_opt=defaultspath=${CMAKE_SOURCE_DIR}/spiffs
  98. )
  99. replace_in_list(PLUGINS_OPT "ZZZZ" "dump" DUMP_OUT_OPTS)
  100. replace_in_list(PLUGINS_OPT "ZZZZ" "json" DUMP_JSON_OPTS)
  101. replace_in_list(PLUGINS_OPT "ZZZZ" "defaults" DUMP_DEFAULTS_OPTS)
  102. replace_in_list(PLUGINS_OPT "ZZZZ" "options" DUMP_OPTIONS_OPTS)
  103. # print_array("DUMP_OUT_OPTS plugins options:" "${DUMP_OUT_OPTS}" "NEWLINE")
  104. set(PROTOC_ARGS
  105. ${DUMP_OUT_OPTS}
  106. ${DUMP_JSON_OPTS}
  107. ${DUMP_DEFAULTS_OPTS}
  108. ${DUMP_OPTIONS_OPTS}
  109. ${PROTOC_PATH_LIST}
  110. ${PROTO_FILES}
  111. )
  112. # print_array("PROTOC Args:" "${PROTOC_ARGS}" "NEWLINE")
  113. SET(PLUGINS_OUTPUT
  114. "${GENERATED_BIN_DIRECTORY}/code_generator_request.bin"
  115. "${GENERATED_PLUGIN_DIRECTORY}/Config_pb2.json"
  116. "${GENERATED_PLUGIN_DIRECTORY}/Status_pb2.json"
  117. "${DEFAULTS_OUTPUT}"
  118. )
  119. add_custom_command(
  120. OUTPUT ${PLUGINS_OUTPUT}
  121. COMMAND ${PROTOC_BINARY}
  122. ARGS ${PROTOC_ARGS}
  123. DEPENDS ${PROTO_FILES}
  124. COMMENT "Generating various sources for ${PLUGINS_OUTPUT}"
  125. )
  126. add_dependencies(generate_graph_files generate_system_proto )
  127. add_custom_target(generate_plugins_files DEPENDS ${PLUGINS_OUTPUT} )
  128. add_dependencies(generate_plugins_files generate_py_files)
  129. add_dependencies(__idf_platform_config generate_plugins_files)
  130. set_source_files_properties( ${PLUGINS_OUTPUT} PROPERTIES GENERATED TRUE)
  131. file(GLOB SOURCE_JSON_FILES "${CMAKE_CURRENT_SOURCE_DIR}/targets/*.json")
  132. set(GENERATED_BIN_DIRECTORY "${CMAKE_SOURCE_DIR}/spiffs/targets")
  133. file(MAKE_DIRECTORY "${GENERATED_BIN_DIRECTORY}")
  134. foreach(SOURCE_JSON_FILE IN ITEMS ${SOURCE_JSON_FILES})
  135. get_filename_component(TARGET_NAME ${SOURCE_JSON_FILE} NAME_WE)
  136. set(GENERATED_BIN "${GENERATED_BIN_DIRECTORY}/${TARGET_NAME}.bin")
  137. # Prepare the protodot command and its arguments
  138. set(PROTOBIN_COMMAND
  139. ${PYTHON_EXECUTABLE}
  140. ${TOOLS_DIR}/protoc_utils/generate_bin.py
  141. --proto_file "${CMAKE_CURRENT_BINARY_DIR}/py/configuration"
  142. --main_class "Config"
  143. --target_dir "${GENERATED_BIN_DIRECTORY}"
  144. --json ${SOURCE_JSON_FILE}
  145. --include "${CMAKE_CURRENT_BINARY_DIR}/proto/nanopb/generator/proto"
  146. --include "${CMAKE_CURRENT_BINARY_DIR}/py/"
  147. )
  148. add_custom_command(
  149. OUTPUT ${GENERATED_BIN}
  150. COMMAND ${PROTOBIN_COMMAND}
  151. DEPENDS ${SOURCE_JSON_FILE} ${PROTO_FILES} ${GENERATED_PY_FILES}
  152. COMMENT "Generating BIN file for target ${TARGET_NAME}"
  153. VERBATIM
  154. )
  155. list(APPEND GENERATED_BIN_FILES ${GENERATED_BIN} )
  156. endforeach()
  157. add_custom_target(generate_spiffs_bin DEPENDS ${GENERATED_BIN_FILES} ${DEFAULTS_OUTPUT})
  158. set_source_files_properties(${GENERATED_BIN_FILES} PROPERTIES GENERATED TRUE)
  159. add_dependencies(generate_spiffs_bin generate_system_proto)
  160. message(STATUS "==================================================================================")