CMake: Fortran モジュールファイルの出力ディレクトリを自在に操る - CMAKE_Fortran_MODDIR_FLAG を徹底解説


CMAKE_Fortran_MODDIR_FLAG は、CMake の Fortran コンパイラ設定において、コンパイラにモジュールファイルの出力ディレクトリを指定するための変数です。モジュールファイルは、Fortran コンパイラがコンパイルしたソースコードから生成される中間ファイルであり、その後のコンパイルやリンクに使用されます。

役割

CMAKE_Fortran_MODDIR_FLAG は、Fortran コンパイラに -moduledir などのフラグを渡すことで、モジュールファイルの出力ディレクトリを指定します。このディレクトリは、コンパイラがモジュールファイルを生成する場所を決定します。デフォルトでは、モジュールファイルは現在のワーキングディレクトリに生成されますが、CMAKE_Fortran_MODDIR_FLAG を使用して、別の場所を指定することができます。

設定方法

CMAKE_Fortran_MODDIR_FLAG は、CMake のターゲットプロパティ Fortran_MODULE_DIRECTORY を設定することで設定できます。このプロパティは、モジュールファイルの出力ディレクトリを指定します。

set(Fortran_MODULE_DIRECTORY "/path/to/module/directory")

上記の例では、モジュールファイルは /path/to/module/directory ディレクトリに生成されます。

CMAKE_Fortran_MODDIR_FLAG は、CMake の target_link_libraries コマンドを使用して、ターゲットにリンクするライブラリを指定する場合にも使用できます。

target_link_libraries(mytarget Fortran::MyLib)

上記の例では、MyLib ライブラリにリンクする際に、CMAKE_Fortran_MODDIR_FLAG が使用されて、ライブラリのモジュールファイルの場所が指定されます。

使用例

以下の例は、CMAKE_Fortran_MODDIR_FLAG を使用して、モジュールファイルの出力ディレクトリを /my/module/dir に設定する方法を示しています。

set(Fortran_MODULE_DIRECTORY "/my/module/dir")

target_compile_definitions(mytarget PRIVATE MY_LIB_DIR="/my/lib/dir")

target_link_libraries(mytarget Fortran::MyLib)

上記の例では、モジュールファイルは /my/module/dir ディレクトリに生成され、MyLib ライブラリは /my/lib/dir ディレクトリにあると仮定されます。

CMAKE_Fortran_MODDIR_FLAG は、Fortran コンパイラによってサポートされている場合にのみ使用できます。サポートされていない場合は、警告が表示されます。

CMAKE_Fortran_MODDIR_FLAG の詳細については、CMake のドキュメントを参照してください。

CMAKE_Fortran_MODDIR_FLAG は、Fortran コンパイラにモジュールファイルの出力ディレクトリを指定するための便利な変数です。この変数を使用して、モジュールファイルをプロジェクトの特定の場所に出力することができます。

  • Fortran コンパイラのドキュメント: (Fortran コンパイラの公式ドキュメントを参照)


cmake_minimum_required(VERSION 3.10)

project(myproject)

set(CMAKE_Fortran_COMPILER gfortran)

set(Fortran_MODULE_DIRECTORY "/my/module/dir")

target_compile_definitions(mytarget PRIVATE MY_LIB_DIR="/my/lib/dir")

target_link_libraries(mytarget Fortran::MyLib)

add_executable(myprogram mytarget.f)

このコードは、以下のようになります。

  1. CMake のバージョンが 3.10 以上であることを確認します。
  2. プロジェクト myproject を作成します。
  3. Fortran コンパイラを gfortran に設定します。
  4. モジュールファイルの出力ディレクトリを /my/module/dir に設定します。
  5. ターゲット mytarget のコンパイル時に定義するマクロを指定します。この場合、MY_LIB_DIR マクロは /my/lib/dir に設定されます。
  6. ターゲット mytarget にリンクするライブラリを指定します。この場合、Fortran ライブラリ MyLib にリンクされます。
  7. 実行可能ファイル myprogram をターゲット mytarget から作成します。

このコードを実行すると、以下のようになります。

  1. /my/module/dir ディレクトリにモジュールファイルが生成されます。
  2. myprogram という名前の実行可能ファイルが作成されます。

この実行可能ファイルを実行するには、以下のコマンドを実行します。

./myprogram

このコマンドを実行すると、mytarget.f ファイルで定義されたプログラムが実行されます。

このコードはあくまで一例であり、プロジェクトの要件に合わせて変更する必要があります。

  • Fortran コンパイラのドキュメント: (Fortran コンパイラの公式ドキュメントを参照)


CMAKE_MODULE_PATH を使用する

CMAKE_MODULE_PATH は、CMake がモジュールファイルを検索する場所を指定するための変数です。この変数を使用して、モジュールファイルを特定のディレクトリに配置することで、CMAKE_Fortran_MODDIR_FLAG を使用せずにモジュールファイルの場所を間接的に指定することができます。

set(CMAKE_MODULE_PATH "/path/to/module/dir")

上記の例では、CMake は /path/to/module/dir ディレクトリでモジュールファイルを検索します。

target_compile_features を使用する

target_compile_features コマンドを使用して、ターゲットにコンパイルフラグを指定することができます。このコマンドを使用して、-moduledir フラグを指定することで、モジュールファイルの出力ディレクトリを直接指定することができます。

target_compile_features(mytarget PRIVATE -moduledir "/path/to/module/dir")

上記の例では、mytarget ターゲットのコンパイル時に -moduledir フラグが渡され、モジュールファイルは /path/to/module/dir ディレクトリに生成されます。

手動でモジュールファイルを配置する

  1. Fortran コンパイラでモジュールファイルを生成します。
  2. モジュールファイルをプロジェクトの特定の場所 (例: build/modules) に手動で配置します。
  3. ターゲットにリンクするライブラリを指定する際に、モジュールファイルの場所を指定します。
target_link_libraries(mytarget Fortran::MyLib PRIVATE "/path/to/modules")

上記の例では、MyLib ライブラリにリンクする際に、/path/to/modules ディレクトリにあるモジュールファイルが使用されます。

どの方法を選択するべきか

どの方法を選択するべきかは、プロジェクトの要件によって異なります。

  • モジュールファイルの場所をプロジェクト全体で一貫して管理する必要がある場合は、CMAKE_Fortran_MODDIR_FLAG を使用するのが最良の方法です。
  • CMake を使用している場合は、CMAKE_MODULE_PATH または target_compile_features を使用するのが一般的です。
  • シンプルなプロジェクトや、CMake を使用しないプロジェクトの場合は、手動でモジュールファイルを配置するのが最も簡単な方法です。
  • 使用する方法は、Fortran コンパイラによって異なる場合があります。Fortran コンパイラのドキュメントを参照して、詳細を確認してください。