mirror of
https://github.com/reactos/CMake.git
synced 2025-02-07 20:38:49 +00:00
Merge topic 'swig-fortran'
a1909e26ac UseSWIG: Enable SWIG Fortran target language Acked-by: Kitware Robot <kwrobot@kitware.com> Merge-request: !4380
This commit is contained in:
commit
facadf6c30
7
Help/release/dev/useswig-fortran.rst
Normal file
7
Help/release/dev/useswig-fortran.rst
Normal file
@ -0,0 +1,7 @@
|
||||
useswig-fortran
|
||||
---------------
|
||||
|
||||
* The :module:`UseSWIG` module now supports Fortran as a target language if
|
||||
the ``SWIG_EXECUTABLE`` is SWIG-Fortran_.
|
||||
|
||||
.. _`SWIG-Fortran`: https://github.com/swig-fortran/swig
|
@ -341,6 +341,23 @@ function(SWIG_GET_EXTRA_OUTPUT_FILES language outfiles generatedpath infile)
|
||||
list(APPEND files "${extra_file}")
|
||||
endforeach()
|
||||
|
||||
if (language STREQUAL "FORTRAN" AND CMAKE_Fortran_COMPILER_LOADED)
|
||||
# Process possible user-supplied extension in flags (obtained via parent
|
||||
# scope variable) to determine the source file name.
|
||||
list(FIND SWIG_COMPILATION_FLAGS "-fext" fext_idx)
|
||||
if (fext_idx EQUAL -1)
|
||||
# Default Fortran generated extension
|
||||
set(fext "f90")
|
||||
else()
|
||||
# Get extension from user-provided flag
|
||||
math(EXPR fext_idx "${fext_idx} + 1")
|
||||
list(GET SWIG_COMPILATION_FLAGS "${fext_idx}" fext)
|
||||
endif()
|
||||
set(extra_file "${generatedpath}/${module_basename}.${fext}")
|
||||
set_source_files_properties("${extra_file}" PROPERTIES LANGUAGE "Fortran")
|
||||
list(APPEND files "${extra_file}")
|
||||
endif()
|
||||
|
||||
set (${outfiles} ${files} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
@ -415,6 +432,7 @@ function(SWIG_ADD_SOURCE_TO_MODULE name outfiles infile)
|
||||
get_filename_component(swig_source_file_fullname "${infile}" ABSOLUTE)
|
||||
|
||||
if (NOT SWIG_MODULE_${name}_NOPROXY)
|
||||
set(SWIG_COMPILATION_FLAGS ${swig_source_file_flags})
|
||||
SWIG_GET_EXTRA_OUTPUT_FILES(${SWIG_MODULE_${name}_LANGUAGE}
|
||||
swig_extra_generated_files
|
||||
"${outdir}"
|
||||
@ -787,6 +805,8 @@ function(SWIG_ADD_LIBRARY name)
|
||||
if (APPLE)
|
||||
set_target_properties (${target_name} PROPERTIES SUFFIX ".dylib")
|
||||
endif ()
|
||||
elseif (swig_lowercase_language STREQUAL "fortran")
|
||||
# Do *not* override the target's library prefix
|
||||
else()
|
||||
# assume empty prefix because we expect the module to be dynamically loaded
|
||||
set_target_properties (${target_name} PROPERTIES PREFIX "")
|
||||
|
@ -18,6 +18,9 @@ unset(SWIG_LANG_LIBRARIES)
|
||||
if(${language} MATCHES csharp)
|
||||
set(SWIG_LANG_TYPE TYPE SHARED)
|
||||
endif()
|
||||
if(${language} MATCHES fortran)
|
||||
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})
|
||||
|
23
Tests/UseSWIG/BasicFortran/CMakeLists.txt
Normal file
23
Tests/UseSWIG/BasicFortran/CMakeLists.txt
Normal file
@ -0,0 +1,23 @@
|
||||
cmake_minimum_required(VERSION 3.12...3.13)
|
||||
|
||||
project(TestBasicFortran CXX Fortran)
|
||||
|
||||
include(CTest)
|
||||
|
||||
set(language "fortran")
|
||||
|
||||
include (../BasicConfiguration.cmake)
|
||||
get_target_property(EXAMPLE_PREFIX example PREFIX)
|
||||
if (NOT EXAMPLE_PREFIX STREQUAL "${CMAKE_SHARED_LIBRARY_PREFIX}"
|
||||
AND NOT EXAMPLE_PREFIX STREQUAL "EXAMPLE_PREFIX-NOTFOUND")
|
||||
message(FATAL_ERROR "Unexpected library prefix on target: got "
|
||||
"'${EXAMPLE_PREFIX}' but expected '${CMAKE_SHARED_LIBRARY_PREFIX}'")
|
||||
endif()
|
||||
|
||||
|
||||
add_executable(runme ${CMAKE_CURRENT_SOURCE_DIR}/../runme.f90)
|
||||
target_link_libraries(runme example)
|
||||
set_target_properties(runme PROPERTIES LINKER_LANGUAGE Fortran)
|
||||
|
||||
add_test (NAME BasicFortran
|
||||
COMMAND $<TARGET_FILE:runme>)
|
@ -55,6 +55,21 @@ add_test(NAME UseSWIG.BasicPerl COMMAND
|
||||
--test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
|
||||
)
|
||||
|
||||
if (CMake_TEST_UseSWIG_Fortran)
|
||||
check_language(Fortran)
|
||||
if (CMAKE_Fortran_COMPILER)
|
||||
add_test(NAME UseSWIG.BasicFortran COMMAND
|
||||
${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
|
||||
--build-and-test
|
||||
"${CMake_SOURCE_DIR}/Tests/UseSWIG/BasicFortran"
|
||||
"${CMake_BINARY_DIR}/Tests/UseSWIG/BasicFortran"
|
||||
${build_generator_args}
|
||||
--build-project TestBasicFortran
|
||||
--build-options ${build_options}
|
||||
--test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
add_test(NAME UseSWIG.MultipleModules COMMAND
|
||||
${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
|
||||
|
77
Tests/UseSWIG/runme.f90
Normal file
77
Tests/UseSWIG/runme.f90
Normal file
@ -0,0 +1,77 @@
|
||||
! File : runme.f90
|
||||
program runme
|
||||
use ISO_FORTRAN_ENV
|
||||
implicit none
|
||||
integer, parameter :: STDOUT = OUTPUT_UNIT
|
||||
|
||||
call run()
|
||||
contains
|
||||
|
||||
subroutine run()
|
||||
use example
|
||||
use iso_c_binding
|
||||
implicit none
|
||||
|
||||
type(Circle) :: c
|
||||
type(Square), target :: s ! 'target' allows it to be pointed to
|
||||
class(Shape), pointer :: sh
|
||||
integer(C_INT) :: n_shapes
|
||||
|
||||
! ----- Object creation -----
|
||||
|
||||
write(STDOUT,*) "Creating some objects"
|
||||
c = Circle(10.0d0)
|
||||
s = Square(10.0d0)
|
||||
|
||||
! ----- Access a static member -----
|
||||
write(STDOUT,'(a,i2,a)')"A total of", s%get_nshapes(), " shapes were created"
|
||||
|
||||
! ----- Member data access -----
|
||||
|
||||
! Notice how we can do this using functions specific to
|
||||
! the 'Circle' class.
|
||||
call c%set_x(20.0d0)
|
||||
call c%set_y(30.0d0)
|
||||
|
||||
! Now use the same functions in the base class
|
||||
sh => s
|
||||
call sh%set_x(-10.0d0)
|
||||
call sh%set_y( 5.0d0)
|
||||
|
||||
write(STDOUT,*)"Here is their current position:"
|
||||
write(STDOUT,'(a,f5.1,a,f5.1,a)')" Circle = (", c%get_x(), ",", c%get_y(), " )"
|
||||
write(STDOUT,'(a,f5.1,a,f5.1,a)')" Square = (", s%get_x(), ",", s%get_y(), " )"
|
||||
|
||||
! ----- Call some methods -----
|
||||
|
||||
write(STDOUT,*)"Here are some properties of the shapes:"
|
||||
call print_shape(c)
|
||||
call print_shape(s)
|
||||
|
||||
! ----- Delete everything -----
|
||||
|
||||
! Note: this invokes the virtual destructor
|
||||
call c%release()
|
||||
call s%release()
|
||||
|
||||
n_shapes = c%get_nshapes()
|
||||
write(STDOUT,*) n_shapes, "shapes remain"
|
||||
if (n_shapes /= 0) then
|
||||
write(STDOUT,*) "Shapes were not freed properly!"
|
||||
stop 1
|
||||
endif
|
||||
|
||||
write(STDOUT,*) "Goodbye"
|
||||
end subroutine
|
||||
|
||||
subroutine print_shape(s)
|
||||
use example, only : Shape
|
||||
use iso_c_binding
|
||||
implicit none
|
||||
class(Shape), intent(in) :: s
|
||||
|
||||
write(STDOUT,*)" area = ",s%area()
|
||||
write(STDOUT,*)" perimeter = ",s%perimeter()
|
||||
end subroutine
|
||||
|
||||
end program
|
Loading…
x
Reference in New Issue
Block a user