使用cmake在源文件名之前添加一个编译选项



我收到了一段用Fortran编写的代码,其中的文件名为.f95。我知道不建议使用此扩展,只应将.f用于固定形式Fortran,将.f90用于自由形式Fortran,但这是我接收代码的方式。

为了编译它,我准备了一些cmake文件。当我使用gfortran时,它工作得很好,但当我使用"英特尔Fortran 2021"时,它不工作。"英特尔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来实现。但是,我没有修改该文件的权限。我尝试在endif():之后将以下内容添加到我的CMakeLists.txt中

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

但我总是犯错误。是否可以使用CMakeLists.txt文件实现此功能?提前谢谢。

当我在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()

谢谢你们两个的建议。

最新更新