From 9bb17da786318cf6c056bdc8a5bfb100ae7ae81c Mon Sep 17 00:00:00 2001 From: Bernhard Guillon Date: Tue, 30 Jun 2026 20:56:43 +0200 Subject: Add Baz library with transitive PUBLIC dependency support --- cmake/dotnet.cmake | 67 +++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 49 insertions(+), 18 deletions(-) (limited to 'cmake') diff --git a/cmake/dotnet.cmake b/cmake/dotnet.cmake index 175187b..fe0432a 100644 --- a/cmake/dotnet.cmake +++ b/cmake/dotnet.cmake @@ -20,6 +20,7 @@ function(add_dotnet_library NAME) OUTPUT ${OUTPUT_FILE} COMMAND dotnet ${CSC_DLL} ${CSC_FLAGS} + $ -out:${OUTPUT_FILE} -lib:${RUNTIME_DIR} -reference:System.Private.CoreLib.dll @@ -28,9 +29,15 @@ function(add_dotnet_library NAME) ${arg_SOURCES} DEPENDS ${arg_SOURCES} COMMENT "Compiling ${NAME} library with Roslyn csc..." + COMMAND_EXPAND_LISTS ) add_custom_target(${NAME} ALL DEPENDS ${OUTPUT_FILE}) + + set_target_properties(${NAME} PROPERTIES + DOTNET_ALL_REFS "" + DOTNET_PUBLIC_REFS "" + ) endfunction() @@ -61,7 +68,7 @@ function(add_dotnet_executable NAME) OUTPUT ${OUTPUT_FILE} COMMAND dotnet ${CSC_DLL} ${CSC_FLAGS} - $ + $ -out:${OUTPUT_FILE} -lib:${RUNTIME_DIR} -reference:System.Private.CoreLib.dll @@ -71,35 +78,59 @@ function(add_dotnet_executable NAME) COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/HelloCMake.runtimeconfig.json ${CMAKE_BINARY_DIR}/${NAME}.runtimeconfig.json - DEPENDS ${arg_SOURCES} $ + DEPENDS ${arg_SOURCES} COMMENT "Compiling ${NAME} with Roslyn csc..." + COMMAND_EXPAND_LISTS ) add_custom_target(${NAME} ALL DEPENDS ${OUTPUT_FILE}) + + set_target_properties(${NAME} PROPERTIES + DOTNET_ALL_REFS "" + DOTNET_PUBLIC_REFS "" + ) endfunction() function(target_link_dotnet_libraries TARGET) - set(multiValueArgs LIBRARIES) + set(multiValueArgs PUBLIC PRIVATE INTERFACE) cmake_parse_arguments(PARSE_ARGV 1 arg "" "" "${multiValueArgs}" ) - if(NOT arg_LIBRARIES) - return() - endif() - - set(REFS "") - set(DEPS "") - foreach(lib IN LISTS arg_LIBRARIES) - list(APPEND REFS "-reference:${CMAKE_BINARY_DIR}/${lib}.dll") - list(APPEND DEPS "${CMAKE_BINARY_DIR}/${lib}.dll") - add_dependencies(${TARGET} ${lib}) + foreach(scope PUBLIC PRIVATE INTERFACE) + set(libs "${arg_${scope}}") + if(NOT libs) + continue() + endif() + + foreach(lib IN LISTS libs) + add_dependencies(${TARGET} ${lib}) + + get_target_property(LIB_PUB_REFS ${lib} DOTNET_PUBLIC_REFS) + if(NOT LIB_PUB_REFS) + set(LIB_PUB_REFS "") + endif() + + get_target_property(CURRENT_ALL ${TARGET} DOTNET_ALL_REFS) + if(NOT CURRENT_ALL) + set(CURRENT_ALL "") + endif() + list(APPEND CURRENT_ALL "-reference:${CMAKE_BINARY_DIR}/${lib}.dll") + list(APPEND CURRENT_ALL ${LIB_PUB_REFS}) + set_target_properties(${TARGET} PROPERTIES DOTNET_ALL_REFS "${CURRENT_ALL}") + + if("${scope}" STREQUAL "PUBLIC" OR "${scope}" STREQUAL "INTERFACE") + get_target_property(CURRENT_PUB ${TARGET} DOTNET_PUBLIC_REFS) + if(NOT CURRENT_PUB) + set(CURRENT_PUB "") + endif() + list(APPEND CURRENT_PUB "-reference:${CMAKE_BINARY_DIR}/${lib}.dll") + list(APPEND CURRENT_PUB ${LIB_PUB_REFS}) + list(REMOVE_DUPLICATES CURRENT_PUB) + set_target_properties(${TARGET} PROPERTIES DOTNET_PUBLIC_REFS "${CURRENT_PUB}") + endif() + endforeach() endforeach() - - set_target_properties(${TARGET} PROPERTIES - DOTNET_REFERENCES "${REFS}" - DOTNET_DEPENDS "${DEPS}" - ) endfunction() -- cgit v1.2.3