Page 1 of 2
Help to run cmake before embed_file
Posted: Mon Sep 16, 2024 3:06 pm
by urbanze
Hello guys, I have one http component with a lot of web files (like router page) and I need to compress every file inside /web folder, drag to /web/zip and after this embed to flash with CMake of this component. I already tried many ways to do this but every script tested only execute custom_command after embed_file and not before. What I can do for fix this order of execution? First compress and after embed.
Below are my 2 latest scripts and both compress files only after embed_file or target_add_binary. I need to invert this order! Both examples are shorter than real, embedding only one file to improve reading.
Code: Select all
idf_component_register(SRCS "http.cpp"
INCLUDE_DIRS "."
REQUIRES esp_http_server
EMBED_FILES web/zip/index.html.gz)
message(STATUS "### Compressing WEB files over custom cmake")
set (WEB_DIR ${COMPONENT_DIR}/web)
add_custom_target(
process_http_files
ALL
COMMAND ${CMAKE_COMMAND} -E echo "---- Compressing [FW_HTTP]"
COMMAND ${CMAKE_COMMAND} -E remove_directory ${WEB_DIR}/zip
COMMAND ${CMAKE_COMMAND} -E make_directory ${WEB_DIR}/zip
COMMAND gzip -krf -9 ${WEB_DIR}/
COMMAND find ${WEB_DIR} -maxdepth 1 -name "*.gz" -exec mv -t ${WEB_DIR}/zip {} +
COMMAND ${CMAKE_COMMAND} -E echo "---- Compressed [FW_HTTP] successfully"
)
add_dependencies(${COMPONENT_LIB} process_http_files)
Code: Select all
idf_component_register(
SRCS "http.cpp"
INCLUDE_DIRS "."
REQUIRES esp_http_server
)
externalproject_add(execute_zip
PREFIX ${COMPONENT_DIR}
SOURCE_DIR ${COMPONENT_DIR}
CONFIGURE_COMMAND ""
BUILD_IN_SOURCE 1
BUILD_COMMAND ${CMAKE_COMMAND} -E env bash ${COMPONENT_DIR}/zip_all.sh
INSTALL_COMMAND ""
)
add_dependencies(${COMPONENT_LIB} execute_zip)
target_add_binary_data(${COMPONENT_LIB} "${COMPONENT_DIR}/web/zip/index.html.gz" BINARY DEPENDS execute_zip)
Re: Help to run cmake before embed_file
Posted: Wed Sep 18, 2024 8:21 am
by MicroController
Re: Help to run cmake before embed_file
Posted: Fri Sep 20, 2024 2:57 pm
by urbanze
Still in the same order. Embedded -> run custom command.
Code: Select all
idf_component_register(SRCS "http.cpp"
INCLUDE_DIRS "."
REQUIRES esp_http_server)
set (WEB_DIR ${COMPONENT_DIR}/web)
add_custom_command(
OUTPUT ${WEB_DIR}/zip/index.html.gz
OUTPUT ${WEB_DIR}/zip/style.css.gz
COMMAND ${CMAKE_COMMAND} -E remove_directory ${WEB_DIR}/zip
COMMAND ${CMAKE_COMMAND} -E make_directory ${WEB_DIR}/zip
COMMAND gzip -krf -9 ${WEB_DIR}/
COMMAND find ${WEB_DIR} -maxdepth 1 -name "*.gz" -exec mv -t ${WEB_DIR}/zip {} +
)
add_custom_target(
process_http_files
ALL
COMMAND ${CMAKE_COMMAND} -E remove_directory ${WEB_DIR}/zip
COMMAND ${CMAKE_COMMAND} -E make_directory ${WEB_DIR}/zip
COMMAND gzip -krf -9 ${WEB_DIR}/
COMMAND find ${WEB_DIR} -maxdepth 1 -name "*.gz" -exec mv -t ${WEB_DIR}/zip {} +
)
add_dependencies(${COMPONENT_LIB} process_http_files)
target_add_binary_data(${COMPONENT_LIB} "${WEB_DIR}/zip/index.html.gz" BINARY DEPENDS "${WEB_DIR}/zip/index.html.gz")
target_add_binary_data(${COMPONENT_LIB} "${WEB_DIR}/zip/style.css.gz" BINARY DEPENDS "${WEB_DIR}/zip/style.css.gz")
I noticed that custom_target run on every compile and custom_command runs firstly on first compile (from scratch). If I remove any one, didnt work well. Buts even in this way, the order of executions still wrong. Anyone have more ideas?
Re: Help to run cmake before embed_file
Posted: Fri Sep 20, 2024 11:30 pm
by chegewara
The DEPENDS argument to target_add_binary_data ensures that the target executes first.
add_custom_target(my_process COMMAND ...)
target_add_binary_data(my_target "my_embed_file.bin" BINARY DEPENDS my_process)
Is not that you should setup it like this?
Code: Select all
add_custom_target(
process_http_files
ALL
COMMAND ${CMAKE_COMMAND} -E remove_directory ${WEB_DIR}/zip
COMMAND ${CMAKE_COMMAND} -E make_directory ${WEB_DIR}/zip
COMMAND gzip -krf -9 ${WEB_DIR}/
COMMAND find ${WEB_DIR} -maxdepth 1 -name "*.gz" -exec mv -t ${WEB_DIR}/zip {} +
)
add_dependencies(${COMPONENT_LIB} process_http_files)
target_add_binary_data(${COMPONENT_LIB} "${WEB_DIR}/zip/index.html.gz" BINARY DEPENDS process_http_files)
target_add_binary_data(${COMPONENT_LIB} "${WEB_DIR}/zip/style.css.gz" BINARY DEPENDS process_http_files)
The last argument is process name, not the file name (just guessing)
Re: Help to run cmake before embed_file
Posted: Mon Sep 23, 2024 3:34 pm
by urbanze
chegewara wrote: ↑Fri Sep 20, 2024 11:30 pm
The DEPENDS argument to target_add_binary_data ensures that the target executes first.
add_custom_target(my_process COMMAND ...)
target_add_binary_data(my_target "my_embed_file.bin" BINARY DEPENDS my_process)
Is not that you should setup it like this?
Code: Select all
add_custom_target(
process_http_files
ALL
COMMAND ${CMAKE_COMMAND} -E remove_directory ${WEB_DIR}/zip
COMMAND ${CMAKE_COMMAND} -E make_directory ${WEB_DIR}/zip
COMMAND gzip -krf -9 ${WEB_DIR}/
COMMAND find ${WEB_DIR} -maxdepth 1 -name "*.gz" -exec mv -t ${WEB_DIR}/zip {} +
)
add_dependencies(${COMPONENT_LIB} process_http_files)
target_add_binary_data(${COMPONENT_LIB} "${WEB_DIR}/zip/index.html.gz" BINARY DEPENDS process_http_files)
target_add_binary_data(${COMPONENT_LIB} "${WEB_DIR}/zip/style.css.gz" BINARY DEPENDS process_http_files)
The last argument is process name, not the file name (just guessing)
Code: Select all
idf_component_register(SRCS "http.cpp"
INCLUDE_DIRS "."
REQUIRES esp_http_server)
set (WEB_DIR ${COMPONENT_DIR}/web)
add_custom_target(
process_http_files
ALL
COMMAND ${CMAKE_COMMAND} -E remove_directory ${WEB_DIR}/zip
COMMAND ${CMAKE_COMMAND} -E make_directory ${WEB_DIR}/zip
COMMAND gzip -krf -9 ${WEB_DIR}/
COMMAND find ${WEB_DIR} -maxdepth 1 -name "*.gz" -exec mv -t ${WEB_DIR}/zip {} +
)
add_dependencies(${COMPONENT_LIB} process_http_files)
target_add_binary_data(${COMPONENT_LIB} "${WEB_DIR}/zip/index.html.gz" BINARY DEPENDS process_http_files)
target_add_binary_data(${COMPONENT_LIB} "${WEB_DIR}/zip/style.css.gz" BINARY DEPENDS process_http_files)
Still not working to compile from scrath (after fullclean). Error:
Code: Select all
CMake Error in components/fw_http/CMakeLists.txt:
Cannot find source file:
/home/ze/xx/xx/components/fw_http/web/zip/index.html.gz
Tried extensions .c .C .c++ .cc .cpp .cxx .cu .mpp .m .M .mm .ixx .cppm .h
.hh .h++ .hm .hpp .hxx .in .txx .f .F .for .f77 .f90 .f95 .f03 .hip .ispc
CMake Error in components/fw_http/CMakeLists.txt:
Cannot find source file:
/home/ze/xx/xx/components/fw_http/web/zip/style.css.gz
Tried extensions .c .C .c++ .cc .cpp .cxx .cu .mpp .m .M .mm .ixx .cppm .h
.hh .h++ .hm .hpp .hxx .in .txx .f .F .for .f77 .f90 .f95 .f03 .hip .ispc
-- Generating done
CMake Generate step failed. Build files cannot be regenerated correctly.
Compiler/cmake still trying to embed before compressing (executing custom_target). Some new idea?
Re: Help to run cmake before embed_file
Posted: Mon Sep 23, 2024 5:19 pm
by chegewara
This may be not very elegant solution, and actually im not sure if it works, but it is building at least
Code: Select all
idf_component_register(SRCS "http.cpp"
INCLUDE_DIRS "."
REQUIRES esp_http_server)
set (WEB_DIR ${COMPONENT_DIR}/web)
add_custom_command(
OUTPUT "${WEB_DIR}/zip/index.html.gz"
COMMAND COMMAND gzip -krf -9 ${WEB_DIR}/index.html
VERBATIM
)
add_custom_command(
OUTPUT "${WEB_DIR}/zip/style.css.gz"
COMMAND COMMAND gzip -krf -9 ${WEB_DIR}/style.css
VERBATIM
)
add_custom_target(
process_http_files
ALL
COMMAND ${CMAKE_COMMAND} -E remove_directory ${WEB_DIR}/zip
COMMAND ${CMAKE_COMMAND} -E make_directory ${WEB_DIR}/zip
COMMAND find ${WEB_DIR} -maxdepth 1 -name "*.gz" -exec mv -t ${WEB_DIR}/zip {} +
DEPENDS "${WEB_DIR}/zip/index.html.gz"
DEPENDS "${WEB_DIR}/zip/style.css.gz"
VERBATIM
USES_TERMINAL
)
add_dependencies(${COMPONENT_LIB} process_http_files)
target_add_binary_data(${COMPONENT_LIB} "${WEB_DIR}/zip/index.html.gz" BINARY DEPENDS process_http_files)
target_add_binary_data(${COMPONENT_LIB} "${WEB_DIR}/zip/style.css.gz" BINARY DEPENDS process_http_files)
Re: Help to run cmake before embed_file
Posted: Tue Sep 24, 2024 6:43 pm
by urbanze
chegewara wrote: ↑Mon Sep 23, 2024 5:19 pm
This may be not very elegant solution, and actually im not sure if it works, but it is building at least
Code: Select all
idf_component_register(SRCS "http.cpp"
INCLUDE_DIRS "."
REQUIRES esp_http_server)
set (WEB_DIR ${COMPONENT_DIR}/web)
add_custom_command(
OUTPUT "${WEB_DIR}/zip/index.html.gz"
COMMAND COMMAND gzip -krf -9 ${WEB_DIR}/index.html
VERBATIM
)
add_custom_command(
OUTPUT "${WEB_DIR}/zip/style.css.gz"
COMMAND COMMAND gzip -krf -9 ${WEB_DIR}/style.css
VERBATIM
)
add_custom_target(
process_http_files
ALL
COMMAND ${CMAKE_COMMAND} -E remove_directory ${WEB_DIR}/zip
COMMAND ${CMAKE_COMMAND} -E make_directory ${WEB_DIR}/zip
COMMAND find ${WEB_DIR} -maxdepth 1 -name "*.gz" -exec mv -t ${WEB_DIR}/zip {} +
DEPENDS "${WEB_DIR}/zip/index.html.gz"
DEPENDS "${WEB_DIR}/zip/style.css.gz"
VERBATIM
USES_TERMINAL
)
add_dependencies(${COMPONENT_LIB} process_http_files)
target_add_binary_data(${COMPONENT_LIB} "${WEB_DIR}/zip/index.html.gz" BINARY DEPENDS process_http_files)
target_add_binary_data(${COMPONENT_LIB} "${WEB_DIR}/zip/style.css.gz" BINARY DEPENDS process_http_files)
Thanks, but other tests made here already build successfully (from scrath or recompile from some code change), however none worked correctly, I always need to compile 2 times to see changes on webpage, because cmake embed the existing file to .bin and after this, generate new one with new changes.
Someone already done this? I really need this to improve coding speed on my team.
Re: Help to run cmake before embed_file
Posted: Wed Sep 25, 2024 7:18 am
by MicroController
Try adding a dependency to the "source"/input files to add_custom_command ("DEPENDS ..."). This should cause the command to be re-run when a "source" file is changed.
Re: Help to run cmake before embed_file
Posted: Fri Sep 27, 2024 1:02 pm
by urbanze
MicroController wrote: ↑Wed Sep 25, 2024 7:18 am
Try adding a dependency to the "source"/input files to add_custom_command ("DEPENDS ..."). This should cause the command to be re-run when a "source" file is changed.
Order still wrong
Someone knows how this can be fixed??
Re: Help to run cmake before embed_file
Posted: Tue Oct 01, 2024 5:04 pm
by chegewara