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)
このコードは、以下のようになります。
- CMake のバージョンが 3.10 以上であることを確認します。
- プロジェクト
myproject
を作成します。 - Fortran コンパイラを
gfortran
に設定します。 - モジュールファイルの出力ディレクトリを
/my/module/dir
に設定します。 - ターゲット
mytarget
のコンパイル時に定義するマクロを指定します。この場合、MY_LIB_DIR
マクロは/my/lib/dir
に設定されます。 - ターゲット
mytarget
にリンクするライブラリを指定します。この場合、Fortran ライブラリMyLib
にリンクされます。 - 実行可能ファイル
myprogram
をターゲットmytarget
から作成します。
このコードを実行すると、以下のようになります。
/my/module/dir
ディレクトリにモジュールファイルが生成されます。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
ディレクトリに生成されます。
手動でモジュールファイルを配置する
- Fortran コンパイラでモジュールファイルを生成します。
- モジュールファイルをプロジェクトの特定の場所 (例:
build/modules
) に手動で配置します。 - ターゲットにリンクするライブラリを指定する際に、モジュールファイルの場所を指定します。
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 コンパイラのドキュメントを参照して、詳細を確認してください。