I've noticed the tar file is actually generated every build.
However "data_file_embed_asm.cmake" script doesn't run every build. That script converts the file into C source file with byte array of that file, and is called by custom command in target_add_binary_data() function located in {IDF_PATH}/tools/cmake/utilities.cmake.
I did a simple test - increment a number in particular file, run build, then check generated tar file in component's directory and generated embedded.tar.S.obj file in build directory. In generated tar file was the up-to-date number (e.g. 5), while in generated .obj file (checked by "hexdump -C -n 2K") was the number from previous build iteration (e.g. 4).
I also added message() to "data_file_embed_asm.cmake" script, and I can see this message every other build. I mean: first build yes, second nope, third yes, fourth no, and so on... Even if I don't modify any file. Maybe some cache has to be cleared?
Create tar archive automatically in build process
Re: Create tar archive automatically in build process
It seems that ninja (build) is the one to blame.
I've manually run cmake with -G "Unix Makefiles" to generate Makefile instead of ninja.build, and with "make" command it generates .S file every time (not every other time like ninja used to do).
Can I somehow switch to Unix Makefiles generator for the project, so I can use VS Code "build" button? Right now that button attempts to execute ninja (which fails, because I ran cmake to generate Makefiles)
I've manually run cmake with -G "Unix Makefiles" to generate Makefile instead of ninja.build, and with "make" command it generates .S file every time (not every other time like ninja used to do).
Can I somehow switch to Unix Makefiles generator for the project, so I can use VS Code "build" button? Right now that button attempts to execute ninja (which fails, because I ran cmake to generate Makefiles)
Re: Create tar archive automatically in build process
Alright, I think I've solved it.
It really had to do with paths. After using absolute path in OUTPUT and DEPENDS, it now generates every time even with ninja build, and the file doesn't need to initially exist, so I can git-ignore generated file and it will still compile when someone else clones the repository.
I thought WORKING_DIRECTORY applies on OUTPUT too, apparently not.
Final CMakeLists.txt:
It really had to do with paths. After using absolute path in OUTPUT and DEPENDS, it now generates every time even with ninja build, and the file doesn't need to initially exist, so I can git-ignore generated file and it will still compile when someone else clones the repository.
I thought WORKING_DIRECTORY applies on OUTPUT too, apparently not.
Final CMakeLists.txt:
Code: Select all
idf_component_register(
SRCS "embedded_vfs.c" "microtar.c"
INCLUDE_DIRS "include"
)
add_custom_command(
OUTPUT
non-existing.txt # force to execute on every build (https://gitlab.kitware.com/cmake/cmake/-/issues/17071)
"${COMPONENT_DIR}/embedded.tar"
WORKING_DIRECTORY ${COMPONENT_DIR}
COMMAND echo "Creating tar archive..."
COMMAND tar -cf embedded.tar -C files . --owner dev --group dev --transform "s|^\./||"
VERBATIM
)
target_add_binary_data(${COMPONENT_LIB} "embedded.tar" BINARY DEPENDS "${COMPONENT_DIR}/embedded.tar"
-
- Posts: 1709
- Joined: Mon Oct 17, 2022 7:38 pm
- Location: Europe, Germany
Re: Create tar archive automatically in build process
Good to hear you got it working! And thanks for sharing your solution
Who is online
Users browsing this forum: Bing [Bot] and 59 guests