diff options
-rw-r--r-- | Help/manual/cmake-policies.7.rst | 1 | ||||
-rw-r--r-- | Help/policy/CMP0086.rst | 20 | ||||
-rw-r--r-- | Help/release/dev/UseSWIG-CMP0086.rst | 6 | ||||
-rw-r--r-- | Modules/UseSWIG.cmake | 25 | ||||
-rw-r--r-- | Source/cmPolicies.h | 5 | ||||
-rw-r--r-- | Tests/RunCMake/CMakeLists.txt | 2 | ||||
-rw-r--r-- | Tests/RunCMake/UseSWIG/CMP0078-WARN-stderr.txt | 2 | ||||
-rw-r--r-- | Tests/RunCMake/UseSWIG/CMP0078-common.cmake | 2 | ||||
-rw-r--r-- | Tests/RunCMake/UseSWIG/CMP0086-NEW-nuild-check.cmake | 4 | ||||
-rw-r--r-- | Tests/RunCMake/UseSWIG/CMP0086-NEW.cmake | 2 | ||||
-rw-r--r-- | Tests/RunCMake/UseSWIG/CMP0086-OLD-build-check.cmake | 4 | ||||
-rw-r--r-- | Tests/RunCMake/UseSWIG/CMP0086-OLD.cmake | 2 | ||||
-rw-r--r-- | Tests/RunCMake/UseSWIG/CMP0086-WARN-stderr.txt | 11 | ||||
-rw-r--r-- | Tests/RunCMake/UseSWIG/CMP0086-WARN.cmake | 1 | ||||
-rw-r--r-- | Tests/RunCMake/UseSWIG/CMP0086-common.cmake | 11 | ||||
-rw-r--r-- | Tests/RunCMake/UseSWIG/RunCMakeTest.cmake | 20 | ||||
-rw-r--r-- | Tests/UseSWIG/CMakeLists.txt | 14 | ||||
-rw-r--r-- | Tests/UseSWIG/ModuleName/CMakeLists.txt | 42 | ||||
-rw-r--r-- | Tests/UseSWIG/ModuleName/example.i | 9 | ||||
-rw-r--r-- | Tests/UseSWIG/ModuleName/runme.py | 52 |
20 files changed, 231 insertions, 4 deletions
diff --git a/Help/manual/cmake-policies.7.rst b/Help/manual/cmake-policies.7.rst index 044a06e0e9..ed61ae042b 100644 --- a/Help/manual/cmake-policies.7.rst +++ b/Help/manual/cmake-policies.7.rst @@ -57,6 +57,7 @@ Policies Introduced by CMake 3.14 .. toctree:: :maxdepth: 1 + CMP0086: UseSWIG honors SWIG_MODULE_NAME via -module flag. </policy/CMP0086> CMP0085: IN_LIST generator expression handles empty list items. </policy/CMP0085> CMP0084: The FindQt module does not exist for find_package(). </policy/CMP0084> CMP0083: Add PIE options when linking executable. </policy/CMP0083> diff --git a/Help/policy/CMP0086.rst b/Help/policy/CMP0086.rst new file mode 100644 index 0000000000..4a9e8b80a4 --- /dev/null +++ b/Help/policy/CMP0086.rst @@ -0,0 +1,20 @@ +CMP0086 +------- + +:module:`UseSWIG` honors ``SWIG_MODULE_NAME`` via ``-module`` flag. + +Starting with CMake 3.14, :module:`UseSWIG` passes option +``-module <module_name>`` to ``SWIG`` compiler if the file property +``SWIG_MODULE_NAME`` is specified. This policy provides compatibility with +projects that expect the legacy behavior. + +The ``OLD`` behavior for this policy is to never pass ``-module`` option. +The ``NEW`` behavior is to pass ``-module`` option to ``SWIG`` compiler if +``SWIG_MODULE_NAME`` is specified. + +This policy was introduced in CMake version 3.14. CMake version +|release| warns when the policy is not set and uses ``OLD`` behavior. +Use the :command:`cmake_policy` command to set it to ``OLD`` or ``NEW`` +explicitly. + +.. include:: DEPRECATED.txt diff --git a/Help/release/dev/UseSWIG-CMP0086.rst b/Help/release/dev/UseSWIG-CMP0086.rst new file mode 100644 index 0000000000..d6fd0d1cc6 --- /dev/null +++ b/Help/release/dev/UseSWIG-CMP0086.rst @@ -0,0 +1,6 @@ +UseSWIG-CMP0086 +--------------- + +* The :module:`UseSWIG` module passes option ``-module <module_name>`` to + ``SWIG`` compiler if the file property ``SWIG_MODULE_NAME`` is defined. + See policy :policy:`CMP0086`. diff --git a/Modules/UseSWIG.cmake b/Modules/UseSWIG.cmake index d9a03898e0..a3d6d9e347 100644 --- a/Modules/UseSWIG.cmake +++ b/Modules/UseSWIG.cmake @@ -142,6 +142,11 @@ ensure generated files will receive the required settings. set_property(SOURCE mymod.i PROPERTY SWIG_MODULE_NAME mymod_realname) + .. note:: + + If policy :policy:`CMP0086` is set to ``NEW``, ``-module <module_name>`` + is passed to ``SWIG`` compiler. + Target library properties can be set to apply same configuration to all SWIG input files. @@ -220,12 +225,19 @@ as well as ``SWIG``: #]=======================================================================] cmake_policy(GET CMP0078 target_name_policy) +cmake_policy(GET CMP0086 module_name_policy) + cmake_policy (VERSION 3.12) if (target_name_policy) # respect user choice regarding CMP0078 policy cmake_policy(SET CMP0078 ${target_name_policy}) endif() +if (module_name_policy) + # respect user choice regarding CMP0086 policy + cmake_policy(SET CMP0086 ${module_name_policy}) +endif() unset(target_name_policy) +unset(module_name_policy) set(SWIG_CXX_EXTENSION "cxx") set(SWIG_EXTRA_LIBRARIES "") @@ -426,6 +438,19 @@ function(SWIG_ADD_SOURCE_TO_MODULE name outfiles infile) list (APPEND swig_special_flags "-c++") endif() + cmake_policy(GET CMP0086 module_name_policy) + if (module_name_policy STREQUAL "NEW") + get_source_file_property(module_name "${infile}" SWIG_MODULE_NAME) + if (module_name) + list (APPEND swig_special_flags "-module" "${module_name}") + endif() + else() + if (NOT module_name_policy) + cmake_policy(GET_WARNING CMP0086 _cmp0086_warning) + message(AUTHOR_WARNING "${_cmp0086_warning}\n") + endif() + endif() + set (swig_extra_flags) if(SWIG_MODULE_${name}_LANGUAGE STREQUAL "CSHARP") if(NOT ("-dllimport" IN_LIST swig_source_file_flags OR "-dllimport" IN_LIST SWIG_MODULE_${name}_EXTRA_FLAGS)) diff --git a/Source/cmPolicies.h b/Source/cmPolicies.h index 9985d6395e..7674877362 100644 --- a/Source/cmPolicies.h +++ b/Source/cmPolicies.h @@ -251,7 +251,10 @@ class cmMakefile; "The FindQt module does not exist for find_package().", 3, 14, 0, \ cmPolicies::WARN) \ SELECT(POLICY, CMP0085, "$<IN_LIST:...> handles empty list items.", 3, 14, \ - 0, cmPolicies::WARN) + 0, cmPolicies::WARN) \ + SELECT(POLICY, CMP0086, \ + "UseSWIG honors SWIG_MODULE_NAME via -module flag.", 3, 14, 0, \ + cmPolicies::WARN) #define CM_SELECT_ID(F, A1, A2, A3, A4, A5, A6) F(A1) #define CM_FOR_EACH_POLICY_ID(POLICY) \ diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index b044757607..5ff2538d64 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -159,7 +159,7 @@ add_RunCMake_test(FindBoost) add_RunCMake_test(FindLua) add_RunCMake_test(FindOpenGL) if(CMake_TEST_UseSWIG) - add_RunCMake_test(UseSWIG) + add_RunCMake_test(UseSWIG -DCMake_TEST_FindPython=${CMake_TEST_FindPython}) endif() if(NOT CMAKE_C_COMPILER_ID MATCHES "Watcom") add_RunCMake_test(GenerateExportHeader) diff --git a/Tests/RunCMake/UseSWIG/CMP0078-WARN-stderr.txt b/Tests/RunCMake/UseSWIG/CMP0078-WARN-stderr.txt index f0ed577599..d89d1744d0 100644 --- a/Tests/RunCMake/UseSWIG/CMP0078-WARN-stderr.txt +++ b/Tests/RunCMake/UseSWIG/CMP0078-WARN-stderr.txt @@ -4,7 +4,7 @@ CMake Warning \(dev\) at .*/Modules/UseSWIG\.cmake:[0-9]+ \(message\): command to set the policy and suppress this warning\. Call Stack \(most recent call first\): - CMP0078-common\.cmake:6 \(swig_add_library\) + CMP0078-common\.cmake:8 \(swig_add_library\) CMP0078-WARN\.cmake:1 \(include\) CMakeLists\.txt:3 \(include\) This warning is for project developers. Use -Wno-dev to suppress it.$ diff --git a/Tests/RunCMake/UseSWIG/CMP0078-common.cmake b/Tests/RunCMake/UseSWIG/CMP0078-common.cmake index 6cf39dcf86..b13796b55a 100644 --- a/Tests/RunCMake/UseSWIG/CMP0078-common.cmake +++ b/Tests/RunCMake/UseSWIG/CMP0078-common.cmake @@ -1,4 +1,6 @@ +cmake_policy(SET CMP0086 NEW) + set(SWIG_EXECUTABLE "swig") set(SWIG_DIR "/swig") include(UseSWIG) diff --git a/Tests/RunCMake/UseSWIG/CMP0086-NEW-nuild-check.cmake b/Tests/RunCMake/UseSWIG/CMP0086-NEW-nuild-check.cmake new file mode 100644 index 0000000000..ea8b2cdcb8 --- /dev/null +++ b/Tests/RunCMake/UseSWIG/CMP0086-NEW-nuild-check.cmake @@ -0,0 +1,4 @@ + +if (NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/new_example.py") + set (RunCMake_TEST_FAILED "Not found expected file: '${RunCMake_TEST_BINARY_DIR}/new_example.py'.") +endif() diff --git a/Tests/RunCMake/UseSWIG/CMP0086-NEW.cmake b/Tests/RunCMake/UseSWIG/CMP0086-NEW.cmake new file mode 100644 index 0000000000..b54338d6a6 --- /dev/null +++ b/Tests/RunCMake/UseSWIG/CMP0086-NEW.cmake @@ -0,0 +1,2 @@ +cmake_policy(SET CMP0086 NEW) +include(CMP0086-common.cmake) diff --git a/Tests/RunCMake/UseSWIG/CMP0086-OLD-build-check.cmake b/Tests/RunCMake/UseSWIG/CMP0086-OLD-build-check.cmake new file mode 100644 index 0000000000..96b5295a30 --- /dev/null +++ b/Tests/RunCMake/UseSWIG/CMP0086-OLD-build-check.cmake @@ -0,0 +1,4 @@ + +if (NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/example.py") + set (RunCMake_TEST_FAILED "Not found expected file: '${RunCMake_TEST_BINARY_DIR}/example.py'.") +endif() diff --git a/Tests/RunCMake/UseSWIG/CMP0086-OLD.cmake b/Tests/RunCMake/UseSWIG/CMP0086-OLD.cmake new file mode 100644 index 0000000000..6a63d4cd0d --- /dev/null +++ b/Tests/RunCMake/UseSWIG/CMP0086-OLD.cmake @@ -0,0 +1,2 @@ +cmake_policy(SET CMP0086 OLD) +include(CMP0086-common.cmake) diff --git a/Tests/RunCMake/UseSWIG/CMP0086-WARN-stderr.txt b/Tests/RunCMake/UseSWIG/CMP0086-WARN-stderr.txt new file mode 100644 index 0000000000..af41021447 --- /dev/null +++ b/Tests/RunCMake/UseSWIG/CMP0086-WARN-stderr.txt @@ -0,0 +1,11 @@ +CMake Warning \(dev\) at .*/Modules/UseSWIG.cmake:[0-9]+ \(message\): + Policy CMP0086 is not set: UseSWIG honors SWIG_MODULE_NAME via -module + flag. Run "cmake --help-policy CMP0086" for policy details\. Use the + cmake_policy command to set the policy and suppress this warning\. + +Call Stack \(most recent call first\): + .*/Modules/UseSWIG.cmake:[0-9]+ \(SWIG_ADD_SOURCE_TO_MODULE\) + CMP0086-common\.cmake:[0-9]+ \(swig_add_library\) + CMP0086-WARN\.cmake:1 \(include\) + CMakeLists\.txt:3 \(include\) +This warning is for project developers\. Use -Wno-dev to suppress it\.$ diff --git a/Tests/RunCMake/UseSWIG/CMP0086-WARN.cmake b/Tests/RunCMake/UseSWIG/CMP0086-WARN.cmake new file mode 100644 index 0000000000..69c2d9db72 --- /dev/null +++ b/Tests/RunCMake/UseSWIG/CMP0086-WARN.cmake @@ -0,0 +1 @@ +include(CMP0086-common.cmake) diff --git a/Tests/RunCMake/UseSWIG/CMP0086-common.cmake b/Tests/RunCMake/UseSWIG/CMP0086-common.cmake new file mode 100644 index 0000000000..c02592a948 --- /dev/null +++ b/Tests/RunCMake/UseSWIG/CMP0086-common.cmake @@ -0,0 +1,11 @@ + +cmake_policy(SET CMP0078 NEW) + +find_package(Python REQUIRED COMPONENTS Development) +find_package (SWIG REQUIRED) +include(UseSWIG) + +set_property (SOURCE example.i PROPERTY SWIG_MODULE_NAME "new_example") + +swig_add_library(example LANGUAGE python TYPE MODULE SOURCES example.i) +target_link_libraries(example PRIVATE Python::Python) diff --git a/Tests/RunCMake/UseSWIG/RunCMakeTest.cmake b/Tests/RunCMake/UseSWIG/RunCMakeTest.cmake index b96622ae32..6acf7199c4 100644 --- a/Tests/RunCMake/UseSWIG/RunCMakeTest.cmake +++ b/Tests/RunCMake/UseSWIG/RunCMakeTest.cmake @@ -3,3 +3,23 @@ include(RunCMake) run_cmake(CMP0078-WARN) run_cmake(CMP0078-OLD) run_cmake(CMP0078-NEW) + +run_cmake(CMP0086-WARN) + +if (CMake_TEST_FindPython) + + macro(run_cmake_target test subtest target) + set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${test}-build) + set(RunCMake_TEST_NO_CLEAN 1) + run_cmake_command(${test}-${subtest} ${CMAKE_COMMAND} --build . --target ${target} ${ARGN}) + + unset(RunCMake_TEST_BINARY_DIR) + unset(RunCMake_TEST_NO_CLEAN) + endmacro() + + run_cmake(CMP0086-OLD) + run_cmake_target(CMP0086-OLD build example) + run_cmake(CMP0086-NEW) + run_cmake_target(CMP0086-NEW build example) + +endif() diff --git a/Tests/UseSWIG/CMakeLists.txt b/Tests/UseSWIG/CMakeLists.txt index 4c3d901a9f..f79cda6b5a 100644 --- a/Tests/UseSWIG/CMakeLists.txt +++ b/Tests/UseSWIG/CMakeLists.txt @@ -96,6 +96,18 @@ add_test(NAME UseSWIG.UseTargetINCLUDE_DIRECTORIES COMMAND "${CMake_SOURCE_DIR}/Tests/UseSWIG/UseTargetINCLUDE_DIRECTORIES" "${CMake_BINARY_DIR}/Tests/UseSWIG/UseTargetINCLUDE_DIRECTORIES" ${build_generator_args} - --build-project TestModuleVersion2 + --build-project TestUseTargetINCLUDE_DIRECTORIES --build-options ${build_options} ) + + +add_test(NAME UseSWIG.ModuleName COMMAND + ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION> + --build-and-test + "${CMake_SOURCE_DIR}/Tests/UseSWIG/ModuleName" + "${CMake_BINARY_DIR}/Tests/UseSWIG/ModuleName" + ${build_generator_args} + --build-project TestModuleName + --build-options ${build_options} + --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION> + ) diff --git a/Tests/UseSWIG/ModuleName/CMakeLists.txt b/Tests/UseSWIG/ModuleName/CMakeLists.txt new file mode 100644 index 0000000000..de6388335b --- /dev/null +++ b/Tests/UseSWIG/ModuleName/CMakeLists.txt @@ -0,0 +1,42 @@ +cmake_minimum_required(VERSION 3.1...3.14) + +project(TestModuleName CXX) + +include(CTest) + +find_package(SWIG REQUIRED) +cmake_policy(SET CMP0086 NEW) +include(${SWIG_USE_FILE}) + +find_package(Python2 REQUIRED COMPONENTS Interpreter Development) + +# Path separator +if (WIN32) + set (PS "$<SEMICOLON>") +else() + set (PS ":") +endif() + +unset(CMAKE_SWIG_FLAGS) + +set_property(SOURCE "example.i" PROPERTY CPLUSPLUS ON) +set_property(SOURCE "example.i" PROPERTY COMPILE_OPTIONS -includeall) +set_property(SOURCE "example.i" PROPERTY SWIG_MODULE_NAME new_example) + +swig_add_library(example1 + LANGUAGE python + OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/example1" + SOURCES example.i ../example.cxx) +set_target_properties (example1 PROPERTIES + INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/.." + SWIG_USE_TARGET_INCLUDE_DIRECTORIES TRUE + OUTPUT_NAME new_example + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/example1" + ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/example1" + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/example1") +target_link_libraries(example1 PRIVATE Python2::Python) + + +add_test (NAME ModuleName.example1 + COMMAND "${CMAKE_COMMAND}" -E env "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}/Python2${PS}$<TARGET_FILE_DIR:example1>" + "${Python2_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/runme.py") diff --git a/Tests/UseSWIG/ModuleName/example.i b/Tests/UseSWIG/ModuleName/example.i new file mode 100644 index 0000000000..fbdf7249fd --- /dev/null +++ b/Tests/UseSWIG/ModuleName/example.i @@ -0,0 +1,9 @@ +/* File : example.i */ +%module example + +%{ +#include "example.h" +%} + +/* Let's just grab the original header file here */ +%include "example.h" diff --git a/Tests/UseSWIG/ModuleName/runme.py b/Tests/UseSWIG/ModuleName/runme.py new file mode 100644 index 0000000000..c37e4a7368 --- /dev/null +++ b/Tests/UseSWIG/ModuleName/runme.py @@ -0,0 +1,52 @@ +# file: runme.py + +# This file illustrates the shadow-class C++ interface generated +# by SWIG. + +from __future__ import print_function + +import new_example + +# ----- Object creation ----- + +print ("Creating some objects:") +c = new_example.Circle(10) +print (" Created circle", c) +s = new_example.Square(10) +print (" Created square", s) + +# ----- Access a static member ----- + +print ("\nA total of", new_example.cvar.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 + +print ("\nHere is their current position:") +print (" Circle = (%f, %f)" % (c.x,c.y)) +print (" Square = (%f, %f)" % (s.x,s.y)) + +# ----- Call some methods ----- + +print ("\nHere are some properties of the shapes:") +for o in [c,s]: + print (" ", o) + print (" area = ", o.area()) + print (" perimeter = ", o.perimeter()) + +print ("\nGuess I'll clean up now") + +# Note: this invokes the virtual destructor +del c +del s + +s = 3 +print (new_example.cvar.Shape_nshapes,"shapes remain") +print ("Goodbye") |