diff options
author | Rishi Theivendran <rishi.theivendran@rohde-schwarz.com> | 2018-06-08 16:15:18 -0400 |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2018-06-12 11:34:58 -0400 |
commit | 0c2fb4c8964b6164c44e8641c8c9225369c0228b (patch) | |
tree | 732c27065bfe1e317da5dd95d12e6d85bd16f215 | |
parent | 90ebc32d9e7400a590973b30c99f2986bcb2b755 (diff) | |
download | cmake-0c2fb4c8964b6164c44e8641c8c9225369c0228b.tar.gz |
UseSWIG: Add CSHARP variant for wrapper files
Issue: #18065
Fixes: #18066
-rw-r--r-- | Help/release/3.12.rst | 3 | ||||
-rw-r--r-- | Modules/UseSWIG.cmake | 9 | ||||
-rw-r--r-- | Tests/UseSWIG/BasicConfiguration.cmake | 4 | ||||
-rw-r--r-- | Tests/UseSWIG/BasicCsharp/CMakeLists.txt | 21 | ||||
-rw-r--r-- | Tests/UseSWIG/CMakeLists.txt | 14 | ||||
-rw-r--r-- | Tests/UseSWIG/runme.cs | 54 |
6 files changed, 103 insertions, 2 deletions
diff --git a/Help/release/3.12.rst b/Help/release/3.12.rst index e460d81d16..691731a469 100644 --- a/Help/release/3.12.rst +++ b/Help/release/3.12.rst @@ -189,6 +189,9 @@ Modules ``UseSWIG_MODULE_VERSION`` variable to ensure legacy support as well as more robust handling of ``SWIG`` advanced features (like ``%template``). +* The :module:`UseSWIG` module learned to support CSHARP variant + wrapper files. + * The :module:`WriteCompilerDetectionHeader` module gained a ``BARE_FEATURES`` option to add a compatibility define for the exact keyword of a new language feature. diff --git a/Modules/UseSWIG.cmake b/Modules/UseSWIG.cmake index 8713cd8be5..98a761226a 100644 --- a/Modules/UseSWIG.cmake +++ b/Modules/UseSWIG.cmake @@ -189,6 +189,7 @@ set(SWIG_EXTRA_LIBRARIES "") set(SWIG_PYTHON_EXTRA_FILE_EXTENSIONS ".py") set(SWIG_JAVA_EXTRA_FILE_EXTENSIONS ".java" "JNI.java") +set(SWIG_CSHARP_EXTRA_FILE_EXTENSIONS ".cs" "PINVOKE.cs") ## ## PRIVATE functions @@ -263,10 +264,14 @@ function(SWIG_GET_EXTRA_OUTPUT_FILES language outfiles generatedpath infile) endif() foreach(it ${SWIG_${language}_EXTRA_FILE_EXTENSIONS}) set(extra_file "${generatedpath}/${module_basename}${it}") + if (extra_file MATCHES "\\.cs$") + set_source_files_properties(${extra_file} PROPERTIES LANGUAGE "CSharp") + else() + # Treat extra outputs as plain files regardless of language. + set_source_files_properties(${extra_file} PROPERTIES LANGUAGE "") + endif() list(APPEND files "${extra_file}") endforeach() - # Treat extra outputs as plain files regardless of language. - set_source_files_properties(${files} PROPERTIES LANGUAGE "") set (${outfiles} ${files} PARENT_SCOPE) endfunction() diff --git a/Tests/UseSWIG/BasicConfiguration.cmake b/Tests/UseSWIG/BasicConfiguration.cmake index d025d2a968..fd3ac4031d 100644 --- a/Tests/UseSWIG/BasicConfiguration.cmake +++ b/Tests/UseSWIG/BasicConfiguration.cmake @@ -15,6 +15,9 @@ unset(SWIG_LANG_DEFINITIONS) unset(SWIG_LANG_OPTIONS) unset(SWIG_LANG_LIBRARIES) +if(${language} MATCHES csharp) + set(SWIG_LANG_TYPE TYPE SHARED) +endif() if(${language} MATCHES python) find_package(Python REQUIRED COMPONENTS Interpreter Development) set(SWIG_LANG_INCLUDE_DIRECTORIES ${Python_INCLUDE_DIRS}) @@ -76,4 +79,5 @@ SWIG_ADD_LIBRARY(example ${SWIG_LANG_TYPE} SOURCES "${CMAKE_CURRENT_LIST_DIR}/example.i" "${CMAKE_CURRENT_LIST_DIR}/example.cxx") +TARGET_INCLUDE_DIRECTORIES(example PUBLIC ${CMAKE_CURRENT_LIST_DIR}) TARGET_LINK_LIBRARIES(example PRIVATE ${SWIG_LANG_LIBRARIES}) diff --git a/Tests/UseSWIG/BasicCsharp/CMakeLists.txt b/Tests/UseSWIG/BasicCsharp/CMakeLists.txt new file mode 100644 index 0000000000..84743efa03 --- /dev/null +++ b/Tests/UseSWIG/BasicCsharp/CMakeLists.txt @@ -0,0 +1,21 @@ +cmake_minimum_required(VERSION 3.12) + +project(TestBasicCsharp CXX CSharp) + +include(CTest) + +set(language "csharp") + +include (../BasicConfiguration.cmake) + +set_source_files_properties(Square.cs Circle.cs Shape.cs PROPERTIES GENERATED 1) +add_library(example_cs SHARED $<TARGET_PROPERTY:example,SWIG_SUPPORT_FILES> Square.cs Circle.cs Shape.cs) +set_target_properties(example_cs PROPERTIES LINKER_LANGUAGE CSharp) +target_link_libraries(example_cs example) + +add_executable(runme ${CMAKE_CURRENT_SOURCE_DIR}/../runme.cs) +target_link_libraries(runme example_cs) +set_target_properties(runme PROPERTIES LINKER_LANGUAGE CSharp) + +add_test (NAME BasicCsharp + COMMAND $<TARGET_FILE:runme>) diff --git a/Tests/UseSWIG/CMakeLists.txt b/Tests/UseSWIG/CMakeLists.txt index 0c4ec8a7f5..cc29b77000 100644 --- a/Tests/UseSWIG/CMakeLists.txt +++ b/Tests/UseSWIG/CMakeLists.txt @@ -19,6 +19,20 @@ add_test(NAME UseSWIG.LegacyPerl COMMAND --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION> ) +include(CheckLanguage) +check_language(CSharp) +if (CMAKE_CSharp_COMPILER) + add_test(NAME UseSWIG.BasicCsharp COMMAND + ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION> + --build-and-test + "${CMake_SOURCE_DIR}/Tests/UseSWIG/BasicCsharp" + "${CMake_BINARY_DIR}/Tests/UseSWIG/BasicCsharp" + ${build_generator_args} + --build-project TestBasicCsharp + --build-options ${build_options} + --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION> + ) +endif() add_test(NAME UseSWIG.BasicPython COMMAND ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION> diff --git a/Tests/UseSWIG/runme.cs b/Tests/UseSWIG/runme.cs new file mode 100644 index 0000000000..f0c1bd2200 --- /dev/null +++ b/Tests/UseSWIG/runme.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; + +public class runme +{ + static void Main() + { + // ----- Object creation ----- + + Console.WriteLine("Creating some objects:"); + Circle c = new Circle(10); + Console.WriteLine(" Created " + c); + Square s = new Square(10); + Console.WriteLine(" Created " + s); + + // ----- Access a static member ----- + + Console.WriteLine("\nA total of " + Shape.nshapes + " shapes were created"); + + // ----- Member data access ----- + + // Set the location of the object + + c.x = 20; + c.y = 30; + + s.x = -10; + s.y = 5; + + Console.WriteLine("\nHere is their current position:"); + Console.WriteLine(" Circle = ({0}, {1})", c.x,c.y); + Console.WriteLine(" Square = ({0}, {1})", s.x,s.y); + + // ----- Call some methods ----- + + Console.WriteLine("\nHere are some properties of the shapes:"); + List <Shape> shapeList = new List <Shape> { c,s }; + foreach(var o in shapeList){ + Console.WriteLine(" " + o); + Console.WriteLine(" area = " + o.area()); + Console.WriteLine(" perimeter = " + o.perimeter()); + } + + Console.WriteLine("\nGuess I'll clean up now"); + + // Note: this invokes the virtual destructor + c.Dispose(); + s.Dispose(); + + s = new Square(10);; + Console.WriteLine(Shape.nshapes + " shapes remain"); + Console.WriteLine("Goodbye"); + } +} |