enable_language(C) add_library(foo1 STATIC empty.c) target_link_libraries(foo1 PRIVATE foo2 foo3) target_link_directories(foo1 INTERFACE dir1) target_link_options(foo1 INTERFACE -opt1) set_target_properties(foo1 PROPERTIES INTERFACE_LINK_DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/dep1" ) file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/dep1" "") add_library(foo2 STATIC empty.c) target_link_directories(foo2 INTERFACE dir2) target_link_options(foo2 INTERFACE -opt2) set_target_properties(foo2 PROPERTIES INTERFACE_LINK_DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/dep2" ) file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/dep2" "") add_library(foo3 STATIC empty.c) target_link_directories(foo3 PRIVATE dir3) target_link_options(foo3 PRIVATE -opt3) set_target_properties(foo3 PROPERTIES LINK_DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/dep3" ) file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/dep3" "") add_executable(main main.c) target_link_libraries(main PRIVATE foo1) target_link_directories(main PRIVATE dirM) target_link_options(main PRIVATE -optM) set_target_properties(main PROPERTIES LINK_DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/depM" ) file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/depM" "") file(GENERATE OUTPUT out.txt CONTENT "# file(GENERATE) produced: main LINK_LIBRARIES: '$' # not transitive main LINK_DIRECTORIES: '$' main LINK_OPTIONS: '$' main LINK_DEPENDS: '$' ")