<div class="gmail_quote">On Fri, Oct 9, 2009 at 12:49 PM, Bill Hoffman <span dir="ltr"><<a href="mailto:bill.hoffman@kitware.com" target="_blank">bill.hoffman@kitware.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Kelly (KT) Thompson wrote:<div><div></div><div><br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
On Fri, Oct 9, 2009 at 6:15 AM, Sebas <<a href="mailto:spaseba@gmail.com" target="_blank">spaseba@gmail.com</a> <mailto:<a href="mailto:spaseba@gmail.com" target="_blank">spaseba@gmail.com</a>>> wrote:<br>
<br>
I send a example where happen explained before ( I have similar<br>
struct in my Program). I include too the VS2008 project generate by<br>
cmake. In the Fortran Project be can seen that use /W3 /Zm1000 /GR<br>
/RTC1 /TP Flags that don't work with ifort.<br>
I use CMake 2.8 rc2 (but happen same in 2.6 and 2.7)<br>
<br>
Thanks.<br>
<br>
Sebastian<br>
<br>
<br>
Sebastian,<br>
<br>
You are mixing C, C++ and Fortran sources in a single project. This does not work well in general and particularly in CMake. I was able to restructure your sample code so that it will build with NMake Makefile (Visual Studio 2008 SP1 and Intel Visual Fortran 11).<br>
<br>
Key points:<br>
<br>
1. all C++ code goes into a single directory and produces a single library. The CMakeLists.txt has the project name CPPLibrary2.<br>
<br>
2. each C library is built only from C sources. The CMakeLists.txt files are given the project name CLibrary and CLibrary2.<br>
<br>
3. the Fortran is also isolated into a single directory and the local CMakeLists.txt file only deals with the Fortran.<br>
<br>
4. CMake needs help knowing how to build mixed language targets that must be compiled with the Fortran compiler. In the Fortran CMakeLists.txt I had to set_target properties for LINKER_LANGUAGE.<br>
<br>
5. When mixing C and Fortran on the Windows platform you must use the same type of runtime libraries (/MT or /MD). The default Fortran build uses /MT, so I had to set these to /MD (Fortran_FLAGS)<br>
<br>
6. When interfacing C++ and Fortran code, you must mark the C++ function as extern "C" to avoid name mangling issues. The Fortran also expects the C++ symbol name to be all caps. You can use Fortran's ISO_C_BINDING to get around this platform issue.<br>
<br>
There are many changes required to your sample build so I decided that a zip file would be the best way to return the project to you.<br>
<br>
</blockquote></div></div>
Thanks for the work around. However, this should work a bit smoother, Sebastian can you create a bug report and attach your example?<br>
<br>
Thanks.<br><font color="#888888">
<br>
-Bill<br>
<br></font></blockquote><div><br>Bill, <br><br>It is my understanding that each CMake target must be 'language pure"
The following example will work (and is less complex). This example
assumes that all sources are in a single directory (see below).
Because Sebastian had separate directories for each language, I assumed
that was important for his build setup and tried to be faithful to that layout.<br>
<br>
I think the key feature that was missing from his original setup was:<br>
<br>
set_target_properties( FortranProgram PROPERTIES LINKER_LANGUAGE Fortran )<br>
<br>
Without that that statement, CMake will build FortranProgram.obj correctly, but then
try to generate the .exe by calling the MSVC linker (using the link
flags for C).<br>
<br>-kt<br><br>## Single directory equivalent CMakeLists.txt:<br>
<br>
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)<br>
PROJECT( FortranProgram C CXX Fortran )<br>
<br>
# Find local headers<br>
INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR} )<br>
<br>
# Library CLibrary2<br>
ADD_LIBRARY( CLibrary2 CLibrary2.c )<br>
<br>
# Library CPPLibrary<br>
ADD_LIBRARY( CPPLibrary2 CPPLibrary2.cpp )<br>
<br>
# Library: CLibrary<br>
ADD_LIBRARY( CLibrary CLibrary.c )<br>
TARGET_LINK_LIBRARIES( CLibrary CLibrary2 CPPLibrary2 )<br>
<br>
# Fortran <br>
ADD_EXECUTABLE( FortranProgramExe FortranProgram.f90 )<br>
TARGET_LINK_LIBRARIES( FortranProgramExe CLibrary CLibrary2 CPPLibrary2 )<br>
<br>
set(CMAKE_Fortran_FLAGS_DEBUG "/Od /DDEBUG /MDd" )<br>
set(CMAKE_Fortran_FLAGS_RELEASE "/O2 /Ob2 /DNDEBUG /MD" ) <br>
set(CMAKE_Fortran_FLAGS_MINSIZEREL "/Os /DNDEBUG /MD" ) <br>
set(CMAKE_Fortran_FLAGS_RELWITHDEBINFO "/O2 /Ob2 /DDEBUG /MD" )<br>
<br>
IF( MSVC_IDE )<br>
set_target_properties( FortranProgramExe<br>
PROPERTIES<br>
LINKER_LANGUAGE Fortran<br>
LINK_FLAGS "/SUBSYSTEM:CONSOLE"<br>
OUTPUT_NAME FortranProgram<br>
)<br>
ELSEIF( WIN32 )<br>
set_target_properties( FortranProgramExe<br>
PROPERTIES<br>
LINKER_LANGUAGE Fortran<br>
OUTPUT_NAME FortranProgram<br>
)<br>
ENDIF()<br>
<br></div></div><br>