should help you out In CMake functions calls and other constructions cannot be nested one into another. So, using foreach() command inside ExternalProject_Add_Step parameters is wrong.
But you may use foreach() for generate arguments for ExternalProject_Add_Step:
# This variable will contain list of 'COMMAND' clauses:
# COMMAND cmake -P copy <file-src> <file-dst>
set(COMMAND_COPY_FILES)
foreach(copy_file ${ALL_FILES})
list(APPEND COMMAND_COPY_FILES
COMMAND ${CMAKE_COMMAND} -E copy ${SRC_DIR}/${copy_file} ${TGT_DIR}/${copy_file}
)
endforeach(copy_file)
ExternalProject_Add_Step(${EXTERNAL_TARGET} lib_step
COMMAND ${CMAKE_COMMAND} -E make_directory ${TGT_DIR}
${COMMAND_COPY_FILES}
COMMENT "Copying lib from ${SRC_DIR} to ${TGT_DIR}"
DEPENDEES install)
# This variable will contain single 'COMMAND' clause but with many files:
# COMMAND cmake -P copy <src-files> <dest-dir>
set(COMMAND_COPY_FILES COMMAND ${CMAKE_COMMAND} -E copy)
foreach(copy_file ${ALL_FILES})
list(APPEND COMMAND_COPY_FILES ${SRC_DIR}/${copy_file})
endforeach(copy_file)
list(APPEND COMMAND_COPY_FILES ${TGT_DIR})