[CMake] Fortan and C++
Dominik Szczerba
dominik at itis.ethz.ch
Sat Aug 22 14:27:42 EDT 2009
You are well informed. So this standard is implemented in icc/ifort 11.x
but not (yet) GNU? This renders the FortranCInterface.cmake rather
obsolete, does it not?
Yes, it looks rather excessive, but at least clean.
Thanks,
Dominik
Michael Wild wrote:
> On 22. Aug, 2009, at 15:29, Dominik Szczerba wrote:
> [...]
>>> If you try to use FortranCInterface.cmake, be aware that it is
>>> quite buggy, as it doesn't pass the CMAKE_*_FLAGS to the
>>> try_compile calls. Further it doesn't ensure that the C language
>>> is enabled, altough it is calling try_compile on C code! I'll file
>>> a bug report with an attached patch for that.
>> This is new to me. Sounds like automatic handling of calling
>> decorations. Would be great! Are there any examples how to use it?
>> Do I still need it when I know the mangling scheme myself? Can I set
>> the pre/suffixes myself in some elegant manner? Currently I am just
>> hacking on my own, so indications how to position myself for the
>> future are very welcome.
>>
>> Thanks,
>> Dominik
> [...]
>
> Exactly. It first tries to figure out the name-mangling scheme used by
> your Fortran compiler. I think it tries to prepend/append _ up to two
> times and also tries lower/upper case variations. For names containing
> a _, it also detects whether the compiler appends an additional _
> charachter. Then it creates a header file containing preprocessor
> defines, mapping the "names as written" to the mangled names.
>
> This would be all great and nice, if it wasn't buggy... *sigh*
>
> With reference to the future: the Intel compiler supports the
> iso_c_binding intrinsic module defined for Fortran 2003, allowing one
> to do something like this:
>
> -- >8 --
>
> ! Fortran native function
> real function super_duper(a)
> implicit none
> real, intent(in) :: a
> super_duper = a**2
> end function super_duper
>
> ! C-wrapper function
> real(c_float) function c_super_duper(a) bind(c)
> use, intrinsic :: iso_c_binding
> implicit none
> real (c_float), intent(in), value :: a
> real, external :: super_duper
> c_super_duper = super_duper(a)
> end function c_super_duper
>
> -- <8 --
>
> And then in your C++ file you write:
>
> -- >8 --
>
> #include <iostream>
>
> extern "C" {
> float c_super_duper(float);
> }
>
> int main() {
> std::cout << "super_duper(10) = " << c_super_duper(10.0) << "\n";
> return 0;
> }
>
> -- <8 --
>
> It is very verbose and also a bit confusing, but it takes care of all
> the name-mangling issues and also does the type-handling correctly. As
> you can see, the argument is passed by value by adding the VALUE
> attribute in the wrapper function.
>
> Michael
>
--
d o m i n i k s z c z e r b a , p h d . . . . . . . . . . .
c o m p u t a t i o n a l l i f e s c i e n c e g r o u p
. . . . . . . i t ' i s r e s e a r c h f o u n d a t i o n
. . . . . . . . . . . . . . . . . . . . http://www.itis.ethz.ch
More information about the CMake
mailing list