summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt2
-rw-r--r--baz/CMakeLists.txt7
-rw-r--r--cmake/dotnet.cmake204
-rw-r--r--foobar/CMakeLists.txt3
-rw-r--r--hello/CMakeLists.txt3
-rw-r--r--second/CMakeLists.txt3
6 files changed, 123 insertions, 99 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5010dcb..350a814 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -15,3 +15,5 @@ add_subdirectory(baz)
add_subdirectory(foobar)
add_subdirectory(hello)
add_subdirectory(second)
+
+dotnet_finalize_targets()
diff --git a/baz/CMakeLists.txt b/baz/CMakeLists.txt
index 97387ce..78a418e 100644
--- a/baz/CMakeLists.txt
+++ b/baz/CMakeLists.txt
@@ -1,4 +1,9 @@
+add_dotnet_target(Baz)
+
add_dotnet_library(Baz
SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/Baz.cs
- NATIVE_DEPENDS hello_c
+)
+
+target_link_dotnet_libraries(Baz
+ NATIVE_DEPS hello_c
)
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()
diff --git a/foobar/CMakeLists.txt b/foobar/CMakeLists.txt
index f4ff2a7..83f29ab 100644
--- a/foobar/CMakeLists.txt
+++ b/foobar/CMakeLists.txt
@@ -1,6 +1,7 @@
+add_dotnet_target(FooBar)
+
add_dotnet_library(FooBar
SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/FooBar.cs
- DEPENDS Baz
)
target_link_dotnet_libraries(FooBar PUBLIC Baz)
diff --git a/hello/CMakeLists.txt b/hello/CMakeLists.txt
index a6fb31c..4f61ac3 100644
--- a/hello/CMakeLists.txt
+++ b/hello/CMakeLists.txt
@@ -1,7 +1,8 @@
+add_dotnet_target(HelloCMake)
+
add_dotnet_executable(HelloCMake
MAIN Program
SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/Program.cs
- DEPENDS FooBar
)
target_link_dotnet_libraries(HelloCMake PRIVATE FooBar)
diff --git a/second/CMakeLists.txt b/second/CMakeLists.txt
index 464ee52..c99c697 100644
--- a/second/CMakeLists.txt
+++ b/second/CMakeLists.txt
@@ -1,7 +1,8 @@
+add_dotnet_target(Second)
+
add_dotnet_executable(Second
MAIN Program
SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/Program.cs
- DEPENDS Baz
)
target_link_dotnet_libraries(Second PRIVATE Baz)