From 914c5024e9005d06bb3f784c2bc230a58483fb9a Mon Sep 17 00:00:00 2001 From: Bernhard Guillon Date: Tue, 30 Jun 2026 20:47:33 +0200 Subject: Add cmake/dotnet.cmake with add_dotnet_library, add_dotnet_executable, and target_link_dotnet_libraries --- CMakeLists.txt | 2 + cmake/dotnet.cmake | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++ foobar/CMakeLists.txt | 19 +-------- hello/CMakeLists.txt | 29 +++----------- 4 files changed, 115 insertions(+), 40 deletions(-) create mode 100644 cmake/dotnet.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 771f46b..0c67db4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,5 +5,7 @@ set(DOTNET_ROOT /usr/share/dotnet) set(CSC_DLL ${DOTNET_ROOT}/sdk/10.0.109/Roslyn/bincore/csc.dll) set(RUNTIME_DIR ${DOTNET_ROOT}/shared/Microsoft.NETCore.App/10.0.9) +include(cmake/dotnet.cmake) + add_subdirectory(foobar) add_subdirectory(hello) diff --git a/cmake/dotnet.cmake b/cmake/dotnet.cmake new file mode 100644 index 0000000..175187b --- /dev/null +++ b/cmake/dotnet.cmake @@ -0,0 +1,105 @@ +function(add_dotnet_library NAME) + set(multiValueArgs SOURCES REFERENCES) + + cmake_parse_arguments(PARSE_ARGV 1 arg + "" "" "${multiValueArgs}" + ) + + if(NOT arg_SOURCES) + message(FATAL_ERROR "add_dotnet_library: SOURCES is required") + endif() + + set(OUTPUT_FILE ${CMAKE_BINARY_DIR}/${NAME}.dll) + + set(CSC_FLAGS -target:library) + foreach(ref IN LISTS arg_REFERENCES) + list(APPEND CSC_FLAGS "-reference:${ref}") + endforeach() + + add_custom_command( + OUTPUT ${OUTPUT_FILE} + COMMAND dotnet ${CSC_DLL} + ${CSC_FLAGS} + -out:${OUTPUT_FILE} + -lib:${RUNTIME_DIR} + -reference:System.Private.CoreLib.dll + -reference:System.Runtime.dll + -reference:System.Console.dll + ${arg_SOURCES} + DEPENDS ${arg_SOURCES} + COMMENT "Compiling ${NAME} library with Roslyn csc..." + ) + + add_custom_target(${NAME} ALL DEPENDS ${OUTPUT_FILE}) +endfunction() + + +function(add_dotnet_executable NAME) + set(oneValueArgs MAIN) + set(multiValueArgs SOURCES REFERENCES) + + cmake_parse_arguments(PARSE_ARGV 1 arg + "" "${oneValueArgs}" "${multiValueArgs}" + ) + + if(NOT arg_SOURCES) + message(FATAL_ERROR "add_dotnet_executable: SOURCES is required") + endif() + + if(NOT arg_MAIN) + set(arg_MAIN "Main") + endif() + + set(OUTPUT_FILE ${CMAKE_BINARY_DIR}/${NAME}.dll) + + set(CSC_FLAGS -target:exe -main:${arg_MAIN}) + foreach(ref IN LISTS arg_REFERENCES) + list(APPEND CSC_FLAGS "-reference:${ref}") + endforeach() + + add_custom_command( + OUTPUT ${OUTPUT_FILE} + COMMAND dotnet ${CSC_DLL} + ${CSC_FLAGS} + $ + -out:${OUTPUT_FILE} + -lib:${RUNTIME_DIR} + -reference:System.Private.CoreLib.dll + -reference:System.Runtime.dll + -reference:System.Console.dll + ${arg_SOURCES} + COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_SOURCE_DIR}/HelloCMake.runtimeconfig.json + ${CMAKE_BINARY_DIR}/${NAME}.runtimeconfig.json + DEPENDS ${arg_SOURCES} $ + COMMENT "Compiling ${NAME} with Roslyn csc..." + ) + + add_custom_target(${NAME} ALL DEPENDS ${OUTPUT_FILE}) +endfunction() + + +function(target_link_dotnet_libraries TARGET) + set(multiValueArgs LIBRARIES) + + 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}) + endforeach() + + set_target_properties(${TARGET} PROPERTIES + DOTNET_REFERENCES "${REFS}" + DOTNET_DEPENDS "${DEPS}" + ) +endfunction() diff --git a/foobar/CMakeLists.txt b/foobar/CMakeLists.txt index 87dbba4..ef616c7 100644 --- a/foobar/CMakeLists.txt +++ b/foobar/CMakeLists.txt @@ -1,18 +1,3 @@ -set(FOOBAR_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/FooBar.cs) -set(FOOBAR_OUTPUT ${CMAKE_BINARY_DIR}/FooBar.dll) - -add_custom_command( - OUTPUT ${FOOBAR_OUTPUT} - COMMAND dotnet ${CSC_DLL} - -target:library - -out:${FOOBAR_OUTPUT} - -lib:${RUNTIME_DIR} - -reference:System.Private.CoreLib.dll - -reference:System.Runtime.dll - -reference:System.Console.dll - ${FOOBAR_SOURCES} - DEPENDS ${FOOBAR_SOURCES} - COMMENT "Compiling FooBar library with Roslyn csc..." +add_dotnet_library(FooBar + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/FooBar.cs ) - -add_custom_target(FooBar ALL DEPENDS ${FOOBAR_OUTPUT}) diff --git a/hello/CMakeLists.txt b/hello/CMakeLists.txt index 3d1427d..d726950 100644 --- a/hello/CMakeLists.txt +++ b/hello/CMakeLists.txt @@ -1,25 +1,8 @@ -set(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/Program.cs) -set(TARGET HelloCMake) -set(OUTPUT_FILE ${CMAKE_BINARY_DIR}/${TARGET}.dll) - -add_custom_command( - OUTPUT ${OUTPUT_FILE} - COMMAND dotnet ${CSC_DLL} - -target:exe - -out:${OUTPUT_FILE} - -lib:${RUNTIME_DIR} - -reference:System.Private.CoreLib.dll - -reference:System.Runtime.dll - -reference:System.Console.dll - -reference:${CMAKE_BINARY_DIR}/FooBar.dll - -main:Program - ${SOURCES} - COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${CMAKE_SOURCE_DIR}/HelloCMake.runtimeconfig.json - ${CMAKE_BINARY_DIR}/${TARGET}.runtimeconfig.json - DEPENDS ${SOURCES} ${CMAKE_BINARY_DIR}/FooBar.dll - COMMENT "Compiling ${TARGET} with Roslyn csc..." +add_dotnet_executable(HelloCMake + MAIN Program + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/Program.cs ) -add_custom_target(${TARGET} ALL DEPENDS ${OUTPUT_FILE}) -add_dependencies(${TARGET} FooBar) +target_link_dotnet_libraries(HelloCMake + LIBRARIES FooBar +) -- cgit v1.2.3