<div class="gmail_quote">On Fri, Oct 9, 2009 at 12:49 PM, Bill Hoffman <span dir="ltr">&lt;<a href="mailto:bill.hoffman@kitware.com" target="_blank">bill.hoffman@kitware.com</a>&gt;</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 &lt;<a href="mailto:spaseba@gmail.com" target="_blank">spaseba@gmail.com</a> &lt;mailto:<a href="mailto:spaseba@gmail.com" target="_blank">spaseba@gmail.com</a>&gt;&gt; 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&#39;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 &quot;C&quot; to avoid name mangling issues.  The Fortran also expects the C++ symbol name to be all caps.  You can use Fortran&#39;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 &#39;language pure&quot; 
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   &quot;/Od /DDEBUG /MDd&quot; )<br>
set(CMAKE_Fortran_FLAGS_RELEASE &quot;/O2 /Ob2 /DNDEBUG /MD&quot; ) <br>
set(CMAKE_Fortran_FLAGS_MINSIZEREL &quot;/Os /DNDEBUG /MD&quot; )  <br>
set(CMAKE_Fortran_FLAGS_RELWITHDEBINFO &quot;/O2 /Ob2 /DDEBUG /MD&quot; )<br>
   <br>
IF( MSVC_IDE )<br>
  set_target_properties( FortranProgramExe<br>
    PROPERTIES<br>
      LINKER_LANGUAGE Fortran<br>
      LINK_FLAGS &quot;/SUBSYSTEM:CONSOLE&quot;<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>