Hello,
I have a project for which the main language is C (soon CPP) that calls some
functions from Intel MKL. I have the need to use four third-party high
performance fortran routines and I need to:
1) be able to call these Fortran routines from my C code
2) Automatically generate C headers I can include in my C code (use the
FortranCInterface.cmake)
3) be able to compile the Fortran routines and have them linking with/calling
MKL's LAPACK and BLAS implementations and not any other possible GNU variants.
I followed the example here
<http://public.kitware.com/cgi-bin/viewcvs.cgi/Tests/Fortran/?root=CMake> and I
think I am not too far from the target. However, there are a few unclear points
e.g. I didn't exactly understand what this line is doing:
list(APPEND FORTRAN_FUNCTIONS my_sub mysub)
my attempt to achieve the same thing is:
add_library(qr_updates STATIC
src/addcols.f
src/addcolsq.f
src/delcols.f
src/delcolsq.f
)
list(APPEND FORTRAN_FUNCTIONS ADDCOLS addcols)
list(APPEND FORTRAN_FUNCTIONS ADDCOLSQ addcolsq)
list(APPEND FORTRAN_FUNCTIONS DELCOLS delcols)
list(APPEND FORTRAN_FUNCTIONS DELCOLSQ delcolsq)
FortranCInterface_HEADER(qr_updates.h
MACRO_NAMESPACE "FC_"
SYMBOL_NAMESPACE "F_"
SYMBOLS ${FORTRAN_FUNCTIONS}
)
include_directories("${myproject_BINARY_DIR}")
then I get the following qr_updates.h as output:
#ifndef FC_HEADER_INCLUDED
#define FC_HEADER_INCLUDED
/* Mangling for Fortran global symbols without underscores. */
#define FC_GLOBAL(name,NAME) name##_
/* Mangling for Fortran global symbols with underscores. */
#define FC_GLOBAL_(name,NAME) name##_
/* Mangling for Fortran module symbols without underscores. */
#define FC_MODULE(mod_name,name, mod_NAME,NAME) __##mod_name##_MOD_##name
/* Mangling for Fortran module symbols with underscores. */
#define FC_MODULE_(mod_name,name, mod_NAME,NAME) __##mod_name##_MOD_##name
/*--------------------------------------------------------------------------*/
/* Mangle some symbols automatically. */
#define F_ADDCOLS FC_GLOBAL(addcols, ADDCOLS)
#define F_addcols FC_GLOBAL(addcols, ADDCOLS)
#define F_ADDCOLSQ FC_GLOBAL(addcolsq, ADDCOLSQ)
#define F_addcolsq FC_GLOBAL(addcolsq, ADDCOLSQ)
#define F_DELCOLS FC_GLOBAL(delcols, DELCOLS)
#define F_delcols FC_GLOBAL(delcols, DELCOLS)
#define F_DELCOLSQ FC_GLOBAL(delcolsq, DELCOLSQ)
#define F_delcolsq FC_GLOBAL(delcolsq, DELCOLSQ)
#endif
but the signatures in this generated header look fishy, am I missing anything?
For example the function signature for the ADDCOLSQ Fortran routine looks like
this:
SUBROUTINE ADDCOLSQ( M, N, A, LDA, Q, LDQ, K, P, TAU, WORK, INFO)
*
* Craig Lucas, University of Manchester
* March, 2004
*
* .. Scalar Arguments ..
INTEGER INFO, K, LDA, LDQ, M, N, P
* ..
* .. Array Arguments ..
DOUBLE PRECISION A( LDA, * ), Q( LDQ, * ), TAU( * ), WORK( * )
I expected the generated header to contain a matching signature or?
TIA,
Best regards,
Giovanni--
Powered by www.kitware.com
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
Please keep messages on-topic and check the CMake FAQ at:
http://www.cmake.org/Wiki/CMake_FAQ
Follow this link to subscribe/unsubscribe:
http://www.cmake.org/mailman/listinfo/cmake