cmake_minimum_required(VERSION 3.29) cmake_policy(SET CMP0166 NEW) project(CustomTransitiveProperties C) add_library(iface1 INTERFACE) set_target_properties(iface1 PROPERTIES TRANSITIVE_COMPILE_PROPERTIES "CUSTOM_A" # LINK_ONLY not pierced TRANSITIVE_LINK_PROPERTIES "CUSTOM_U" # LINK_ONLY pierced INTERFACE_CUSTOM_A "CUSTOM_A_IFACE1;CUSTOM_A_TARGET_NAME_$>" INTERFACE_CUSTOM_B "CUSTOM_B_IFACE1" INTERFACE_CUSTOM_C "CUSTOM_C_IFACE1" INTERFACE_CUSTOM_U "CUSTOM_U_IFACE1;CUSTOM_U_TARGET_NAME_$>" INTERFACE_CUSTOM_V "CUSTOM_V_IFACE1" INTERFACE_CUSTOM_W "CUSTOM_W_IFACE1" ) add_library(iface2 INTERFACE) set_target_properties(iface2 PROPERTIES INTERFACE_CUSTOM_A "CUSTOM_A_IFACE2;CUSTOM_A_TARGET_TYPE_$" INTERFACE_CUSTOM_U "CUSTOM_U_IFACE2;CUSTOM_U_TARGET_TYPE_$" ) target_link_libraries(iface2 INTERFACE iface1) # Test that the INTERFACE prefix is removed. set(unnecessary_INTERFACE_ "INTERFACE_") add_library(static1 STATIC static1.c) target_link_libraries(static1 PRIVATE iface2) set_target_properties(static1 PROPERTIES TRANSITIVE_COMPILE_PROPERTIES "${unnecessary_INTERFACE_}CUSTOM_B" # LINK_ONLY not pierced TRANSITIVE_LINK_PROPERTIES "${unnecessary_INTERFACE_}CUSTOM_V" # LINK_ONLY pierced CUSTOM_A "CUSTOM_A_STATIC1" CUSTOM_B "CUSTOM_B_STATIC1" CUSTOM_U "CUSTOM_U_STATIC1" CUSTOM_V "CUSTOM_V_STATIC1" INTERFACE_CUSTOM_A "CUSTOM_A_STATIC1_IFACE" INTERFACE_CUSTOM_B "CUSTOM_B_STATIC1_IFACE" INTERFACE_CUSTOM_U "CUSTOM_U_STATIC1_IFACE" INTERFACE_CUSTOM_V "CUSTOM_V_STATIC1_IFACE" ) target_compile_definitions(static1 PRIVATE $ $ $ $ ) add_library(object1 OBJECT object1.c) target_link_libraries(object1 PRIVATE iface2) set_target_properties(object1 PROPERTIES TRANSITIVE_COMPILE_PROPERTIES "${unnecessary_INTERFACE_}CUSTOM_C" # LINK_ONLY not pierced TRANSITIVE_LINK_PROPERTIES "${unnecessary_INTERFACE_}CUSTOM_W" # LINK_ONLY pierced CUSTOM_A "CUSTOM_A_OBJECT1" CUSTOM_C "CUSTOM_C_OBJECT1" CUSTOM_U "CUSTOM_U_OBJECT1" CUSTOM_W "CUSTOM_W_OBJECT1" INTERFACE_CUSTOM_A "CUSTOM_A_OBJECT1_IFACE" INTERFACE_CUSTOM_C "CUSTOM_C_OBJECT1_IFACE" INTERFACE_CUSTOM_U "CUSTOM_U_OBJECT1_IFACE" INTERFACE_CUSTOM_W "CUSTOM_W_OBJECT1_IFACE" ) target_compile_definitions(object1 PRIVATE $ $ $ $ ) add_executable(CustomTransitiveProperties main.c) target_link_libraries(CustomTransitiveProperties PRIVATE static1 object1) set_target_properties(CustomTransitiveProperties PROPERTIES CUSTOM_A "CUSTOM_A_MAIN" CUSTOM_B "CUSTOM_B_MAIN" CUSTOM_C "CUSTOM_C_MAIN" CUSTOM_U "CUSTOM_U_MAIN" CUSTOM_V "CUSTOM_V_MAIN" CUSTOM_W "CUSTOM_W_MAIN" ) # Test TRANSITIVE_*_PROPERTY evaluation within usage requirements. target_compile_definitions(CustomTransitiveProperties PRIVATE $ $ $ $ $ $ ) # Test TRANSITIVE_LINK_PROPERTIES containing LINK_LIBRARIES itself. add_library(iface10 INTERFACE) set_property(TARGET iface10 PROPERTY TRANSITIVE_LINK_PROPERTIES "LINK_LIBRARIES") add_library(iface11 INTERFACE) target_link_libraries(iface11 INTERFACE iface10) add_library(static10 STATIC static10.c) target_link_libraries(static10 PRIVATE iface11) add_library(static11 STATIC static11.c) target_link_libraries(static11 PRIVATE static10 iface11) add_executable(main10 main10.c) target_link_libraries(main10 PRIVATE static11 static10) # Test CMP0189 OLD and NEW behavior. add_library(iface20 INTERFACE) add_library(iface21 INTERFACE) target_link_libraries(iface21 INTERFACE iface20) add_library(static20 STATIC static20.c) target_link_libraries(static20 PRIVATE iface21) add_library(static21 STATIC static21.c) target_link_libraries(static21 PRIVATE static20 iface21) add_executable(main20 main20.c) target_link_libraries(main20 PRIVATE static21 static20) # Test TRANSITIVE_*_PROPERTY evaluation outside of usage requirements. add_executable(check-args check-args.c) set(out "${CMAKE_CURRENT_BINARY_DIR}/out-$.txt") set(in_CUSTOM [====[ iface1 CUSTOM_A: '$' iface1 INTERFACE_CUSTOM_A: '$' iface2 CUSTOM_A: '$' iface2 INTERFACE_CUSTOM_A: '$' static1 CUSTOM_A: '$' static1 INTERFACE_CUSTOM_A: '$' static1 CUSTOM_B: '$' static1 INTERFACE_CUSTOM_B: '$' static1 CUSTOM_U: '$' static1 INTERFACE_CUSTOM_U: '$' static1 CUSTOM_V: '$' static1 INTERFACE_CUSTOM_V: '$' object1 CUSTOM_A: '$' object1 INTERFACE_CUSTOM_A: '$' object1 CUSTOM_C: '$' object1 INTERFACE_CUSTOM_C: '$' object1 CUSTOM_U: '$' object1 INTERFACE_CUSTOM_U: '$' object1 CUSTOM_W: '$' object1 INTERFACE_CUSTOM_W: '$' main CUSTOM_A: '$' main INTERFACE_CUSTOM_A: '$' main CUSTOM_B: '$' main INTERFACE_CUSTOM_B: '$' main CUSTOM_C: '$' main INTERFACE_CUSTOM_C: '$' main CUSTOM_U: '$' main INTERFACE_CUSTOM_U: '$' main CUSTOM_V: '$' main INTERFACE_CUSTOM_V: '$' main CUSTOM_W: '$' main INTERFACE_CUSTOM_W: '$' ]====]) set(in_LINK_LIBRARIES [====[ iface1 LINK_LIBRARIES: '$' iface1 INTERFACE_LINK_LIBRARIES: '$' iface2 LINK_LIBRARIES: '$' iface2 INTERFACE_LINK_LIBRARIES: '$' static1 LINK_LIBRARIES: '$' static1 INTERFACE_LINK_LIBRARIES: '$' main LINK_LIBRARIES: '$' main INTERFACE_LINK_LIBRARIES: '$' iface10 LINK_LIBRARIES: '$' iface10 INTERFACE_LINK_LIBRARIES: '$' iface11 LINK_LIBRARIES: '$' iface11 INTERFACE_LINK_LIBRARIES: '$' static10 LINK_LIBRARIES: '$' static10 INTERFACE_LINK_LIBRARIES: '$' static11 LINK_LIBRARIES: '$' static11 INTERFACE_LINK_LIBRARIES: '$' main10 LINK_LIBRARIES: '$' main10 INTERFACE_LINK_LIBRARIES: '$' iface20 LINK_LIBRARIES: '$' iface20 INTERFACE_LINK_LIBRARIES: '$' iface21 LINK_LIBRARIES: '$' iface21 INTERFACE_LINK_LIBRARIES: '$' static20 LINK_LIBRARIES: '$' static20 INTERFACE_LINK_LIBRARIES: '$' static21 LINK_LIBRARIES: '$' static21 INTERFACE_LINK_LIBRARIES: '$' main20 LINK_LIBRARIES: '$' main20 INTERFACE_LINK_LIBRARIES: '$' ]====]) file(GENERATE OUTPUT "${out}" CONTENT "# file(GENERATE) produced: ${in_CUSTOM} ${in_LINK_LIBRARIES} ") add_custom_target(check ALL VERBATIM COMMAND ${CMAKE_COMMAND} -Dconfig=$ -Dout=${out} -P${CMAKE_CURRENT_SOURCE_DIR}/check.cmake COMMAND CustomTransitiveProperties COMMAND check-args "$" "CUSTOM_A_STATIC1;CUSTOM_A_IFACE2;CUSTOM_A_TARGET_TYPE_STATIC_LIBRARY;CUSTOM_A_IFACE1;CUSTOM_A_TARGET_NAME_STATIC1" "$" "CUSTOM_B_STATIC1;CUSTOM_B_IFACE1" "$" "CUSTOM_U_STATIC1;CUSTOM_U_IFACE2;CUSTOM_U_TARGET_TYPE_STATIC_LIBRARY;CUSTOM_U_IFACE1;CUSTOM_U_TARGET_NAME_STATIC1" "$" "CUSTOM_V_STATIC1;CUSTOM_V_IFACE1" "$" "CUSTOM_A_OBJECT1;CUSTOM_A_IFACE2;CUSTOM_A_TARGET_TYPE_OBJECT_LIBRARY;CUSTOM_A_IFACE1;CUSTOM_A_TARGET_NAME_OBJECT1" "$" "CUSTOM_C_OBJECT1;CUSTOM_C_IFACE1" "$" "CUSTOM_U_OBJECT1;CUSTOM_U_IFACE2;CUSTOM_U_TARGET_TYPE_OBJECT_LIBRARY;CUSTOM_U_IFACE1;CUSTOM_U_TARGET_NAME_OBJECT1" "$" "CUSTOM_W_OBJECT1;CUSTOM_W_IFACE1" "$" "CUSTOM_A_MAIN" "$" "CUSTOM_B_MAIN;CUSTOM_B_STATIC1_IFACE" "$" "CUSTOM_C_MAIN;CUSTOM_C_OBJECT1_IFACE" "$" "CUSTOM_U_MAIN;CUSTOM_U_STATIC1_IFACE;CUSTOM_U_IFACE2;CUSTOM_U_TARGET_TYPE_EXECUTABLE;CUSTOM_U_IFACE1;CUSTOM_U_TARGET_NAME_CUSTOMTRANSITIVEPROPERTIES;CUSTOM_U_OBJECT1_IFACE" "$" "CUSTOM_V_MAIN;CUSTOM_V_STATIC1_IFACE;CUSTOM_V_IFACE1" "$" "CUSTOM_W_MAIN;CUSTOM_W_IFACE1;CUSTOM_W_OBJECT1_IFACE" COMMAND check-args "$" "" "$" "" "$" "" "$" "iface1" "$" "iface2" "$" "$" "$" "static1;object1" "$" "" COMMAND check-args "$" "" "$" "" "$" "" "$" "iface10" "$" "iface11;iface10" # _/ \__ # / \ # "static10[iface11];iface11[iface10]" "$" "iface11;iface10" "$" "static10;iface11;iface11;iface10" # __/ __/ \__ \__________ # / / \ \ # "static11[static10;iface11];static10[iface11;iface11[iface10]]" "$" "static10;iface11;iface11;iface10" "$" "static11;static10;static10;iface11;iface11;iface10" # _______/ _______/ | | \______ \______________ # / / | | \ \ # "main10[static11;static10];static11[static10;iface11;static10[iface11;iface11[iface10]]]" "$" "" COMMAND check-args "$" "" "$" "" "$" "" "$" "iface20" "$" "iface21" "$" "$" "$" "static20;iface21" "$" "$;$" "$" "static21;static20" "$" "" ) add_subdirectory(CMP0189)