mirror of
https://github.com/Kitware/CMake.git
synced 2025-12-30 18:29:37 -06:00
Merge topic 'enhanced-UseSWIG-Module'
0bef9eb4UseSWIG: modernize moduled6048bd1UseSWIG: Re-work test framework Acked-by: Kitware Robot <kwrobot@kitware.com> Merge-request: !1707
This commit is contained in:
6
Help/release/dev/UseSWIG-modernize-module.rst
Normal file
6
Help/release/dev/UseSWIG-modernize-module.rst
Normal file
@@ -0,0 +1,6 @@
|
||||
UseSWIG-modernize-module
|
||||
------------------------
|
||||
|
||||
* The :module:`UseSWIG` gained a whole refresh and is now more consistent with
|
||||
standard CMake commands to generate libraries and is fully configurable through
|
||||
properties.
|
||||
@@ -5,7 +5,7 @@
|
||||
UseSWIG
|
||||
-------
|
||||
|
||||
Defines the following macros for use with SWIG:
|
||||
Defines the following command for use with SWIG:
|
||||
|
||||
.. command:: swig_add_library
|
||||
|
||||
@@ -14,20 +14,47 @@ Defines the following macros for use with SWIG:
|
||||
swig_add_library(<name>
|
||||
[TYPE <SHARED|MODULE|STATIC|USE_BUILD_SHARED_LIBS>]
|
||||
LANGUAGE <language>
|
||||
[NO_PROXY]
|
||||
[OUTPUT_DIR <directory>]
|
||||
[OUTFILE_DIR <directory>]
|
||||
SOURCES <file>...
|
||||
)
|
||||
)
|
||||
|
||||
The variable ``SWIG_MODULE_<name>_REAL_NAME`` will be set to the name
|
||||
of the swig module target library.
|
||||
Targets created with command ``swig_add_library`` have the same capabilities as targets
|
||||
created with command :command:`add_library`, so can be used with any command accepting a target
|
||||
especially command :command:`target_link_libraries`.
|
||||
|
||||
.. command:: swig_link_libraries
|
||||
The arguments are:
|
||||
|
||||
Link libraries to swig module::
|
||||
``TYPE``
|
||||
``SHARED``, ``MODULE`` and ``STATIC`` have same semantic as command :command:`add_library`.
|
||||
if ``USE_BUILD_SHARED_LIBS`` is specified, library type will be ``STATIC`` or ``SHARED``
|
||||
based on whether the current value of the variable :variable:`BUILD_SHARED_LIBS` is ``ON``.
|
||||
If none is specified, ``MODULE`` will be used.
|
||||
|
||||
swig_link_libraries(<name> [ libraries ])
|
||||
``LANGUAGE``
|
||||
Specify the target language.
|
||||
|
||||
Source file properties on module files can be set before the invocation
|
||||
of the ``swig_add_library`` macro to specify special behavior of SWIG:
|
||||
``NO_PROXY``
|
||||
Prevent the generation of the wrapper layer (swig ``-noproxy`` option).
|
||||
|
||||
``OUTPUT_DIR``
|
||||
Specify where to write the language specific files (swig ``-outdir`` option).
|
||||
If not specified, variable ``CMAKE_SWIG_OUTDIR`` will be used. If none is specified,
|
||||
:variable:`CMAKE_CURRENT_BINARY_DIR` is used.
|
||||
|
||||
``OUTFILE_DIR``
|
||||
Specify an output directory name where the generated source file will be placed
|
||||
(swig -o option). If not specified, variable ``SWIG_OUTFILE_DIR`` will be used.
|
||||
If none is specified, option ``OUTPUT_DIR`` or variable ``CMAKE_SWIG_OUTDIR`` is used.
|
||||
|
||||
``SOURCES``
|
||||
List of sources for the library. Files with extension ``.i`` will be identified as sources
|
||||
for ``SWIG`` tool. Other files will be handled in the standard way.
|
||||
|
||||
Source files properties on module files **must** be set before the invocation
|
||||
of the ``swig_add_library`` command to specify special behavior of SWIG and ensure
|
||||
generated files will receive required settings.
|
||||
|
||||
``CPLUSPLUS``
|
||||
Call SWIG in c++ mode. For example:
|
||||
@@ -37,9 +64,17 @@ of the ``swig_add_library`` macro to specify special behavior of SWIG:
|
||||
set_property(SOURCE mymod.i PROPERTY CPLUSPLUS ON)
|
||||
swig_add_library(mymod LANGUAGE python SOURCES mymod.i)
|
||||
|
||||
``SWIG_FLAGS``
|
||||
Add custom flags to the SWIG executable.
|
||||
``INCLUDE_DIRECTORIES``, ``COMPILE_DEFINITIONS`` and ``COMPILE_OPTIONS``
|
||||
Add custom flags to SWIG compiler and have same semantic as properties
|
||||
:prop_sf:`INCLUDE_DIRECTORIES`, :prop_sf:`COMPILE_DEFINITIONS` and :prop_sf:`COMPILE_OPTIONS`.
|
||||
|
||||
``GENERATED_INCLUDE_DIRECTORIES``, ``GENERATED_COMPILE_DEFINITIONS`` and ``GENERATED_COMPILE_OPTIONS``
|
||||
Add custom flags to the C/C++ generated source. They will fill, respectively,
|
||||
properties :prop_sf:`INCLUDE_DIRECTORIES`, :prop_sf:`COMPILE_DEFINITIONS` and
|
||||
:prop_sf:`COMPILE_OPTIONS` of generated C/C++ file.
|
||||
|
||||
``DEPENDS``
|
||||
Specify additional dependencies to the source file.
|
||||
|
||||
``SWIG_MODULE_NAME``
|
||||
Specify the actual import name of the module in the target language.
|
||||
@@ -50,6 +85,34 @@ of the ``swig_add_library`` macro to specify special behavior of SWIG:
|
||||
|
||||
set_property(SOURCE mymod.i PROPERTY SWIG_MODULE_NAME mymod_realname)
|
||||
|
||||
Target library properties can be set to apply same configuration to all SWIG input files.
|
||||
|
||||
``SWIG_INCLUDE_DIRECTORIES``, ``SWIG_COMPILE_DEFINITIONS`` and ``SWIG_COMPILE_OPTIONS``
|
||||
These properties will be applied to all SWIG input files and have same semantic as
|
||||
target properties :prop_tgt:`INCLUDE_DIRECTORIES`, :prop_tgt:`COMPILE_DEFINITIONS` and
|
||||
:prop_tgt:`COMPILE_OPTIONS`.
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
swig_add_library(mymod LANGUAGE python SOURCES mymod.i)
|
||||
set_property(TARGET mymod PROPERTY SWIG_COMPILE_DEFINITIONS MY_DEF1 MY_DEF2)
|
||||
set_property(TARGET mymod PROPERTY SWIG_COMPILE_OPTIONS -bla -blb)
|
||||
|
||||
``SWIG_GENERATED_INCLUDE_DIRECTORIES``, ``SWIG_GENERATED_COMPILE_DEFINITIONS`` and ``SWIG_GENERATED_COMPILE_OPTIONS``
|
||||
These properties will populate, respectively, properties :prop_sf:`INCLUDE_DIRECTORIES`,
|
||||
:prop_sf:`COMPILE_DEFINITIONS` and :prop_sf:`COMPILE_FLAGS` of all generated C/C++ files.
|
||||
|
||||
``SWIG_DEPENDS``
|
||||
Add dependencies to all SWIG input files.
|
||||
|
||||
``SWIG_SUPPORT_FILES``
|
||||
This output property list of wrapper files generated during SWIG compilation.
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
swig_add_library(mymod LANGUAGE python SOURCES mymod.i)
|
||||
get_property(support_files TARGET mymod PROPERTY SWIG_SUPPORT_FILES)
|
||||
|
||||
Some variables can be set to specify special behavior of SWIG:
|
||||
|
||||
``CMAKE_SWIG_FLAGS``
|
||||
@@ -66,34 +129,56 @@ Some variables can be set to specify special behavior of SWIG:
|
||||
Specify extra dependencies for the generated module for ``<name>``.
|
||||
#]=======================================================================]
|
||||
|
||||
|
||||
cmake_policy (VERSION 3.11)
|
||||
|
||||
set(SWIG_CXX_EXTENSION "cxx")
|
||||
set(SWIG_EXTRA_LIBRARIES "")
|
||||
|
||||
set(SWIG_PYTHON_EXTRA_FILE_EXTENSIONS ".py")
|
||||
set(SWIG_JAVA_EXTRA_FILE_EXTENSIONS ".java" "JNI.java")
|
||||
|
||||
##
|
||||
## PRIVATE functions
|
||||
##
|
||||
function (__SWIG_COMPUTE_TIMESTAMP name language infile workingdir __timestamp)
|
||||
get_filename_component(filename "${infile}" NAME_WE)
|
||||
set(${__timestamp}
|
||||
"${workingdir}/${filename}${language}.stamp" PARENT_SCOPE)
|
||||
# get_filename_component(filename "${infile}" ABSOLUTE)
|
||||
# string(UUID uuid NAMESPACE 9735D882-D2F8-4E1D-88C9-A0A4F1F6ECA4
|
||||
# NAME ${name}-${language}-${filename} TYPE SHA1)
|
||||
# set(${__timestamp} "${workingdir}/${uuid}.stamp" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
#
|
||||
# For given swig module initialize variables associated with it
|
||||
#
|
||||
macro(SWIG_MODULE_INITIALIZE name language)
|
||||
string(TOUPPER "${language}" swig_uppercase_language)
|
||||
string(TOLOWER "${language}" swig_lowercase_language)
|
||||
set(SWIG_MODULE_${name}_LANGUAGE "${swig_uppercase_language}")
|
||||
set(SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG "${swig_lowercase_language}")
|
||||
string(TOUPPER "${language}" SWIG_MODULE_${name}_LANGUAGE)
|
||||
string(TOLOWER "${language}" SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG)
|
||||
|
||||
set(SWIG_MODULE_${name}_REAL_NAME "${name}")
|
||||
if (";${CMAKE_SWIG_FLAGS};" MATCHES ";-noproxy;")
|
||||
set(SWIG_MODULE_${name}_NAME "${name}")
|
||||
set(SWIG_MODULE_${name}_EXTRA_FLAGS)
|
||||
if (NOT DEFINED SWIG_MODULE_${name}_NOPROXY)
|
||||
set (SWIG_MODULE_${name}_NOPROXY FALSE)
|
||||
endif()
|
||||
if ("-noproxy" IN_LIST CMAKE_SWIG_FLAGS)
|
||||
set (SWIG_MODULE_${name}_NOPROXY TRUE)
|
||||
endif ()
|
||||
if("x${SWIG_MODULE_${name}_LANGUAGE}" STREQUAL "xUNKNOWN")
|
||||
|
||||
if (SWIG_MODULE_${name}_NOPROXY AND NOT "-noproxy" IN_LIST CMAKE_SWIG_FLAGS)
|
||||
list (APPEND SWIG_MODULE_${name}_EXTRA_FLAGS "-noproxy")
|
||||
endif()
|
||||
if(SWIG_MODULE_${name}_LANGUAGE STREQUAL "UNKNOWN")
|
||||
message(FATAL_ERROR "SWIG Error: Language \"${language}\" not found")
|
||||
elseif("x${SWIG_MODULE_${name}_LANGUAGE}" STREQUAL "xPYTHON" AND NOT SWIG_MODULE_${name}_NOPROXY)
|
||||
elseif(SWIG_MODULE_${name}_LANGUAGE STREQUAL "PYTHON" AND NOT SWIG_MODULE_${name}_NOPROXY)
|
||||
# swig will produce a module.py containing an 'import _modulename' statement,
|
||||
# which implies having a corresponding _modulename.so (*NIX), _modulename.pyd (Win32),
|
||||
# unless the -noproxy flag is used
|
||||
set(SWIG_MODULE_${name}_REAL_NAME "_${name}")
|
||||
elseif("x${SWIG_MODULE_${name}_LANGUAGE}" STREQUAL "xPERL")
|
||||
set(SWIG_MODULE_${name}_EXTRA_FLAGS "-shadow")
|
||||
set(SWIG_MODULE_${name}_NAME "_${name}")
|
||||
elseif(SWIG_MODULE_${name}_LANGUAGE STREQUAL "PERL")
|
||||
list(APPEND SWIG_MODULE_${name}_EXTRA_FLAGS "-shadow")
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
@@ -102,79 +187,108 @@ endmacro()
|
||||
# will be generated. This is internal swig macro.
|
||||
#
|
||||
|
||||
macro(SWIG_GET_EXTRA_OUTPUT_FILES language outfiles generatedpath infile)
|
||||
set(${outfiles} "")
|
||||
get_source_file_property(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename
|
||||
${infile} SWIG_MODULE_NAME)
|
||||
if(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename STREQUAL "NOTFOUND")
|
||||
function(SWIG_GET_EXTRA_OUTPUT_FILES language outfiles generatedpath infile)
|
||||
set(files)
|
||||
get_source_file_property(module_basename
|
||||
"${infile}" SWIG_MODULE_NAME)
|
||||
if(NOT swig_module_basename)
|
||||
|
||||
# try to get module name from "%module foo" syntax
|
||||
if ( EXISTS ${infile} )
|
||||
file ( STRINGS ${infile} _MODULE_NAME REGEX "[ ]*%module[ ]*[a-zA-Z0-9_]+.*" )
|
||||
if ( EXISTS "${infile}" )
|
||||
file ( STRINGS "${infile}" module_basename REGEX "[ ]*%module[ ]*[a-zA-Z0-9_]+.*" )
|
||||
endif ()
|
||||
if ( _MODULE_NAME )
|
||||
string ( REGEX REPLACE "[ ]*%module[ ]*([a-zA-Z0-9_]+).*" "\\1" _MODULE_NAME "${_MODULE_NAME}" )
|
||||
set(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename "${_MODULE_NAME}")
|
||||
if ( module_basename )
|
||||
string ( REGEX REPLACE "[ ]*%module[ ]*([a-zA-Z0-9_]+).*" "\\1" module_basename "${module_basename}" )
|
||||
|
||||
else ()
|
||||
# try to get module name from "%module (options=...) foo" syntax
|
||||
if ( EXISTS ${infile} )
|
||||
file ( STRINGS ${infile} _MODULE_NAME REGEX "[ ]*%module[ ]*\\(.*\\)[ ]*[a-zA-Z0-9_]+.*" )
|
||||
if ( EXISTS "${infile}" )
|
||||
file ( STRINGS "${infile}" module_basename REGEX "[ ]*%module[ ]*\\(.*\\)[ ]*[a-zA-Z0-9_]+.*" )
|
||||
endif ()
|
||||
if ( _MODULE_NAME )
|
||||
string ( REGEX REPLACE "[ ]*%module[ ]*\\(.*\\)[ ]*([a-zA-Z0-9_]+).*" "\\1" _MODULE_NAME "${_MODULE_NAME}" )
|
||||
set(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename "${_MODULE_NAME}")
|
||||
if ( module_basename )
|
||||
string ( REGEX REPLACE "[ ]*%module[ ]*\\(.*\\)[ ]*([a-zA-Z0-9_]+).*" "\\1" module_basename "${module_basename}" )
|
||||
|
||||
else ()
|
||||
# fallback to file basename
|
||||
get_filename_component(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename ${infile} NAME_WE)
|
||||
get_filename_component(module_basename "${infile}" NAME_WE)
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
endif()
|
||||
foreach(it ${SWIG_${language}_EXTRA_FILE_EXTENSIONS})
|
||||
set(extra_file "${generatedpath}/${SWIG_GET_EXTRA_OUTPUT_FILES_module_basename}${it}")
|
||||
list(APPEND ${outfiles} ${extra_file})
|
||||
# Treat extra outputs as plain files regardless of language.
|
||||
set_property(SOURCE "${extra_file}" PROPERTY LANGUAGE "")
|
||||
set(extra_file "${generatedpath}/${module_basename}${it}")
|
||||
list(APPEND files "${extra_file}")
|
||||
endforeach()
|
||||
endmacro()
|
||||
# Treat extra outputs as plain files regardless of language.
|
||||
set_source_files_properties(${files} PROPERTIES LANGUAGE "")
|
||||
|
||||
set (${outfiles} ${files} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
#
|
||||
# Take swig (*.i) file and add proper custom commands for it
|
||||
#
|
||||
macro(SWIG_ADD_SOURCE_TO_MODULE name outfiles infile)
|
||||
set(swig_full_infile ${infile})
|
||||
function(SWIG_ADD_SOURCE_TO_MODULE name outfiles infile)
|
||||
get_filename_component(swig_source_file_name_we "${infile}" NAME_WE)
|
||||
get_source_file_property(swig_source_file_generated ${infile} GENERATED)
|
||||
get_source_file_property(swig_source_file_cplusplus ${infile} CPLUSPLUS)
|
||||
get_source_file_property(swig_source_file_flags ${infile} SWIG_FLAGS)
|
||||
if("${swig_source_file_flags}" STREQUAL "NOTFOUND")
|
||||
set(swig_source_file_flags "")
|
||||
endif()
|
||||
get_filename_component(swig_source_file_fullname "${infile}" ABSOLUTE)
|
||||
get_source_file_property(swig_source_file_cplusplus "${infile}" CPLUSPLUS)
|
||||
|
||||
# If CMAKE_SWIG_OUTDIR was specified then pass it to -outdir
|
||||
if(CMAKE_SWIG_OUTDIR)
|
||||
set(swig_outdir ${CMAKE_SWIG_OUTDIR})
|
||||
set(outdir ${CMAKE_SWIG_OUTDIR})
|
||||
else()
|
||||
set(swig_outdir ${CMAKE_CURRENT_BINARY_DIR})
|
||||
set(outdir ${CMAKE_CURRENT_BINARY_DIR})
|
||||
endif()
|
||||
|
||||
if(SWIG_OUTFILE_DIR)
|
||||
set(swig_outfile_dir ${SWIG_OUTFILE_DIR})
|
||||
set(outfiledir ${SWIG_OUTFILE_DIR})
|
||||
else()
|
||||
set(swig_outfile_dir ${swig_outdir})
|
||||
set(outfiledir ${outdir})
|
||||
endif()
|
||||
|
||||
if(SWIG_WORKING_DIR)
|
||||
set (workingdir "${SWIG_WORKING_DIR}")
|
||||
else()
|
||||
set(workingdir "${outdir}")
|
||||
endif()
|
||||
|
||||
set (swig_source_file_flags ${CMAKE_SWIG_FLAGS})
|
||||
# handle various swig compile flags properties
|
||||
get_source_file_property (include_directories "${infile}" INCLUDE_DIRECTORIES)
|
||||
if (include_directories)
|
||||
list (APPEND swig_source_file_flags "-I$<JOIN:${include_directories},$<SEMICOLON>-I>")
|
||||
endif()
|
||||
set (property "$<TARGET_PROPERTY:${name},SWIG_INCLUDE_DIRECTORIES>")
|
||||
list (APPEND swig_source_file_flags "$<$<BOOL:${property}>:-I$<JOIN:${property},$<SEMICOLON>-I>>")
|
||||
|
||||
set (property "$<TARGET_PROPERTY:${name},SWIG_COMPILE_DEFINITIONS>")
|
||||
list (APPEND swig_source_file_flags "$<$<BOOL:${property}>:-D$<JOIN:${property},$<SEMICOLON>-D>>")
|
||||
get_source_file_property (compile_definitions "${infile}" COMPILE_DEFINITIONS)
|
||||
if (compile_definitions)
|
||||
list (APPEND swig_source_file_flags "-D$<JOIN:${compile_definitions},$<SEMICOLON>-D>")
|
||||
endif()
|
||||
|
||||
list (APPEND swig_source_file_flags "$<TARGET_PROPERTY:${name},SWIG_COMPILE_OPTIONS>")
|
||||
get_source_file_property (compile_options "${infile}" COMPILE_OPTIONS)
|
||||
if (compile_options)
|
||||
list (APPEND swig_source_file_flags ${compile_options})
|
||||
endif()
|
||||
|
||||
# legacy support
|
||||
get_source_file_property (swig_flags "${infile}" SWIG_FLAGS)
|
||||
if (swig_flags)
|
||||
list (APPEND swig_source_file_flags ${swig_flags})
|
||||
endif()
|
||||
|
||||
get_filename_component(swig_source_file_fullname "${infile}" ABSOLUTE)
|
||||
|
||||
if (NOT SWIG_MODULE_${name}_NOPROXY)
|
||||
SWIG_GET_EXTRA_OUTPUT_FILES(${SWIG_MODULE_${name}_LANGUAGE}
|
||||
swig_extra_generated_files
|
||||
"${swig_outdir}"
|
||||
"${outdir}"
|
||||
"${swig_source_file_fullname}")
|
||||
endif()
|
||||
set(swig_generated_file_fullname
|
||||
"${swig_outfile_dir}/${swig_source_file_name_we}")
|
||||
"${outfiledir}/${swig_source_file_name_we}")
|
||||
# add the language into the name of the file (i.e. TCL_wrap)
|
||||
# this allows for the same .i file to be wrapped into different languages
|
||||
string(APPEND swig_generated_file_fullname
|
||||
@@ -188,45 +302,47 @@ macro(SWIG_ADD_SOURCE_TO_MODULE name outfiles infile)
|
||||
".c")
|
||||
endif()
|
||||
|
||||
#message("Full path to source file: ${swig_source_file_fullname}")
|
||||
#message("Full path to the output file: ${swig_generated_file_fullname}")
|
||||
get_directory_property(cmake_include_directories INCLUDE_DIRECTORIES)
|
||||
list(REMOVE_DUPLICATES cmake_include_directories)
|
||||
set(swig_include_dirs)
|
||||
foreach(it ${cmake_include_directories})
|
||||
set(swig_include_dirs ${swig_include_dirs} "-I${it}")
|
||||
endforeach()
|
||||
get_directory_property (cmake_include_directories INCLUDE_DIRECTORIES)
|
||||
list (REMOVE_DUPLICATES cmake_include_directories)
|
||||
set (swig_include_dirs)
|
||||
if (cmake_include_directories)
|
||||
set (swig_include_dirs "-I$<JOIN:${cmake_include_directories},$<SEMICOLON>-I>")
|
||||
endif()
|
||||
|
||||
set(swig_special_flags)
|
||||
# default is c, so add c++ flag if it is c++
|
||||
if(swig_source_file_cplusplus)
|
||||
set(swig_special_flags ${swig_special_flags} "-c++")
|
||||
list (APPEND swig_special_flags "-c++")
|
||||
endif()
|
||||
if("x${SWIG_MODULE_${name}_LANGUAGE}" STREQUAL "xCSHARP")
|
||||
if(NOT ";${swig_source_file_flags};${CMAKE_SWIG_FLAGS};" MATCHES ";-dllimport;")
|
||||
|
||||
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))
|
||||
# This makes sure that the name used in the generated DllImport
|
||||
# matches the library name created by CMake
|
||||
set(SWIG_MODULE_${name}_EXTRA_FLAGS "-dllimport;${name}")
|
||||
list (APPEND SWIG_MODULE_${name}_EXTRA_FLAGS "-dllimport" "${name}")
|
||||
endif()
|
||||
endif()
|
||||
set(swig_extra_flags)
|
||||
if(SWIG_MODULE_${name}_EXTRA_FLAGS)
|
||||
set(swig_extra_flags ${swig_extra_flags} ${SWIG_MODULE_${name}_EXTRA_FLAGS})
|
||||
list (APPEND swig_extra_flags ${SWIG_MODULE_${name}_EXTRA_FLAGS})
|
||||
|
||||
# dependencies
|
||||
set (swig_dependencies ${SWIG_MODULE_${name}_EXTRA_DEPS} $<TARGET_PROPERTY:${name},SWIG_DEPENDS>)
|
||||
get_source_file_property(file_depends "${infile}" DEPENDS)
|
||||
if (file_depends)
|
||||
list (APPEND swig_dependencies ${file_depends})
|
||||
endif()
|
||||
|
||||
# IMPLICIT_DEPENDS below can not handle situations where a dependent file is
|
||||
# removed. We need an extra step with timestamp and custom target, see #16830
|
||||
# As this is needed only for Makefile generator do it conditionally
|
||||
if(CMAKE_GENERATOR MATCHES "Make")
|
||||
get_filename_component(swig_generated_timestamp
|
||||
"${swig_generated_file_fullname}" NAME_WE)
|
||||
set(swig_gen_target gen_${name}_${swig_generated_timestamp})
|
||||
set(swig_generated_timestamp
|
||||
"${swig_outdir}/${swig_generated_timestamp}.stamp")
|
||||
set(swig_custom_output ${swig_generated_timestamp})
|
||||
__swig_compute_timestamp(${name} ${SWIG_MODULE_${name}_LANGUAGE}
|
||||
"${infile}" "${workingdir}" swig_generated_timestamp)
|
||||
set(swig_custom_output "${swig_generated_timestamp}")
|
||||
set(swig_custom_products
|
||||
BYPRODUCTS "${swig_generated_file_fullname}" ${swig_extra_generated_files})
|
||||
set(swig_timestamp_command
|
||||
COMMAND ${CMAKE_COMMAND} -E touch ${swig_generated_timestamp})
|
||||
COMMAND ${CMAKE_COMMAND} -E touch "${swig_generated_timestamp}")
|
||||
else()
|
||||
set(swig_custom_output
|
||||
"${swig_generated_file_fullname}" ${swig_extra_generated_files})
|
||||
@@ -236,34 +352,41 @@ macro(SWIG_ADD_SOURCE_TO_MODULE name outfiles infile)
|
||||
add_custom_command(
|
||||
OUTPUT ${swig_custom_output}
|
||||
${swig_custom_products}
|
||||
# Let's create the ${swig_outdir} at execution time, in case dir contains $(OutDir)
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory ${swig_outdir}
|
||||
# Let's create the ${outdir} at execution time, in case dir contains $(OutDir)
|
||||
COMMAND "${CMAKE_COMMAND}" -E make_directory ${outdir} ${outfiledir}
|
||||
${swig_timestamp_command}
|
||||
COMMAND "${SWIG_EXECUTABLE}"
|
||||
ARGS "-${SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG}"
|
||||
${swig_source_file_flags}
|
||||
${CMAKE_SWIG_FLAGS}
|
||||
-outdir ${swig_outdir}
|
||||
"-${SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG}"
|
||||
"${swig_source_file_flags}"
|
||||
-outdir "${outdir}"
|
||||
${swig_special_flags}
|
||||
${swig_extra_flags}
|
||||
${swig_include_dirs}
|
||||
"${swig_include_dirs}"
|
||||
-o "${swig_generated_file_fullname}"
|
||||
"${swig_source_file_fullname}"
|
||||
MAIN_DEPENDENCY "${swig_source_file_fullname}"
|
||||
DEPENDS ${SWIG_MODULE_${name}_EXTRA_DEPS}
|
||||
DEPENDS ${swig_dependencies}
|
||||
IMPLICIT_DEPENDS CXX "${swig_source_file_fullname}"
|
||||
COMMENT "Swig source")
|
||||
if(CMAKE_GENERATOR MATCHES "Make")
|
||||
add_custom_target(${swig_gen_target} DEPENDS ${swig_generated_timestamp})
|
||||
endif()
|
||||
unset(swig_generated_timestamp)
|
||||
unset(swig_custom_output)
|
||||
unset(swig_custom_products)
|
||||
unset(swig_timestamp_command)
|
||||
COMMENT "Swig source"
|
||||
COMMAND_EXPAND_LISTS)
|
||||
set_source_files_properties("${swig_generated_file_fullname}" ${swig_extra_generated_files}
|
||||
PROPERTIES GENERATED 1)
|
||||
set(${outfiles} "${swig_generated_file_fullname}" ${swig_extra_generated_files})
|
||||
endmacro()
|
||||
|
||||
## add all properties for generated file to various properties
|
||||
get_property (include_directories SOURCE "${infile}" PROPERTY GENERATED_INCLUDE_DIRECTORIES)
|
||||
set_property (SOURCE "${swig_generated_file_fullname}" PROPERTY INCLUDE_DIRECTORIES ${include_directories} $<TARGET_PROPERTY:${name},SWIG_GENERATED_INCLUDE_DIRECTORIES>)
|
||||
|
||||
get_property (compile_definitions SOURCE "${infile}" PROPERTY GENERATED_COMPILE_DEFINITIONS)
|
||||
set_property (SOURCE "${swig_generated_file_fullname}" PROPERTY COMPILE_DEFINITIONS $<TARGET_PROPERTY:${name},SWIG_GENERATED_COMPILE_DEFINITIONS> ${compile_definitions})
|
||||
|
||||
get_property (compile_options SOURCE "${infile}" PROPERTY GENERATED_COMPILE_OPTIONS)
|
||||
set_property (SOURCE "${swig_generated_file_fullname}" PROPERTY COMPILE_OPTIONS $<TARGET_PROPERTY:${name},SWIG_GENERATED_COMPILE_OPTIONS> ${compile_options})
|
||||
|
||||
set(${outfiles} "${swig_generated_file_fullname}" ${swig_extra_generated_files} PARENT_SCOPE)
|
||||
|
||||
# legacy support
|
||||
set (swig_generated_file_fullname "${swig_generated_file_fullname}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
#
|
||||
# Create Swig module
|
||||
@@ -277,13 +400,26 @@ macro(SWIG_ADD_MODULE name language)
|
||||
endmacro()
|
||||
|
||||
|
||||
macro(SWIG_ADD_LIBRARY name)
|
||||
set(options "")
|
||||
function(SWIG_ADD_LIBRARY name)
|
||||
set(options NO_PROXY)
|
||||
set(oneValueArgs LANGUAGE
|
||||
TYPE)
|
||||
TYPE
|
||||
OUTPUT_DIR
|
||||
OUTFILE_DIR)
|
||||
set(multiValueArgs SOURCES)
|
||||
cmake_parse_arguments(_SAM "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
||||
|
||||
if (TARGET ${name})
|
||||
# a target with same name is already defined.
|
||||
# call NOW add_library command to raise the most useful error message
|
||||
add_library(${name})
|
||||
return()
|
||||
endif()
|
||||
|
||||
if (_SAM_UNPARSED_ARGUMENTS)
|
||||
message(FATAL_ERROR "SWIG_ADD_LIBRARY: ${_SAM_UNPARSED_ARGUMENTS}: unexpected arguments")
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED _SAM_LANGUAGE)
|
||||
message(FATAL_ERROR "SWIG_ADD_LIBRARY: Missing LANGUAGE argument")
|
||||
endif()
|
||||
@@ -294,50 +430,83 @@ macro(SWIG_ADD_LIBRARY name)
|
||||
|
||||
if(NOT DEFINED _SAM_TYPE)
|
||||
set(_SAM_TYPE MODULE)
|
||||
elseif("${_SAM_TYPE}" STREQUAL "USE_BUILD_SHARED_LIBS")
|
||||
elseif(_SAM_TYPE STREQUAL "USE_BUILD_SHARED_LIBS")
|
||||
unset(_SAM_TYPE)
|
||||
endif()
|
||||
|
||||
set (workingdir "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${name}.dir")
|
||||
# set special variable to pass extra information to command SWIG_ADD_SOURCE_TO_MODULE
|
||||
# which cannot be changed due to legacy compatibility
|
||||
set (SWIG_WORKING_DIR "${workingdir}")
|
||||
|
||||
set (outputdir "${_SAM_OUTPUT_DIR}")
|
||||
if (NOT _SAM_OUTPUT_DIR)
|
||||
if (CMAKE_SWIG_OUTDIR)
|
||||
set (outputdir "${CMAKE_SWIG_OUTDIR}")
|
||||
else()
|
||||
set (outputdir "${CMAKE_CURRENT_BINARY_DIR}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set (outfiledir "${_SAM_OUTFILE_DIR}")
|
||||
if(NOT _SAM_OUTFILE_DIR)
|
||||
if (SWIG_OUTFILE_DIR)
|
||||
set (outfiledir "${SWIG_OUTFILE_DIR}")
|
||||
else()
|
||||
if (_SAM_OUTPUT_DIR OR CMAKE_SWIG_OUTDIR)
|
||||
set (outfiledir "${outputdir}")
|
||||
else()
|
||||
set (outfiledir "${workingdir}")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
# set again, locally, predefined variables to ensure compatibility
|
||||
# with command SWIG_ADD_SOURCE_TO_MODULE
|
||||
set(CMAKE_SWIG_OUTDIR "${outputdir}")
|
||||
set(SWIG_OUTFILE_DIR "${outfiledir}")
|
||||
|
||||
set (SWIG_MODULE_${name}_NOPROXY ${_SAM_NO_PROXY})
|
||||
swig_module_initialize(${name} ${_SAM_LANGUAGE})
|
||||
|
||||
set(swig_dot_i_sources)
|
||||
set(swig_other_sources)
|
||||
foreach(it ${_SAM_SOURCES})
|
||||
if(${it} MATCHES "\\.i$")
|
||||
set(swig_dot_i_sources ${swig_dot_i_sources} "${it}")
|
||||
else()
|
||||
set(swig_other_sources ${swig_other_sources} "${it}")
|
||||
endif()
|
||||
endforeach()
|
||||
set(swig_dot_i_sources ${_SAM_SOURCES})
|
||||
list(FILTER swig_dot_i_sources INCLUDE REGEX "\\.i$")
|
||||
set(swig_other_sources ${_SAM_SOURCES})
|
||||
list(REMOVE_ITEM swig_other_sources ${swig_dot_i_sources})
|
||||
|
||||
set(swig_generated_sources)
|
||||
set(swig_generated_targets)
|
||||
foreach(it ${swig_dot_i_sources})
|
||||
SWIG_ADD_SOURCE_TO_MODULE(${name} swig_generated_source ${it})
|
||||
set(swig_generated_sources ${swig_generated_sources} "${swig_generated_source}")
|
||||
list(APPEND swig_generated_targets "${swig_gen_target}")
|
||||
set(swig_generated_timestamps)
|
||||
foreach(swig_it IN LISTS swig_dot_i_sources)
|
||||
SWIG_ADD_SOURCE_TO_MODULE(${name} swig_generated_source "${swig_it}")
|
||||
list (APPEND swig_generated_sources "${swig_generated_source}")
|
||||
if(CMAKE_GENERATOR MATCHES "Make")
|
||||
__swig_compute_timestamp(${name} ${SWIG_MODULE_${name}_LANGUAGE} "${swig_it}"
|
||||
"${workingdir}" swig_timestamp)
|
||||
list (APPEND swig_generated_timestamps "${swig_timestamp}")
|
||||
endif()
|
||||
endforeach()
|
||||
get_directory_property(swig_extra_clean_files ADDITIONAL_MAKE_CLEAN_FILES)
|
||||
set_directory_properties(PROPERTIES
|
||||
ADDITIONAL_MAKE_CLEAN_FILES "${swig_extra_clean_files};${swig_generated_sources}")
|
||||
add_library(${SWIG_MODULE_${name}_REAL_NAME}
|
||||
set_property (DIRECTORY APPEND PROPERTY
|
||||
ADDITIONAL_MAKE_CLEAN_FILES ${swig_generated_sources} ${swig_generated_timestamps})
|
||||
|
||||
add_library(${name}
|
||||
${_SAM_TYPE}
|
||||
${swig_generated_sources}
|
||||
${swig_other_sources})
|
||||
set_target_properties(${name} PROPERTIES OUTPUT_NAME "${SWIG_MODULE_${name}_NAME}")
|
||||
if(CMAKE_GENERATOR MATCHES "Make")
|
||||
# see IMPLICIT_DEPENDS above
|
||||
add_dependencies(${SWIG_MODULE_${name}_REAL_NAME} ${swig_generated_targets})
|
||||
add_custom_target(${name}_swig_compilation DEPENDS ${swig_generated_timestamps})
|
||||
add_dependencies(${name} ${name}_swig_compilation)
|
||||
endif()
|
||||
if("${_SAM_TYPE}" STREQUAL "MODULE")
|
||||
set_target_properties(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES NO_SONAME ON)
|
||||
if(_SAM_TYPE STREQUAL "MODULE")
|
||||
set_target_properties(${name} PROPERTIES NO_SONAME ON)
|
||||
endif()
|
||||
string(TOLOWER "${_SAM_LANGUAGE}" swig_lowercase_language)
|
||||
if ("${swig_lowercase_language}" STREQUAL "octave")
|
||||
set_target_properties(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES PREFIX "")
|
||||
set_target_properties(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES SUFFIX ".oct")
|
||||
elseif ("${swig_lowercase_language}" STREQUAL "go")
|
||||
set_target_properties(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES PREFIX "")
|
||||
elseif ("${swig_lowercase_language}" STREQUAL "java")
|
||||
if (swig_lowercase_language STREQUAL "octave")
|
||||
set_target_properties(${name} PROPERTIES PREFIX "")
|
||||
set_target_properties(${name} PROPERTIES SUFFIX ".oct")
|
||||
elseif (swig_lowercase_language STREQUAL "go")
|
||||
set_target_properties(${name} PROPERTIES PREFIX "")
|
||||
elseif (swig_lowercase_language STREQUAL "java")
|
||||
if (APPLE)
|
||||
# In java you want:
|
||||
# System.loadLibrary("LIBRARY");
|
||||
@@ -345,15 +514,15 @@ macro(SWIG_ADD_LIBRARY name)
|
||||
# MacOS : libLIBRARY.jnilib
|
||||
# Windows: LIBRARY.dll
|
||||
# Linux : libLIBRARY.so
|
||||
set_target_properties (${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES SUFFIX ".jnilib")
|
||||
set_target_properties (${name} PROPERTIES SUFFIX ".jnilib")
|
||||
endif ()
|
||||
elseif ("${swig_lowercase_language}" STREQUAL "lua")
|
||||
if("${_SAM_TYPE}" STREQUAL "MODULE")
|
||||
set_target_properties(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES PREFIX "")
|
||||
elseif (swig_lowercase_language STREQUAL "lua")
|
||||
if(_SAM_TYPE STREQUAL "MODULE")
|
||||
set_target_properties(${name} PROPERTIES PREFIX "")
|
||||
endif()
|
||||
elseif ("${swig_lowercase_language}" STREQUAL "python")
|
||||
elseif (swig_lowercase_language STREQUAL "python")
|
||||
# this is only needed for the python case where a _modulename.so is generated
|
||||
set_target_properties(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES PREFIX "")
|
||||
set_target_properties(${name} PROPERTIES PREFIX "")
|
||||
# Python extension modules on Windows must have the extension ".pyd"
|
||||
# instead of ".dll" as of Python 2.5. Older python versions do support
|
||||
# this suffix.
|
||||
@@ -363,34 +532,60 @@ macro(SWIG_ADD_LIBRARY name)
|
||||
# .pyd is now the only filename extension that will be searched for.
|
||||
# </quote>
|
||||
if(WIN32 AND NOT CYGWIN)
|
||||
set_target_properties(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES SUFFIX ".pyd")
|
||||
set_target_properties(${name} PROPERTIES SUFFIX ".pyd")
|
||||
endif()
|
||||
elseif ("${swig_lowercase_language}" STREQUAL "r")
|
||||
set_target_properties(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES PREFIX "")
|
||||
elseif ("${swig_lowercase_language}" STREQUAL "ruby")
|
||||
elseif (swig_lowercase_language STREQUAL "r")
|
||||
set_target_properties(${name} PROPERTIES PREFIX "")
|
||||
elseif (swig_lowercase_language STREQUAL "ruby")
|
||||
# In ruby you want:
|
||||
# require 'LIBRARY'
|
||||
# then ruby will look for a library whose name is platform dependent, namely
|
||||
# MacOS : LIBRARY.bundle
|
||||
# Windows: LIBRARY.dll
|
||||
# Linux : LIBRARY.so
|
||||
set_target_properties (${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES PREFIX "")
|
||||
set_target_properties (${name} PROPERTIES PREFIX "")
|
||||
if (APPLE)
|
||||
set_target_properties (${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES SUFFIX ".bundle")
|
||||
set_target_properties (${name} PROPERTIES SUFFIX ".bundle")
|
||||
endif ()
|
||||
elseif (swig_lowercase_language STREQUAL "perl")
|
||||
# assume empty prefix because we expect the module to be dynamically loaded
|
||||
set_target_properties (${name} PROPERTIES PREFIX "")
|
||||
if (APPLE)
|
||||
set_target_properties (${name} PROPERTIES SUFFIX ".dylib")
|
||||
endif ()
|
||||
else()
|
||||
# assume empty prefix because we expect the module to be dynamically loaded
|
||||
set_target_properties (${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES PREFIX "")
|
||||
set_target_properties (${name} PROPERTIES PREFIX "")
|
||||
endif ()
|
||||
endmacro()
|
||||
# target property SWIG_SUPPORT_FILES lists proxy support files
|
||||
if (NOT SWIG_MODULE_${name}_NOPROXY)
|
||||
string(TOUPPER "${_SAM_LANGUAGE}" swig_uppercase_language)
|
||||
foreach (swig_it IN LISTS SWIG_${swig_uppercase_language}_EXTRA_FILE_EXTENSIONS)
|
||||
set (swig_support_files ${swig_generated_sources})
|
||||
list (FILTER swig_support_files INCLUDE REGEX ".*${swig_it}$")
|
||||
set_property (TARGET ${name} APPEND PROPERTY SWIG_SUPPORT_FILES ${swig_support_files})
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
# to ensure legacy behavior, export some variables
|
||||
set (SWIG_MODULE_${name}_LANGUAGE "${SWIG_MODULE_${name}_LANGUAGE}" PARENT_SCOPE)
|
||||
set (SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG "${SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG}" PARENT_SCOPE)
|
||||
set (SWIG_MODULE_${name}_REAL_NAME "${name}" PARENT_SCOPE)
|
||||
set (SWIG_MODULE_${name}_NOPROXY "${SWIG_MODULE_${name}_NOPROXY}" PARENT_SCOPE)
|
||||
set (SWIG_MODULE_${name}_EXTRA_FLAGS "${SWIG_MODULE_${name}_EXTRA_FLAGS}" PARENT_SCOPE)
|
||||
# the last one is a bit crazy but it is documented, so...
|
||||
# NOTA: works as expected if only ONE input file is specified
|
||||
set (swig_generated_file_fullname "${swig_generated_file_fullname}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
#
|
||||
# Like TARGET_LINK_LIBRARIES but for swig modules
|
||||
#
|
||||
macro(SWIG_LINK_LIBRARIES name)
|
||||
function(SWIG_LINK_LIBRARIES name)
|
||||
message(DEPRECATION "SWIG_LINK_LIBRARIES is deprecated. Use TARGET_LINK_LIBRARIES instead.")
|
||||
if(SWIG_MODULE_${name}_REAL_NAME)
|
||||
target_link_libraries(${SWIG_MODULE_${name}_REAL_NAME} ${ARGN})
|
||||
target_link_libraries(${name} ${ARGN})
|
||||
else()
|
||||
message(SEND_ERROR "Cannot find Swig library \"${name}\".")
|
||||
endif()
|
||||
endmacro()
|
||||
endfunction()
|
||||
|
||||
@@ -358,6 +358,11 @@ if(CMake_TEST_FindMatlab)
|
||||
add_RunCMake_test(FindMatlab)
|
||||
endif()
|
||||
|
||||
# UseSWIG related tests
|
||||
if(CMake_TEST_UseSWIG)
|
||||
add_RunCMake_test(UseSWIG)
|
||||
endif()
|
||||
|
||||
add_executable(pseudo_emulator pseudo_emulator.c)
|
||||
add_executable(pseudo_emulator_custom_command pseudo_emulator_custom_command.c)
|
||||
add_RunCMake_test(CrosscompilingEmulator
|
||||
|
||||
68
Tests/RunCMake/UseSWIG/BasicConfiguration.cmake
Normal file
68
Tests/RunCMake/UseSWIG/BasicConfiguration.cmake
Normal file
@@ -0,0 +1,68 @@
|
||||
|
||||
find_package(SWIG REQUIRED)
|
||||
include(${SWIG_USE_FILE})
|
||||
|
||||
unset(SWIG_LANG_TYPE)
|
||||
unset(SWIG_LANG_INCLUDE_DIRECTORIES)
|
||||
unset(SWIG_LANG_DEFINITIONS)
|
||||
unset(SWIG_LANG_OPTIONS)
|
||||
unset(SWIG_LANG_LIBRARIES)
|
||||
|
||||
if(${language} MATCHES python)
|
||||
find_package(PythonInterp REQUIRED)
|
||||
find_package(PythonLibs REQUIRED)
|
||||
set(SWIG_LANG_INCLUDE_DIRECTORIES ${PYTHON_INCLUDE_PATH})
|
||||
set(SWIG_LANG_LIBRARIES ${PYTHON_LIBRARIES})
|
||||
endif()
|
||||
if(${language} MATCHES perl)
|
||||
find_package(Perl REQUIRED)
|
||||
find_package(PerlLibs REQUIRED)
|
||||
set(SWIG_LANG_INCLUDE_DIRECTORIES ${PERL_INCLUDE_PATH})
|
||||
separate_arguments(c_flags UNIX_COMMAND "${PERL_EXTRA_C_FLAGS}")
|
||||
set(SWIG_LANG_OPTIONS ${c_flags})
|
||||
set(SWIG_LANG_LIBRARIES ${PERL_LIBRARY})
|
||||
endif()
|
||||
if(${language} MATCHES tcl)
|
||||
find_package(TCL REQUIRED)
|
||||
set(SWIG_LANG_INCLUDE_DIRECTORIES ${TCL_INCLUDE_PATH})
|
||||
set(SWIG_LANG_LIBRARIES ${TCL_LIBRARY})
|
||||
endif()
|
||||
if(${language} MATCHES ruby)
|
||||
find_package(Ruby REQUIRED)
|
||||
set(SWIG_LANG_INCLUDE_DIRECTORIES ${RUBY_INCLUDE_PATH})
|
||||
set(SWIG_LANG_LIBRARIES ${RUBY_LIBRARY})
|
||||
endif()
|
||||
if(${language} MATCHES php4)
|
||||
find_package(PHP4 REQUIRED)
|
||||
set(SWIG_LANG_INCLUDE_DIRECTORIES ${PHP4_INCLUDE_PATH})
|
||||
set(SWIG_LANG_LIBRARIES ${PHP4_LIBRARY})
|
||||
endif()
|
||||
if(${language} MATCHES pike)
|
||||
find_package(Pike REQUIRED)
|
||||
set(SWIG_LANG_INCLUDE_DIRECTORIES ${PIKE_INCLUDE_PATH})
|
||||
set(SWIG_LANG_LIBRARIES ${PIKE_LIBRARY})
|
||||
endif()
|
||||
if(${language} MATCHES lua)
|
||||
find_package(Lua REQUIRED)
|
||||
set(SWIG_LANG_INCLUDE_DIRECTORIES ${LUA_INCLUDE_DIR})
|
||||
set(SWIG_LANG_TYPE TYPE SHARED)
|
||||
set(SWIG_LANG_LIBRARIES ${LUA_LIBRARIES})
|
||||
endif()
|
||||
|
||||
unset(CMAKE_SWIG_FLAGS)
|
||||
|
||||
set (CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
|
||||
set_property(SOURCE example.i PROPERTY CPLUSPLUS ON)
|
||||
set_property(SOURCE example.i PROPERTY COMPILE_OPTIONS -includeall)
|
||||
|
||||
set_property(SOURCE example.i PROPERTY GENERATED_INCLUDE_DIRECTORIES ${SWIG_LANG_INCLUDE_DIRECTORIES})
|
||||
set_property(SOURCE example.i PROPERTY GENERATED_COMPILE_DEFINITIONS ${SWIG_LANG_DEFINITIONS})
|
||||
set_property(SOURCE example.i PROPERTY GENERATED_COMPILE_OPTIONS ${SWIG_LANG_OPTIONS})
|
||||
|
||||
|
||||
SWIG_ADD_LIBRARY(example
|
||||
LANGUAGE "${language}"
|
||||
${SWIG_LANG_TYPE}
|
||||
SOURCES example.i example.cxx)
|
||||
TARGET_LINK_LIBRARIES(example PRIVATE ${SWIG_LANG_LIBRARIES})
|
||||
18
Tests/RunCMake/UseSWIG/BasicPerl.cmake
Normal file
18
Tests/RunCMake/UseSWIG/BasicPerl.cmake
Normal file
@@ -0,0 +1,18 @@
|
||||
|
||||
set(language "perl")
|
||||
|
||||
include (BasicConfiguration.cmake)
|
||||
|
||||
if (WIN32)
|
||||
file (TO_CMAKE_PATH "$ENV{PATH}" perl_path)
|
||||
string (REPLACE ";" "$<SEMICOLON>" perl_path "${perl_path}")
|
||||
set (perl_env "PATH=$<TARGET_FILE_DIR:example>$<SEMICOLON>${perl_path}")
|
||||
else()
|
||||
set (perl_env "LD_LIBRARY_PATH=$<TARGET_FILE_DIR:example>")
|
||||
endif()
|
||||
|
||||
add_custom_target (RunTest
|
||||
COMMAND "${CMAKE_COMMAND}" -E env "${perl_env}"
|
||||
"${PERL_EXECUTABLE}" "-I$<TARGET_FILE_DIR:example>"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/runme.pl"
|
||||
DEPENDS example)
|
||||
9
Tests/RunCMake/UseSWIG/BasicPython.cmake
Normal file
9
Tests/RunCMake/UseSWIG/BasicPython.cmake
Normal file
@@ -0,0 +1,9 @@
|
||||
|
||||
set(language "python")
|
||||
|
||||
include (BasicConfiguration.cmake)
|
||||
|
||||
add_custom_target (RunTest
|
||||
COMMAND "${CMAKE_COMMAND}" -E env "PYTHONPATH=$<TARGET_FILE_DIR:example>"
|
||||
"${PYTHON_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/runme.py"
|
||||
DEPENDS example)
|
||||
3
Tests/RunCMake/UseSWIG/CMakeLists.txt
Normal file
3
Tests/RunCMake/UseSWIG/CMakeLists.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
cmake_minimum_required(VERSION 2.8.4)
|
||||
project(${RunCMake_TEST} CXX)
|
||||
include(${RunCMake_TEST}.cmake)
|
||||
@@ -1,54 +1,55 @@
|
||||
set(language "python")
|
||||
|
||||
cmake_minimum_required (VERSION 2.6)
|
||||
|
||||
project(example_${language}_class)
|
||||
# Prevent deprecated warnings from new UseSWIG module
|
||||
set (CMAKE_WARN_DEPRECATED FALSE)
|
||||
|
||||
find_package(SWIG REQUIRED)
|
||||
include(${SWIG_USE_FILE})
|
||||
|
||||
unset(SWIG_LANG_TYPE)
|
||||
if(${language} MATCHES python)
|
||||
find_package(PythonLibs)
|
||||
find_package(PythonInterp REQUIRED)
|
||||
find_package(PythonLibs REQUIRED)
|
||||
include_directories(${PYTHON_INCLUDE_PATH})
|
||||
set(SWIG_LANG_LIBRARIES ${PYTHON_LIBRARIES})
|
||||
endif()
|
||||
if(${language} MATCHES perl)
|
||||
find_package(PerlLibs)
|
||||
find_package(Perl REQUIRED)
|
||||
find_package(PerlLibs REQUIRED)
|
||||
include_directories(${PERL_INCLUDE_PATH})
|
||||
add_definitions(${PERL_EXTRA_C_FLAGS})
|
||||
separate_arguments(c_flags UNIX_COMMAND "${PERL_EXTRA_C_FLAGS}")
|
||||
add_compile_options(${c_flags})
|
||||
set(SWIG_LANG_LIBRARIES ${PERL_LIBRARY})
|
||||
endif()
|
||||
if(${language} MATCHES tcl)
|
||||
find_package(TCL)
|
||||
find_package(TCL REQUIRED)
|
||||
include_directories(${TCL_INCLUDE_PATH})
|
||||
set(SWIG_LANG_LIBRARIES ${TCL_LIBRARY})
|
||||
endif()
|
||||
if(${language} MATCHES ruby)
|
||||
find_package(Ruby)
|
||||
find_package(Ruby REQUIRED)
|
||||
include_directories(${RUBY_INCLUDE_PATH})
|
||||
set(SWIG_LANG_LIBRARIES ${RUBY_LIBRARY})
|
||||
endif()
|
||||
if(${language} MATCHES php4)
|
||||
find_package(PHP4)
|
||||
find_package(PHP4 REQUIRED)
|
||||
include_directories(${PHP4_INCLUDE_PATH})
|
||||
set(SWIG_LANG_LIBRARIES ${PHP4_LIBRARY})
|
||||
endif()
|
||||
if(${language} MATCHES pike)
|
||||
find_package(Pike)
|
||||
find_package(Pike REQUIRED)
|
||||
include_directories(${PIKE_INCLUDE_PATH})
|
||||
set(SWIG_LANG_LIBRARIES ${PIKE_LIBRARY})
|
||||
endif()
|
||||
if(${language} MATCHES lua)
|
||||
find_package(Lua)
|
||||
find_package(Lua REQUIRED)
|
||||
include_directories(${LUA_INCLUDE_DIR})
|
||||
set(SWIG_LANG_TYPE TYPE SHARED)
|
||||
set(SWIG_LANG_LIBRARIES ${LUA_LIBRARIES})
|
||||
endif()
|
||||
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
|
||||
unset(CMAKE_SWIG_FLAGS)
|
||||
|
||||
set(CMAKE_SWIG_FLAGS "")
|
||||
include_directories(${CMAKE_CURRENT_LIST_DIR})
|
||||
|
||||
set_source_files_properties(example.i PROPERTIES CPLUSPLUS ON)
|
||||
set_source_files_properties(example.i PROPERTIES SWIG_FLAGS "-includeall")
|
||||
18
Tests/RunCMake/UseSWIG/LegacyPerl.cmake
Normal file
18
Tests/RunCMake/UseSWIG/LegacyPerl.cmake
Normal file
@@ -0,0 +1,18 @@
|
||||
|
||||
set(language "perl")
|
||||
|
||||
include (LegacyConfiguration.cmake)
|
||||
|
||||
if (WIN32)
|
||||
file (TO_CMAKE_PATH "$ENV{PATH}" perl_path)
|
||||
string (REPLACE ";" "$<SEMICOLON>" perl_path "${perl_path}")
|
||||
set (perl_env "PATH=$<TARGET_FILE_DIR:${SWIG_MODULE_example_REAL_NAME}>$<SEMICOLON>${perl_path}")
|
||||
else()
|
||||
set (perl_env "LD_LIBRARY_PATH=$<TARGET_FILE_DIR:${SWIG_MODULE_example_REAL_NAME}>")
|
||||
endif()
|
||||
|
||||
add_custom_target (RunTest
|
||||
COMMAND "${CMAKE_COMMAND}" -E env "${perl_env}"
|
||||
"${PERL_EXECUTABLE}" "-I$<TARGET_FILE_DIR:${SWIG_MODULE_example_REAL_NAME}>"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/runme.pl"
|
||||
DEPENDS ${SWIG_MODULE_example_REAL_NAME})
|
||||
9
Tests/RunCMake/UseSWIG/LegacyPython.cmake
Normal file
9
Tests/RunCMake/UseSWIG/LegacyPython.cmake
Normal file
@@ -0,0 +1,9 @@
|
||||
|
||||
set(language "python")
|
||||
|
||||
include (LegacyConfiguration.cmake)
|
||||
|
||||
add_custom_target (RunTest
|
||||
COMMAND "${CMAKE_COMMAND}" -E env "PYTHONPATH=$<TARGET_FILE_DIR:${SWIG_MODULE_example_REAL_NAME}>"
|
||||
"${PYTHON_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/runme.py"
|
||||
DEPENDS ${SWIG_MODULE_example_REAL_NAME})
|
||||
30
Tests/RunCMake/UseSWIG/MultipleModules.cmake
Normal file
30
Tests/RunCMake/UseSWIG/MultipleModules.cmake
Normal file
@@ -0,0 +1,30 @@
|
||||
|
||||
find_package(SWIG REQUIRED)
|
||||
include(${SWIG_USE_FILE})
|
||||
|
||||
find_package(PythonLibs REQUIRED)
|
||||
find_package(PerlLibs REQUIRED)
|
||||
|
||||
unset(CMAKE_SWIG_FLAGS)
|
||||
|
||||
set (CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
|
||||
set_property(SOURCE example.i PROPERTY CPLUSPLUS ON)
|
||||
set_property(SOURCE example.i PROPERTY COMPILE_OPTIONS -includeall)
|
||||
|
||||
set_property(SOURCE example.i PROPERTY GENERATED_INCLUDE_DIRECTORIES ${PYTHON_INCLUDE_PATH})
|
||||
|
||||
swig_add_library(example1
|
||||
LANGUAGE python
|
||||
SOURCES example.i example.cxx)
|
||||
target_link_libraries(example1 PRIVATE ${PYTHON_LIBRARIES})
|
||||
|
||||
# re-use sample interface file for another plugin
|
||||
set_property(SOURCE example.i PROPERTY GENERATED_INCLUDE_DIRECTORIES ${PERL_INCLUDE_PATH})
|
||||
separate_arguments(c_flags UNIX_COMMAND "${PERL_EXTRA_C_FLAGS}")
|
||||
set_property(SOURCE example.i PROPERTY GENERATED_COMPILE_OPTIONS ${c_flags})
|
||||
|
||||
swig_add_library(example2
|
||||
LANGUAGE perl
|
||||
SOURCES example.i example.cxx)
|
||||
target_link_libraries(example2 PRIVATE ${PERL_LIBRARY})
|
||||
23
Tests/RunCMake/UseSWIG/RunCMakeTest.cmake
Normal file
23
Tests/RunCMake/UseSWIG/RunCMakeTest.cmake
Normal file
@@ -0,0 +1,23 @@
|
||||
include(RunCMake)
|
||||
|
||||
function(run_SWIG test)
|
||||
cmake_parse_arguments(_SWIG_TEST "" "TARGET" "" ${ARGN})
|
||||
if (_SWIG_TEST_TARGET)
|
||||
list (INSERT _SWIG_TEST_TARGET 0 --target)
|
||||
endif()
|
||||
|
||||
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${test}-build)
|
||||
set(RunCMake_TEST_NO_CLEAN 1)
|
||||
file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
|
||||
file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
|
||||
run_cmake(${test})
|
||||
run_cmake_command(${test}-test ${CMAKE_COMMAND} --build ${RunCMake_TEST_BINARY_DIR} ${_SWIG_TEST_TARGET})
|
||||
endfunction()
|
||||
|
||||
run_SWIG(LegacyPython TARGET RunTest)
|
||||
run_SWIG(LegacyPerl TARGET RunTest)
|
||||
|
||||
run_SWIG(BasicPython TARGET RunTest)
|
||||
run_SWIG(BasicPerl TARGET RunTest)
|
||||
|
||||
run_SWIG(MultipleModules)
|
||||
@@ -7,4 +7,3 @@
|
||||
|
||||
/* Let's just grab the original header file here */
|
||||
%include "example.h"
|
||||
|
||||
0
Tests/SwigTest/runme.pike → Tests/RunCMake/UseSWIG/runme.pike
Executable file → Normal file
0
Tests/SwigTest/runme.pike → Tests/RunCMake/UseSWIG/runme.pike
Executable file → Normal file
@@ -54,4 +54,3 @@ examplec::delete_Shape($s);
|
||||
|
||||
print $examplec::Shape_nshapes," shapes remain\n";
|
||||
print "Goodbye\n";
|
||||
|
||||
52
Tests/RunCMake/UseSWIG/runme.py
Normal file
52
Tests/RunCMake/UseSWIG/runme.py
Normal file
@@ -0,0 +1,52 @@
|
||||
# file: runme.py
|
||||
|
||||
# This file illustrates the shadow-class C++ interface generated
|
||||
# by SWIG.
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import example
|
||||
|
||||
# ----- Object creation -----
|
||||
|
||||
print ("Creating some objects:")
|
||||
c = example.Circle(10)
|
||||
print (" Created circle", c)
|
||||
s = example.Square(10)
|
||||
print (" Created square", s)
|
||||
|
||||
# ----- Access a static member -----
|
||||
|
||||
print ("\nA total of", 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 (example.cvar.Shape_nshapes,"shapes remain")
|
||||
print ("Goodbye")
|
||||
@@ -47,4 +47,3 @@ rename s ""
|
||||
|
||||
puts "$Shape_nshapes shapes remain"
|
||||
puts "Goodbye"
|
||||
|
||||
@@ -67,4 +67,3 @@ delete_Shape $s
|
||||
|
||||
puts "$Shape_nshapes shapes remain"
|
||||
puts "Goodbye"
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
# file: runme.py
|
||||
|
||||
# This file illustrates the shadow-class C++ interface generated
|
||||
# by SWIG.
|
||||
|
||||
import example
|
||||
|
||||
# ----- Object creation -----
|
||||
|
||||
print "Creating some objects:"
|
||||
c = example.Circle(10)
|
||||
print " Created circle", c
|
||||
s = example.Square(10)
|
||||
print " Created square", s
|
||||
|
||||
# ----- Access a static member -----
|
||||
|
||||
print "\nA total of", 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 example.cvar.Shape_nshapes,"shapes remain"
|
||||
print "Goodbye"
|
||||
|
||||
Reference in New Issue
Block a user