使用cmake编译Fortran程序

7
尽管 cmake 被称为很好用,但它的文档似乎令人感到不尽如人意(除非我完全未能理解基础知识)。
我正在尝试编写一个 cmake 文件,用于一组 Fortran 程序,并且这些程序还依赖于其他一些库(这些库已经被编译为我的系统,但我也会想为这些库创建 cmake 文件)。
我在网上找到的例子中有许多命令,在官方文档中并没有出现,这有点令人不安。例如,http://www.vtk.org/Wiki/CMakeForFortranExample 中包含以下代码行:
get_filename_component (Fortran_COMPILER_NAME ${CMAKE_Fortran_COMPILER} NAME)

然而,当我将这个添加到我的CMakeLists.txt中时,我会收到一个错误。

Missing variable is:
CMAKE_fortran_COMPILER

What am I missing?!

Edit: current CMakeLists.txt

cmake_minimum_required(VERSION 2.6)

enable_language(fortran)
project(fortranTest)
get_filename_component (Fortran_COMPILER_NAME ${CMAKE_Fortran_COMPILER} NAME)

编辑2

我还没有弄清楚如何包含依赖库。


在进行任何操作之前,您是否ENABLE_LANGUAGE(Fortran)了?我们成功地在非常大的Fortran流体动力学代码中使用CMake,并且几乎没有任何问题(与Fortran相关)。 - tpg2114
另外,你能否编辑你的帖子并包含你的CMakeLists.txt文件?错误信息中的fortran是小写字母f,而你的示例行中是大写字母F。此外,有更好的方法来处理该信息所尝试做的事情,例如使用if(${CMAKE_Fortran_COMPILER_ID} STREQUAL "Intel"),这样可以保护你,以防可执行文件被命名为奇怪的名称(例如在Cray系统上,它会被包装成ftn)。 - tpg2114
@tpg2114 是的,我有 - 我已经编辑了我的问题以展示我目前所拥有的。 - ChrisW
5
enable_language() 调用中,需要使用 Fortran 而不是 fortran - tpg2114
1个回答

7
语言名称区分大小写。按照发布的方式,我得到了以下结果:
~/cmt> cmake ./
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly.
Missing variable is:
CMAKE_fortran_COMPILER_ENV_VAR
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly.
Missing variable is:
CMAKE_fortran_COMPILER
CMake Error: Could not find cmake module file:/home/tgallagher/cmt/CMakeFiles/CMakefortranCompiler.cmake
CMake Error: Could not find cmake module file:CMakefortranInformation.cmake
CMake Error: CMAKE_fortran_COMPILER not set, after EnableLanguage
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
^C

然而,通过将文件更改为(请注意,enable_language() 中的语言为 Fortran 而不是 fortran):

cmake_minimum_required(VERSION 2.6)

enable_language(Fortran)
project(fortranTest)
get_filename_component (Fortran_COMPILER_NAME ${CMAKE_Fortran_COMPILER} NAME)

您将获得:

~/cmt> cmake ./
-- The Fortran compiler identification is GNU
-- Check for working Fortran compiler: /usr/bin/gfortran
-- Check for working Fortran compiler: /usr/bin/gfortran  -- works
-- Detecting Fortran compiler ABI info
-- Detecting Fortran compiler ABI info - done
-- Checking whether /usr/bin/gfortran supports Fortran 90
-- Checking whether /usr/bin/gfortran supports Fortran 90 -- yes
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
^C

如果允许完成,则可以按预期工作。但是,为了确定编译器标志的目的,有更好的方法来识别编译器。在引用的示例中使用的方法仅适用于未包装编译器的系统,这意味着不通过像Cray上的mpif90ftn这样的东西调用编译器的系统无法使用此方法。一个更好的方法是检查:

if(${CMAKE_Fortran_COMPILER_ID} STREQUAL "Intel")
...
endif()

可以通过检查CMake模块目录中的文件Modules/CMakeFortranCompilerId.F.in来找到可能的名称列表。


谢谢 :) 我曾阅读过命令不区分大小写,我也(错误地!)认为这意味着整个文件不区分大小写。 - ChrisW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接