用CMake来编译Fortran
原文链接: https://www.lainme.com/doku.php/blog/2015/12/%E7%94%A8cmake%E6%9D%A5%E7%BC%96%E8%AF%91fortranhttps://www.lainme.com/doku.php/blog/2015/12/%E7%94%A8cmake%E6%9D%A5%E7%BC%96%E8%AF%91fortran
用具体例子简单记述一下cmake的一些用法,从此摆脱手写Makefile的痛苦,投入手写CMakeLists.txt的苦海中。
最好的参考资料:CMake文档
编译单文件
先建立有如下内容的CMakeLists.txt文件
# (必要) CMake最低版
cmake_minimum_required(VERSION 2.8.5)
#(可选) 项目/程序/软件名称
project(MyProgram)
# (必要) 启用Fortran支持
enable_language(Fortran)
# (可选) 将编译类型设置为Release,这会使用-O3进行优化
set(CMAKE_BUILD_TYPE Release)
# (必须) 将myprogram.f90编译为myprogram可执行文件
add_executable(myprogram myprogram.f90)
为了清晰区分源码和编译中产生的文件,可以在单独目录下进行编译
mkdir build && cd build
cmake ..
make
这样会在build目录下生成myprogram这个可执行文件
如需更换默认编译器,可以先输出编译器的环境变量
export FC=ifort && cmake ..
编译多个源码到一个可执行文件或动态链接库
cmake_minimum_required(VERSION 2.8.5)
project(MyProgram)
enable_language(Fortran)
set(CMAKE_BUILD_TYPE Release)
#这当前项目里lib目录下的所有文件(包含子目录下的文件)添加到SRCS这个变量里
file(GLOB_RECURSE SRCS RELATIVE ${PROJECT_SOURCE_DIR} lib/*)
# 将SRCS编译为mylib这个动态链接库
add_library(mylib SHARED ${SRCS})
file(GLOB_RECURSE SRCS RELATIVE ${PROJECT_SOURCE_DIR} src/*)
add_executable(myprogram ${SRCS})
# 让myprogram依赖mylib
add_dependencies(myprogram mylib)
# 链接mylib
target_link_libraries(myprogram mylib)
启用OpenMP支持
cmake_minimum_required(VERSION 2.8.5)
project(MyProgram)
enable_language(Fortran)
set(CMAKE_BUILD_TYPE Release)
# 查找是否安装了OpenMP
find_package(OpenMP)
# 设置编译器选项
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${OpenMP_Fortran_FLAGS}")
add_executable(myprogram myprogram.f90)
启用MPI支持
cmake_minimum_required(VERSION 2.8.5)
project(MyProgram)
enable_language(Fortran)
set(CMAKE_BUILD_TYPE Release)
find_package(MPI)
set(CMAKE_Fortran_COMPILE_FLAGS "${CMAKE_Fortran_COMPILE_FLAGS} ${MPI_Fortran_COMPILE_FLAGS}")
set(CMAKE_Fortran_LINK_FLAGS "${CMAKE_Fortran_LINK_FLAGS} ${MPI_Fortran_LINK_FLAGS}")
# 包含MPI路径到搜索路径
include_directories(SYSTEM ${MPI_Fortran_INCLUDE_PATH})
add_executable(myprogram myprogram.f90)
# 链接MPI动态链接库
target_link_libraries(myprogram ${MPI_Fortran_LIBRARIES})
设置开关来控制OpenMP或MPI
cmake_minimum_required(VERSION 2.8.5)
project(MyProgram)
enable_language(Fortran)
set(CMAKE_BUILD_TYPE Release)
# 设置一个名为ENABLE_OPENMP的选项,并默认为ON
option(ENABLE_OPENMP "Enable OpenMP" ON)
# 如果ENABLE_OPENMP为ON则启用OpenMP
if(ENABLE_OPENMP)
find_package(OpenMP)
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${OpenMP_Fortran_FLAGS}")
endif()
add_executable(myprogram myprogram.f90)
如果要更改选项的值,可以在编译时使用
cmake -DENABLE_OPENMP=OFF ..
路径与安装
如果需要能将程序安装到系统中,需要先设置好路径
cmake_minimum_required(VERSION 2.8.5)
project(MyProgram)
enable_language(Fortran)
set(CMAKE_BUILD_TYPE Release)
# Fortran .mod 文件的输出路径,这里是build/include
set(CMAKE_Fortran_MODULE_DIRECTORY ${PROJECT_BINARY_DIR}/include)
# 动态链接库输出路径,这里是build/lib
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
# 可执行文件输出路径,这里是build/bin
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
# 安装build/bin到CMAKE_INSTALL_PREFIX/bin
install(DIRECTORY ${PROJECT_BINARY_DIR}/bin/ DESTINATION bin)
# 安装build/lib到CMAKE_INSTALL_PREFIX/lib
install(DIRECTORY ${PROJECT_BINARY_DIR}/lib/ DESTINATION lib)
# 安装build/include到CMAKE_INSTALL_PREFIX/include/myprogram
install(DIRECTORY ${PROJECT_BINARY_DIR}/include/ DESTINATION include/myprogram)
file(GLOB_RECURSE SRCS RELATIVE ${PROJECT_SOURCE_DIR} lib/*)
add_library(mylib SHARED ${SRCS})
file(GLOB_RECURSE SRCS RELATIVE ${PROJECT_SOURCE_DIR} src/*)
add_executable(myprogram ${SRCS})
add_dependencies(myprogram mylib)
target_link_libraries(myprogram mylib)
CMAKE_INSTALL_PREFIX通常默认是/usr/local,如果想要更改可以使用如下命令编译
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
卸载安装的文件
cd build && sudo xargs rm < install_manifest.txt
所以install_manifest.txt这个文件不要删…… #