Evaluate $<JOIN:> with another generator expression as the glue

The key is to prevent CMake from interpreting some things as generator expressions too early, then evaluating them later when you need them to be. This should give you the result you want:

set(pre_genex "$$<1:<TARGET_PROPERTY:>")
set(post_genex "$<COMMA>_prop$<ANGLE-R>")
set(glue "${post_genex}\n${pre_genex}")

set(join "$<GENEX_EVAL:${pre_genex}$<JOIN:lib1;lib2,${glue}>${post_genex}>")