Help us understand the problem. What is going on with this article?

CMakeに関する個人的メモ

はじめに

 本記事は,モダンFortran勉強会.f02での@ijknablaさんの発表1を聞いて,実際に自身の環境にCMake2をインストールし利用してみた際の備忘録です.

更新履歴

2019.07.03 : 公開
2019.10.10 : @ijknablaさんにコメントで指摘いただいたことをコンパイラとコンパイラオプションの項に追加.Intel MKLに関する記載をCMakeでIntel MKLをリンクするに分離

バージョン

macOS 10.14.5

 macportsを用いてインストールされたバージョンは,latest release (3.14.5)

Ubuntu 16.04

 aptを用いてインストールされたバージョンは,3.5.1(正確にはxenial-updates,now 3.5.1-1ubuntu3 amd64).このバージョンの挙動がmacにインストールしたlateset releaseのものと異なった.よってアンインストールをした後,公式サイトからlatest releaseの Unix/Linux sourceをダウンロードし,インストールした.

$wget https://github.com/Kitware/CMake/releases/download/v3.14.5/cmake-3.14.5.tar.gz
$tar -xzvf cmake-3.14.5.tar.gz
$cd cmake-3.14.5
$./configure
$make 
$sudo make install

手なりでconfigureを使ったが,READMEによれば

$ ./bootstrap && make && sudo make install

で良いらしい.

prefixでインストール場所を指定しなかったので,/opt以下に移し,シンボリックリンクを貼る3

$cd ..
$sudo mv cmake-3.14.5/ /opt
$sudo ln -s /opt/cmake-3.14.5/bin/* /usr/bin/

Ubuntu 18.04については手元に環境がないため確認していない.

コンパイラとコンパイラオプション

 CMAKE_<LANG>_FLAGSsetすることで,コンパイラオプションを利用する45.次の例は,実行時オプションに合わせてコンパイラとコンパイルオプションを変えている.

#ifort
if(CMAKE_Fortran_COMPILER_ID MATCHES Intel)
    set(CMAKE_Fortran_FLAGS         "-O3 -p")
    set(CMAKE_Fortran_FLAGS_DEBUG   "-O0 -warn all -standf95")
    set(CMAKE_Fortran_FLAGS_RELEASE "-O3 -march=native")
endif()
#gfortran
if(CMAKE_Fortran_COMPILER_ID MATCHES GNU)
    set(CMAKE_Fortran_FLAGS         "-O3 -p")
    set(CMAKE_Fortran_FLAGS_DEBUG   "-O0 -Wall")
    set(CMAKE_Fortran_FLAGS_RELEASE "-O3 -march=native")
endif()

実行時に -Dオプションをつけて,CMAKE_Fortran_COMPILERCMAKE_BUILD_TYPEにより指定する.(CMAKE_BUILD_TYPEは前回の値を記憶するので,毎回明示すること5)

$cmake -D CMAKE_Fortran_COMPILER=ifort -D CMAKE_BUILD_TYPE=debug 

ところが,stack overflowのあるQ&Aによるとmodernなcompile flagの設定には,
CMAKE_<LANG>_FLAGSではなく,target_compile_optionsを使うほうが良いという趣旨の回答があった6.こみいった依存関係を持つprojectにCMakeを利用する際は,注意したほうが良いのかもしれない.

2019.08.2? 追記

@ijknablaさんにコメントいただいたので,簡単に追記する.

  • 一括でコンパイラオプションが設定されるのが,CMAKE_<LANG>_FLAGSの長所であり,短所.
  • ファイル単位でコンパイラオプションの指定をしたい場合はtarget_compile_optionsが便利.

静的ライブラリのリンク

target_link_librariesで指定1

target_link_libraries(${EXECUTABLE}
    PRIVATE
    /(library path)/hoge.a
)

Intel MKLのリンク

 コンパイルオプションに-mklをつけるのではなく,target_link_librariesmkl_rtを指定する.

target_link_libraries(${EXECUTABLE}
    PRIVATE
    mkl_rt
)

2019.10.10追記

上記の方法は不十分かつ不正確なため分離して,新しい記事にできる限り詳しい説明を述べた.参照していただきたい.
CMakeでIntel MKLをリンクする

OpenMP, MPI

 @ijknablaさんの記事1そのままで利用できた.(Ubuntuにはじめにインストールした3.5.1では利用できなかった)

find_package(MPI    REQUIRED)
find_package(OpenMP REQUIRED)

#~~~~~

target_link_libraries(${EXECUTABLE}
  PRIVATE
  MPI::MPI_Fortran
  OpenMP::OpenMP_Fortran
  )

疑問 

  • コンパイルオプションを指定する最適な方法は何か?
  • cmakeはcmakeが使えない環境用に,単体で運用できる(移植できる)makefileを出力できるのか

  1. cmake による Fortran90 ビルドの省力化 (https://qiita.com/ijknabla/items/05270ae5e597705d0dae

  2. CMake 公式webサイト (https://cmake.org/

  3. Linuxに特定のバージョンのcmakeをインストール (https://qiita.com/pollenjp/items/391afc3e9f93006b83ba

  4. CMake lesson (https://coderefinery.github.io/cmake/06-compilers/

  5. CMake 簡易まとめ (https://qiita.com/janus_wel/items/a673793d448c72cbc95e

  6. stack overflow: What is the modern method for setting general compile flags in CMake? (https://stackoverflow.com/questions/23995019/what-is-the-modern-method-for-setting-general-compile-flags-in-cmake

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした