diff options
| author | Bernhard Guillon <Bernhard.Guillon@begu.org> | 2026-06-30 21:54:27 +0200 |
|---|---|---|
| committer | Bernhard Guillon <Bernhard.Guillon@begu.org> | 2026-06-30 21:54:27 +0200 |
| commit | f19db5021361f1cf5780d1d06ceea26b8bf392e6 (patch) | |
| tree | 6686d13ad12edbfd355fa4f15cd4b38c15a67a1e /cmake | |
| parent | 3f45fd0c5abaa3090e4e13b60104d0fcffe257f6 (diff) | |
| download | csharp-cmake-f19db5021361f1cf5780d1d06ceea26b8bf392e6.tar.gz csharp-cmake-f19db5021361f1cf5780d1d06ceea26b8bf392e6.zip | |
Defer custom command creation with dotnet_finalize_targets and move NATIVE_DEPS to target_link_dotnet_libraries
Diffstat (limited to 'cmake')
| -rw-r--r-- | cmake/dotnet.cmake | 204 |
1 files changed, 109 insertions, 95 deletions
diff --git a/cmake/dotnet.cmake b/cmake/dotnet.cmake index 26d6c10..b4e15ea 100644 --- a/cmake/dotnet.cmake +++ b/cmake/dotnet.cmake @@ -1,5 +1,5 @@ function(add_dotnet_library NAME) - set(multiValueArgs SOURCES REFERENCES DEPENDS NATIVE_DEPENDS) + set(multiValueArgs SOURCES REFERENCES) cmake_parse_arguments(PARSE_ARGV 1 arg "" "" "${multiValueArgs}" @@ -9,56 +9,20 @@ function(add_dotnet_library NAME) message(FATAL_ERROR "add_dotnet_library: SOURCES is required") endif() - set(OUTPUT_FILE ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${NAME}.dll) - set(CSC_FLAGS -target:library) foreach(ref IN LISTS arg_REFERENCES) list(APPEND CSC_FLAGS "-reference:${ref}") endforeach() - set(DEPS "") - foreach(dep IN LISTS arg_DEPENDS) - list(APPEND DEPS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${dep}.dll) - endforeach() - foreach(dep IN LISTS arg_NATIVE_DEPENDS) - list(APPEND DEPS ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/lib${dep}.so) - endforeach() - - add_custom_command( - OUTPUT ${OUTPUT_FILE} - COMMAND dotnet ${CSC_DLL} - ${CSC_FLAGS} - $<TARGET_PROPERTY:${NAME},DOTNET_ALL_REFS> - -out:${OUTPUT_FILE} - -lib:${RUNTIME_DIR} - -reference:System.Private.CoreLib.dll - -reference:System.Runtime.dll - -reference:System.Console.dll - ${arg_SOURCES} - DEPENDS ${arg_SOURCES} ${DEPS} - COMMENT "Compiling ${NAME} library with Roslyn csc..." - COMMAND_EXPAND_LISTS - ) - - add_custom_target(${NAME} ALL DEPENDS ${OUTPUT_FILE}) - - foreach(dep IN LISTS arg_DEPENDS) - add_dependencies(${NAME} ${dep}) - endforeach() - foreach(dep IN LISTS arg_NATIVE_DEPENDS) - add_dependencies(${NAME} ${dep}) - endforeach() - - set_target_properties(${NAME} PROPERTIES - DOTNET_ALL_REFS "" - DOTNET_PUBLIC_REFS "" - ) + set_property(GLOBAL PROPERTY DOTNET_TARGET_${NAME}_TYPE "library") + set_property(GLOBAL PROPERTY DOTNET_TARGET_${NAME}_SOURCES "${arg_SOURCES}") + set_property(GLOBAL PROPERTY DOTNET_TARGET_${NAME}_CSC_FLAGS "${CSC_FLAGS}") endfunction() function(add_dotnet_executable NAME) set(oneValueArgs MAIN) - set(multiValueArgs SOURCES REFERENCES DEPENDS NATIVE_DEPENDS) + set(multiValueArgs SOURCES REFERENCES) cmake_parse_arguments(PARSE_ARGV 1 arg "" "${oneValueArgs}" "${multiValueArgs}" @@ -72,9 +36,6 @@ function(add_dotnet_executable NAME) set(arg_MAIN "Main") endif() - set(OUTPUT_FILE ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${NAME}.dll) - set(RUNTIMECONFIG ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${NAME}.runtimeconfig.json) - set(CSC_FLAGS -target:exe -main:${arg_MAIN}) foreach(ref IN LISTS arg_REFERENCES) list(APPEND CSC_FLAGS "-reference:${ref}") @@ -82,57 +43,39 @@ function(add_dotnet_executable NAME) configure_file( ${CMAKE_SOURCE_DIR}/cmake/runtimeconfig.json.in - ${RUNTIMECONFIG} + ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${NAME}.runtimeconfig.json COPYONLY ) - set(DEPS ${RUNTIMECONFIG}) - foreach(dep IN LISTS arg_DEPENDS) - list(APPEND DEPS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${dep}.dll) - endforeach() - foreach(dep IN LISTS arg_NATIVE_DEPENDS) - list(APPEND DEPS ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/lib${dep}.so) - endforeach() - - add_custom_command( - OUTPUT ${OUTPUT_FILE} - COMMAND dotnet ${CSC_DLL} - ${CSC_FLAGS} - $<TARGET_PROPERTY:${NAME},DOTNET_ALL_REFS> - -out:${OUTPUT_FILE} - -lib:${RUNTIME_DIR} - -reference:System.Private.CoreLib.dll - -reference:System.Runtime.dll - -reference:System.Console.dll - ${arg_SOURCES} - DEPENDS ${arg_SOURCES} ${DEPS} - COMMENT "Compiling ${NAME} with Roslyn csc..." - COMMAND_EXPAND_LISTS - ) - - add_custom_target(${NAME} ALL DEPENDS ${OUTPUT_FILE}) - - foreach(dep IN LISTS arg_DEPENDS) - add_dependencies(${NAME} ${dep}) - endforeach() - foreach(dep IN LISTS arg_NATIVE_DEPENDS) - add_dependencies(${NAME} ${dep}) - endforeach() - - set_target_properties(${NAME} PROPERTIES - DOTNET_ALL_REFS "" - DOTNET_PUBLIC_REFS "" - ) + set_property(GLOBAL PROPERTY DOTNET_TARGET_${NAME}_TYPE "executable") + set_property(GLOBAL PROPERTY DOTNET_TARGET_${NAME}_SOURCES "${arg_SOURCES}") + set_property(GLOBAL PROPERTY DOTNET_TARGET_${NAME}_CSC_FLAGS "${CSC_FLAGS}") endfunction() function(target_link_dotnet_libraries TARGET) - set(multiValueArgs PUBLIC PRIVATE INTERFACE) + set(multiValueArgs PUBLIC PRIVATE INTERFACE NATIVE_DEPS) cmake_parse_arguments(PARSE_ARGV 1 arg "" "" "${multiValueArgs}" ) + foreach(dep IN LISTS arg_NATIVE_DEPS) + get_property(CURRENT_NDEPS GLOBAL PROPERTY DOTNET_TARGET_${TARGET}_NATIVE_DEPS) + if(NOT CURRENT_NDEPS) + set(CURRENT_NDEPS "") + endif() + list(APPEND CURRENT_NDEPS ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/lib${dep}.so) + set_property(GLOBAL PROPERTY DOTNET_TARGET_${TARGET}_NATIVE_DEPS "${CURRENT_NDEPS}") + + get_property(CURRENT_DEP_TARGETS GLOBAL PROPERTY DOTNET_TARGET_${TARGET}_DEP_TARGETS) + if(NOT CURRENT_DEP_TARGETS) + set(CURRENT_DEP_TARGETS "") + endif() + list(APPEND CURRENT_DEP_TARGETS ${dep}) + set_property(GLOBAL PROPERTY DOTNET_TARGET_${TARGET}_DEP_TARGETS "${CURRENT_DEP_TARGETS}") + endforeach() + foreach(scope PUBLIC PRIVATE INTERFACE) set(libs "${arg_${scope}}") if(NOT libs) @@ -140,31 +83,102 @@ function(target_link_dotnet_libraries TARGET) endif() foreach(lib IN LISTS libs) - add_dependencies(${TARGET} ${lib}) + get_property(CURRENT_DEPS GLOBAL PROPERTY DOTNET_TARGET_${TARGET}_DOTNET_DEPS) + if(NOT CURRENT_DEPS) + set(CURRENT_DEPS "") + endif() + list(APPEND CURRENT_DEPS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${lib}.dll) + set_property(GLOBAL PROPERTY DOTNET_TARGET_${TARGET}_DOTNET_DEPS "${CURRENT_DEPS}") - get_target_property(LIB_PUB_REFS ${lib} DOTNET_PUBLIC_REFS) - if(NOT LIB_PUB_REFS) - set(LIB_PUB_REFS "") + get_property(CURRENT_DEP_TARGETS GLOBAL PROPERTY DOTNET_TARGET_${TARGET}_DEP_TARGETS) + if(NOT CURRENT_DEP_TARGETS) + set(CURRENT_DEP_TARGETS "") endif() + list(APPEND CURRENT_DEP_TARGETS ${lib}) + set_property(GLOBAL PROPERTY DOTNET_TARGET_${TARGET}_DEP_TARGETS "${CURRENT_DEP_TARGETS}") - get_target_property(CURRENT_ALL ${TARGET} DOTNET_ALL_REFS) - if(NOT CURRENT_ALL) - set(CURRENT_ALL "") + get_property(CURRENT_ALL_REFS GLOBAL PROPERTY DOTNET_TARGET_${TARGET}_ALL_REFS) + if(NOT CURRENT_ALL_REFS) + set(CURRENT_ALL_REFS "") endif() - list(APPEND CURRENT_ALL "-reference:${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${lib}.dll") - list(APPEND CURRENT_ALL ${LIB_PUB_REFS}) - set_target_properties(${TARGET} PROPERTIES DOTNET_ALL_REFS "${CURRENT_ALL}") + list(APPEND CURRENT_ALL_REFS "-reference:${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${lib}.dll") + + get_property(LIB_PUB_REFS GLOBAL PROPERTY DOTNET_TARGET_${lib}_PUB_REFS) + if(NOT LIB_PUB_REFS) + set(LIB_PUB_REFS "") + endif() + list(APPEND CURRENT_ALL_REFS ${LIB_PUB_REFS}) + set_property(GLOBAL PROPERTY DOTNET_TARGET_${TARGET}_ALL_REFS "${CURRENT_ALL_REFS}") if("${scope}" STREQUAL "PUBLIC" OR "${scope}" STREQUAL "INTERFACE") - get_target_property(CURRENT_PUB ${TARGET} DOTNET_PUBLIC_REFS) + get_property(CURRENT_PUB GLOBAL PROPERTY DOTNET_TARGET_${TARGET}_PUB_REFS) if(NOT CURRENT_PUB) set(CURRENT_PUB "") endif() list(APPEND CURRENT_PUB "-reference:${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${lib}.dll") list(APPEND CURRENT_PUB ${LIB_PUB_REFS}) list(REMOVE_DUPLICATES CURRENT_PUB) - set_target_properties(${TARGET} PROPERTIES DOTNET_PUBLIC_REFS "${CURRENT_PUB}") + set_property(GLOBAL PROPERTY DOTNET_TARGET_${TARGET}_PUB_REFS "${CURRENT_PUB}") endif() endforeach() endforeach() endfunction() + + +function(dotnet_finalize_targets) + get_property(ALL_TARGETS GLOBAL PROPERTY DOTNET_TARGETS) + foreach(NAME IN LISTS ALL_TARGETS) + get_property(TARGET_TYPE GLOBAL PROPERTY DOTNET_TARGET_${NAME}_TYPE) + get_property(SOURCES GLOBAL PROPERTY DOTNET_TARGET_${NAME}_SOURCES) + get_property(CSC_FLAGS GLOBAL PROPERTY DOTNET_TARGET_${NAME}_CSC_FLAGS) + get_property(NATIVE_DEPS GLOBAL PROPERTY DOTNET_TARGET_${NAME}_NATIVE_DEPS) + get_property(DOTNET_DEPS GLOBAL PROPERTY DOTNET_TARGET_${NAME}_DOTNET_DEPS) + get_property(DEP_TARGETS GLOBAL PROPERTY DOTNET_TARGET_${NAME}_DEP_TARGETS) + get_property(ALL_REFS GLOBAL PROPERTY DOTNET_TARGET_${NAME}_ALL_REFS) + get_property(PUB_REFS GLOBAL PROPERTY DOTNET_TARGET_${NAME}_PUB_REFS) + + set(OUTPUT_FILE ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${NAME}.dll) + + set(ALL_DEPS "") + if(TARGET_TYPE STREQUAL "executable") + list(APPEND ALL_DEPS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${NAME}.runtimeconfig.json) + endif() + if(NATIVE_DEPS) + list(APPEND ALL_DEPS ${NATIVE_DEPS}) + endif() + if(DOTNET_DEPS) + list(APPEND ALL_DEPS ${DOTNET_DEPS}) + endif() + + add_custom_command( + OUTPUT ${OUTPUT_FILE} + COMMAND dotnet ${CSC_DLL} + ${CSC_FLAGS} + ${ALL_REFS} + -out:${OUTPUT_FILE} + -lib:${RUNTIME_DIR} + -reference:System.Private.CoreLib.dll + -reference:System.Runtime.dll + -reference:System.Console.dll + ${SOURCES} + DEPENDS ${SOURCES} ${ALL_DEPS} + COMMENT "Compiling ${NAME} with Roslyn csc..." + ) + + add_custom_target(${NAME} ALL DEPENDS ${OUTPUT_FILE}) + + foreach(dep IN LISTS DEP_TARGETS) + add_dependencies(${NAME} ${dep}) + endforeach() + + set_target_properties(${NAME} PROPERTIES + DOTNET_ALL_REFS "${ALL_REFS}" + DOTNET_PUBLIC_REFS "${PUB_REFS}" + ) + endforeach() +endfunction() + + +macro(add_dotnet_target NAME) + set_property(GLOBAL APPEND PROPERTY DOTNET_TARGETS "${NAME}") +endmacro() |
