首页 > 解决方案 > 使用 cmake 在源文件名之前添加一个编译选项

问题描述

我收到了一个用 Fortran 编写的代码,其中包含使用扩展名 .f95 命名的文件。我知道不推荐使用此扩展名,应仅将 .f 用于固定形式的 Fortran,将 .f90 用于自由形式的 Fortran,但这是我收到代码的方式。

为了编译它,我准备了一些 cmake 文件。当我使用 gfortran 时效果很好,但在使用 Intel Fortran 2021 时效果不佳。似乎 Intel Fortran 默认不接受 .f95 扩展名。

例如,以下内容不起作用:

ifort mySrc.f95 -c

但是可以通过键入以下命令强制 ifort 接受这个 .f95 扩展名:

ifort -free -Tf mySrc.f95 -c

这是我为项目准备的简化的 CMakeLists.txt:

cmake_minimum_required(VERSION 3.12)

project (Test VERSION 1.0 
        DESCRIPTION "CMAKE files to compile test"
        LANGUAGES Fortran)

if (CMAKE_Fortran_COMPILER_ID STREQUAL "Intel")
  if(CMAKE_Fortran_COMPILER_VERSION VERSION_LESS "20")
      message(FATAL_ERROR "Intel Fortran Compiler 20 or newer required")
  endif()
  set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -warn all")
  set (CMAKE_Fortran_FLAGS_RELEASE "-O2")
  set (CMAKE_Fortran_FLAGS_RELWITHDEBINFO "-O2 -g")
  set (CMAKE_Fortran_FLAGS_DEBUG "-g")
endif()

file(GLOB FILES_SRC CONFIGURE_DEPENDS "*.f95")

set(LIB_MOD_DIR ${CMAKE_CURRENT_BINARY_DIR}/mod/)

add_executable(MYCODE ${FILES_SRC})

set_target_properties(MYCODE
        PROPERTIES Fortran_MODULE_DIRECTORY ${LIB_MOD_DIR})

set_property(TARGET MYCODE PROPERTY LINKER_LANGUAGE Fortran)

install(TARGETS MYCODE
        RUNTIME DESTINATION bin 
        ARCHIVE DESTINATION lib 
        LIBRARY DESTINATION lib 
        )   

install(DIRECTORY ${LIB_MOD_DIR} DESTINATION include)

我正在尝试将这些 -free 和 -Tf 选项添加到我的 cmake 脚本中,但这些选项必须位于要编译的文件的文件名之前。我找到了这个链接,他们提到这可以通过我的修改文件来实现/Modules/Platform/Linux-Intel-Fortran.cmake。但是,我没有修改该文件的权限。我尝试在以下内容之后将以下内容添加到我的 CMakeLists.txt 中endif()

SET(CMAKE_Fortran_COMPILE_OBJECT "<CMAKE_Fortran_COMPILER> -o <OBJECT> <DEFINES> <FLAGS> -c -Tf <SOURCE>")

但我不断收到错误。是否可以使用 CMakeLists.txt 文件来实现这一点?提前致谢。

标签: cmakefortran

解决方案


当我在 CMakeLists.txt 文件中添加以下选项时:

SET(CMAKE_Fortran_COMPILE_OBJECT "<CMAKE_Fortran_COMPILER> -o <OBJECT> <DEFINES> <FLAGS> -c -Tf <SOURCE>")

我忘了添加-free以表明文件是自由格式的。默认情况下-Tf会将文件视为固定格式的 Fortran。这就是编译失败的原因。因此,使用CMAKE_Fortran_COMPILE_OBJECT是使 ifort 接受f95文件的正确方法。

所以现在我可以将 cmake 与 ifort 和f95文件一起使用。英特尔 Fortran 的 CMakeLists.txt 部分如下:

if (CMAKE_Fortran_COMPILER_ID STREQUAL "Intel")
  if(CMAKE_Fortran_COMPILER_VERSION VERSION_LESS "20")
      message(FATAL_ERROR "Intel Fortran Compiler 20 or newer required")
  endif()
  set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -warn all")
  set (CMAKE_Fortran_FLAGS_RELEASE "-O2")
  set (CMAKE_Fortran_FLAGS_RELWITHDEBINFO "-O2 -g")
  set (CMAKE_Fortran_FLAGS_DEBUG "-g")
  set (CMAKE_Fortran_COMPILE_OBJECT     "<CMAKE_Fortran_COMPILER> -o <OBJECT> <DEFINES> <FLAGS> -c -free -Tf <SOURCE>")
endif()

谢谢你们的建议。


推荐阅读