mirror of
https://github.com/sle118/squeezelite-esp32.git
synced 2025-12-16 08:27:01 +03:00
195 lines
7.4 KiB
CMake
195 lines
7.4 KiB
CMake
# Append nanopb path to CMAKE_MODULE_PATH for finding the nanopb package
|
|
cmake_minimum_required(VERSION 3.16)
|
|
message(STATUS "==================================================================================")
|
|
message(STATUS "=== PLATFORM PROTOBUF GENERATION ==")
|
|
message(STATUS "==================================================================================")
|
|
include(protobuf_utils.cmake)
|
|
|
|
configure_env()
|
|
add_subdirectory(proto)
|
|
file(MAKE_DIRECTORY "${GENERATED_DIRECTORY}")
|
|
file(MAKE_DIRECTORY "${GENERATED_PY_DIRECTORY}")
|
|
file(MAKE_DIRECTORY "${GENERATED_JS_DIRECTORY}")
|
|
|
|
|
|
# Custom command to run protodot when a .proto file changes
|
|
foreach(PROTO_FILE IN ITEMS ${PROTO_FILES})
|
|
get_filename_component(PROTO_NAME ${PROTO_FILE} NAME_WE)
|
|
set(GENERATED_PY "${GENERATED_PY_DIRECTORY}/${PROTO_NAME}_pb2.py")
|
|
set(GENERATED_JS "${GENERATED_JS_DIRECTORY}/${PROTO_NAME}_pb2.js")
|
|
set(GENERATED_DOT "${GENERATED_DIRECTORY}/${PROTO_NAME}.dot")
|
|
|
|
# Prepare the protodot command and its arguments
|
|
set(PROTODOT_COMMAND
|
|
${PROTODOT_BINARY}
|
|
-src ${PROTO_FILE}
|
|
-select "*"
|
|
-config ${CONFIG_FILE}
|
|
-output ${PROTO_NAME}
|
|
-generated "${GENERATED_DIRECTORY}"
|
|
-inc "${PROTO_INCLUDE_DIRECTORIES}"
|
|
)
|
|
add_custom_command(
|
|
OUTPUT ${GENERATED_DOT}
|
|
COMMAND ${PROTODOT_COMMAND}
|
|
DEPENDS ${PROTO_FILE}
|
|
COMMENT "Generating DOT file for ${PROTO_NAME}"
|
|
VERBATIM
|
|
)
|
|
|
|
|
|
list(APPEND GENERATED_PY_FILES ${GENERATED_PY} )
|
|
list(APPEND GENERATED_JS_FILES ${GENERATED_JS} )
|
|
list(APPEND GENERATED_DOT_FILES ${GENERATED_DOT})
|
|
endforeach()
|
|
|
|
set(PROTOC_PATH_LIST
|
|
--proto_path=${TOOLS_DIR}/protoc_utils
|
|
--proto_path=${CMAKE_CURRENT_SOURCE_DIR}/proto
|
|
--proto_path=${NANOPB_GENERATOR_SOURCE_DIR}/proto
|
|
--proto_path=${CMAKE_CURRENT_BINARY_DIR}/proto/nanopb/generator/proto
|
|
)
|
|
|
|
# now generate python files
|
|
set(PROTOC_PYTHON_ARGS
|
|
--python_out=${GENERATED_PY_DIRECTORY}
|
|
# --js_out=${GENERATED_JS_DIRECTORY}
|
|
${PROTOC_PATH_LIST}
|
|
${PROTO_FILES}
|
|
)
|
|
|
|
add_custom_command(
|
|
OUTPUT ${GENERATED_PY_FILES}
|
|
COMMAND ${PROTOC_BINARY}
|
|
ARGS ${PROTOC_PYTHON_ARGS}
|
|
DEPENDS ${PROTO_FILES}
|
|
COMMENT "Generating Python source ${GENERATED_PY_FILES}"
|
|
)
|
|
add_custom_target(generate_graph_files DEPENDS ${GENERATED_DOT_FILES} )
|
|
add_custom_target(generate_py_files DEPENDS ${GENERATED_PY_FILES} )
|
|
set_source_files_properties(${GENERATED_DOT_FILES} ${GENERATED_PY_FILES} PROPERTIES GENERATED TRUE)
|
|
add_dependencies(generate_py_files generate_system_proto )
|
|
|
|
|
|
|
|
set(PROTOC_UTILS_DIR ${TOOLS_DIR}/protoc_utils)
|
|
set(GENERATED_PLUGIN_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/plugins")
|
|
file(MAKE_DIRECTORY "${GENERATED_PLUGIN_DIRECTORY}")
|
|
set(ENV{PATH} "${PROTOC_UTILS_DIR};$ENV{PATH}")
|
|
|
|
if(CMAKE_HOST_UNIX)
|
|
file(GLOB PLUGINS_EXECUTABLES "${PROTOC_UTILS_DIR}/protoc-gen-*")
|
|
|
|
# Add custom target to set executable permissions for plugin executables
|
|
add_custom_target(set_proto_plugins_permissions
|
|
COMMAND ${CMAKE_COMMAND} -E echo "**** Setting permissions for required files"
|
|
COMMAND chmod +x ${PLUGINS_EXECUTABLES}
|
|
COMMAND ${CMAKE_COMMAND} -E echo "**** Permissions set for plugin executables"
|
|
COMMAND ${CMAKE_COMMAND} -E echo "************************************************************************************************"
|
|
)
|
|
|
|
# Add a dependency to ensure permissions are set before building cspot component
|
|
add_dependencies(generate_py_files set_proto_plugins_permissions)
|
|
endif()
|
|
|
|
set(GENERATED_BIN_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin")
|
|
set(PROTO_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/proto;${NANOPB_GENERATOR_SOURCE_DIR}/proto")
|
|
file(MAKE_DIRECTORY "${GENERATED_BIN_DIRECTORY}")
|
|
|
|
string(REPLACE ":" "%3A" GENERATED_PY_DIRECTORY_ENC ${GENERATED_PY_DIRECTORY})
|
|
string(REPLACE ":" "%3A" GENERATED_BIN_DIRECTORY_ENC ${GENERATED_BIN_DIRECTORY})
|
|
list(APPEND PROTOC_PATH_LIST "--proto_path=${GENERATED_PY_DIRECTORY}")
|
|
array_to_delimited("?" PROTOC_PATH_LIST )
|
|
string(REPLACE "--proto_path=" "" PROTOC_PATH_LIST_DELIMITED ${PROTOC_PATH_LIST_DELIMITED})
|
|
|
|
|
|
# message(STATUS "Encoded bin folder ${GENERATED_BIN_DIRECTORY_ENC}")
|
|
# message(STATUS "Encoded protoc path list ${PROTOC_PATH_LIST_DELIMITED}")
|
|
set(DEFAULTS_OUTPUT "${CMAKE_SOURCE_DIR}/spiffs/Config_defaults_pb.bin")
|
|
|
|
set(PLUGINS_OPT
|
|
--plugin=protoc-gen-ZZZZ=${PROTOC_UTILS_DIR}/protoc-gen-ZZZZ${PROTOC_PLUGIN_SUFFIX}
|
|
--ZZZZ_out=main_class=sys.Config!sys.Status!sys.State:${GENERATED_PLUGIN_DIRECTORY}
|
|
--ZZZZ_opt=options=customoptions
|
|
--ZZZZ_opt=path=${PROTOC_PATH_LIST_DELIMITED}
|
|
--ZZZZ_opt=binpath=${GENERATED_BIN_DIRECTORY}
|
|
--ZZZZ_opt=const_prefix=squeezelite-
|
|
--ZZZZ_opt=defaultspath=${CMAKE_SOURCE_DIR}/spiffs
|
|
)
|
|
|
|
|
|
replace_in_list(PLUGINS_OPT "ZZZZ" "dump" DUMP_OUT_OPTS)
|
|
replace_in_list(PLUGINS_OPT "ZZZZ" "json" DUMP_JSON_OPTS)
|
|
replace_in_list(PLUGINS_OPT "ZZZZ" "defaults" DUMP_DEFAULTS_OPTS)
|
|
replace_in_list(PLUGINS_OPT "ZZZZ" "options" DUMP_OPTIONS_OPTS)
|
|
|
|
|
|
# print_array("DUMP_OUT_OPTS plugins options:" "${DUMP_OUT_OPTS}" "NEWLINE")
|
|
|
|
|
|
set(PROTOC_ARGS
|
|
${DUMP_OUT_OPTS}
|
|
${DUMP_JSON_OPTS}
|
|
${DUMP_DEFAULTS_OPTS}
|
|
${DUMP_OPTIONS_OPTS}
|
|
${PROTOC_PATH_LIST}
|
|
${PROTO_FILES}
|
|
)
|
|
|
|
# print_array("PROTOC Args:" "${PROTOC_ARGS}" "NEWLINE")
|
|
|
|
SET(PLUGINS_OUTPUT
|
|
"${GENERATED_BIN_DIRECTORY}/code_generator_request.bin"
|
|
"${GENERATED_PLUGIN_DIRECTORY}/Config_pb2.json"
|
|
"${GENERATED_PLUGIN_DIRECTORY}/Status_pb2.json"
|
|
"${DEFAULTS_OUTPUT}"
|
|
)
|
|
|
|
add_custom_command(
|
|
OUTPUT ${PLUGINS_OUTPUT}
|
|
COMMAND ${PROTOC_BINARY}
|
|
ARGS ${PROTOC_ARGS}
|
|
DEPENDS ${PROTO_FILES}
|
|
COMMENT "Generating various sources for ${PLUGINS_OUTPUT}"
|
|
)
|
|
|
|
add_dependencies(generate_graph_files generate_system_proto )
|
|
add_custom_target(generate_plugins_files DEPENDS ${PLUGINS_OUTPUT} )
|
|
add_dependencies(generate_plugins_files generate_py_files)
|
|
add_dependencies(__idf_platform_config generate_plugins_files)
|
|
set_source_files_properties( ${PLUGINS_OUTPUT} PROPERTIES GENERATED TRUE)
|
|
|
|
|
|
file(GLOB SOURCE_JSON_FILES "${CMAKE_CURRENT_SOURCE_DIR}/targets/*.json")
|
|
set(GENERATED_BIN_DIRECTORY "${CMAKE_SOURCE_DIR}/spiffs/targets")
|
|
file(MAKE_DIRECTORY "${GENERATED_BIN_DIRECTORY}")
|
|
foreach(SOURCE_JSON_FILE IN ITEMS ${SOURCE_JSON_FILES})
|
|
get_filename_component(TARGET_NAME ${SOURCE_JSON_FILE} NAME_WE)
|
|
set(GENERATED_BIN "${GENERATED_BIN_DIRECTORY}/${TARGET_NAME}.bin")
|
|
# Prepare the protodot command and its arguments
|
|
set(PROTOBIN_COMMAND
|
|
${PYTHON_EXECUTABLE}
|
|
${TOOLS_DIR}/protoc_utils/generate_bin.py
|
|
--proto_file "${CMAKE_CURRENT_BINARY_DIR}/py/configuration"
|
|
--main_class "Config"
|
|
--target_dir "${GENERATED_BIN_DIRECTORY}"
|
|
--json ${SOURCE_JSON_FILE}
|
|
--include "${CMAKE_CURRENT_BINARY_DIR}/proto/nanopb/generator/proto"
|
|
--include "${CMAKE_CURRENT_BINARY_DIR}/py/"
|
|
)
|
|
add_custom_command(
|
|
OUTPUT ${GENERATED_BIN}
|
|
COMMAND ${PROTOBIN_COMMAND}
|
|
DEPENDS ${SOURCE_JSON_FILE} ${PROTO_FILES} ${GENERATED_PY_FILES}
|
|
COMMENT "Generating BIN file for target ${TARGET_NAME}"
|
|
VERBATIM
|
|
)
|
|
list(APPEND GENERATED_BIN_FILES ${GENERATED_BIN} )
|
|
endforeach()
|
|
|
|
|
|
add_custom_target(generate_spiffs_bin DEPENDS ${GENERATED_BIN_FILES} ${DEFAULTS_OUTPUT})
|
|
set_source_files_properties(${GENERATED_BIN_FILES} PROPERTIES GENERATED TRUE)
|
|
add_dependencies(generate_spiffs_bin generate_system_proto)
|
|
|
|
message(STATUS "==================================================================================") |