add_custom_target dependencies

my CMakeLists.txt:

# wxFormBuilder generation
set(FORM_BUILDER_PROJECT ${PROJECT_SOURCE_DIR}/source/view/gen.fbp)
set(GENERATED_VIEW_DIR ${PROJECT_SOURCE_DIR}/source/view/generated)
set(GENERATED_VIEW_FILE_CPP ${GENERATED_VIEW_DIR}/gen_view.cpp)
set(GENERATED_VIEW_FILE_H ${GENERATED_VIEW_DIR}/gen_view.h)
set(GENERATED_VIEW_FILES
    ${GENERATED_VIEW_FILE_CPP}
    ${GENERATED_VIEW_FILE_H}
    ${GENERATED_VIEW_DIR}/info.png.h
    ${GENERATED_VIEW_DIR}/logo.png.h)
set(GENERATED_FILES_FIX_SCRIPT
    ${PROJECT_SOURCE_DIR}/cmake/script/wx_string_to_cpp_define.cmake)
add_custom_target(gen_view
    COMMAND ${CMAKE_COMMAND} -E make_directory ${GENERATED_VIEW_DIR}
    COMMAND ${FORMBUILDER_EXE} -g ${FORM_BUILDER_PROJECT}
    COMMAND ${CMAKE_COMMAND} -D filename="${GENERATED_VIEW_FILE_H}" -P ${GENERATED_FILES_FIX_SCRIPT}
    COMMAND ${CMAKE_COMMAND} -D filename="${GENERATED_VIEW_FILE_CPP}" -P ${GENERATED_FILES_FIX_SCRIPT}
    DEPENDS ${FORM_BUILDER_PROJECT}
    BYPRODUCTS ${GENERATED_VIEW_FILES}
    WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
    COMMENT "Generating view files from wxformbuilder project"
    SOURCES ${FORM_BUILDER_PROJECT})

add_executable(my_exe WIN32)
...
target_sources(my_exe PRIVATE
    source/main.cpp
    ${GENERATED_VIEW_FILE_CPP}
    ...
    )

When I execute cmake --build cmake-build / --target my_exe for the first time, the gen_view target is built. This is logical. But when I run the same command again, the build of the gen_view target starts again, even though I haven’t changed anything and the generated files don’t change either. How to make it so that the gen_view assembly is only when GENERATED_VIEW_FILES or FORM_BUILDER_PROJECT are somehow changed?

This is the expected behavior. As specified in the documentation:

The target has no output file and is always considered out of date.
Use the add_custom_command() command to generate a file with dependencies.

Thnx, is it possible to add the cmake function I wrote to custom_command?

Yes, add_custom_command() supports COMMAND option in the same way as add_custom_target() .

Have a look also at options DEPENDS and DEPFILE.