[CMake] CMake 2.8.0 RC 1 ready for testing!

Brad King brad.king at kitware.com
Mon Sep 28 15:09:17 EDT 2009


Hi Martin,

Thanks for trying the release candidate.  It is helpful to get feedback
early in the release process.

Martin Apel wrote:
> However I found a few quirks in the first rc:
> 1. I have quite a lot of Fortran files in one of our projects. We use
> the Intel Fortran 11 compiler to compile these.
>     When gathering the objects into a static library CMake 2.6 used to
> call "ar" and "ranlib".
>     Now it seems to call the Intel tool xiar

I believe CMake 2.6 used xiar for C and C++ static libraries, and this
fix was to make Fortran consistent with those.

> which in turn calls xild and this step takes ages (about one minute).

Wow.  Perhaps it is looking for inter-procedural optimizations.

You can tell CMake not to use xiar by pretending that it is not available.
CMake uses find_program to locate the tool and stores the result in the
cache entry "XIAR".  For a single build tree you can do

  cmake . -DXIAR=

to erase the search result.  If you want to stop it all the time, add
a line to tell CMake never to search for XIAR in the first place.
It must be done before the Fortran language is enabled because afterwards
the result of the search will already have been used.  Try this:

  cmake_minimum_required(VERSION 2.6)
  set(XIAR "") # Never use Intel's xiar
  project(FOO Fortran)

While this solution will work around the trouble for your project,
perhaps we should consider this a general bug since it was done for
C and C++ in CMake 2.6 already.  According to the Intel user guide
we only really need to use xiar when the object files were compiled
with "-ipo" to enable inter-procedural optimization (is this correct?).
If you want to look at changing CMake's default behavior please open
a bug report for further discussion.

> 2. Fortran-related as well: On Linux we used to link in the following
> Intel Fortran libraries explicitly: ifcoremt, imf, irc.
>     With CMake 2.8 the following additional and unneeded (for us)
> libraries can be found on the command line for the linker:
>     ifport, ifcore, svml, ipgo, intlc, irc_s. As we do not copy these
> shared libraries to our runtime directory, the resulting
>     executables do not run. This means, that 2.8 is not
> downward-compatible with 2.6 in this respect, so I would have to
>     code a version check into the CMakeLists.txt. Is this intended
> behaviour?

CMake 2.8 automatically detects the implicit runtime libraries used
by the compiler to create a binary for each language.  When building
a link line for a mixed-language binary one of the languages is chosen
to invoke the linker, so it is known that its libraries will be implicit.
Implicit libraries for other languages are added explicitly.

Most of the time this all does nothing.  A single-language binary will
always use its own linker so no extra libraries are needed.  A mixed
C/C++ binary always uses the C++ linker and the C implicit libs are a
subset so nothing happens.

This should only be happening if the executable contains both C++
and Fortran code.  While developing mixed-language C++/Fortran support
we considered the support in CMake 2.6 so immature that it was not
worth trying to be compatible.  Our rationale is that it just plain
didn't work out of the box...every project would have to link to
implicit libraries explicitly for each platform anyway.

> Or can I tell CMake not to add any additional compiler libraries?

It adds libraries listed in CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES
that are not also listed in CMAKE_CXX_IMPLICIT_LINK_LIBRARIES.
Just add this line:

  set(CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES)

It tells CMake to ignore any Fortran implicit libraries it detected.
Another approach is to erase unwanted libraries:

  list(REMOVE_ITEM CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES
     ifport ifcore svml ipgo intlc irc_s)

and stop explicitly linking known implicit libraries yourself.  An
advantage of this approach is that things will work out of the box
by default for some user building your code.  The extra work to
remove libraries is for your prebuilt distribution.

-Brad


More information about the CMake mailing list