summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt2
-rw-r--r--cmake/dotnet.cmake105
-rw-r--r--foobar/CMakeLists.txt19
-rw-r--r--hello/CMakeLists.txt29
4 files changed, 115 insertions, 40 deletions
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}
+ $<TARGET_PROPERTY:${NAME},DOTNET_REFERENCES>
+ -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} $<TARGET_PROPERTY:${NAME},DOTNET_DEPENDS>
+ 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
+)