CMake: Fortran ソースコードの事前処理を制御する CMAKE_Fortran_PREPROCESS 変数


CMake 変数 CMAKE_Fortran_PREPROCESS は、Fortran ソースコードの事前処理を制御するために使用されます。事前処理とは、コンパイル前にソースコードを加工する処理です。具体的には、マクロ展開、インクルードファイルの挿入、条件付きコンパイルなどを行うことができます。

デフォルト値

CMAKE_Fortran_PREPROCESS のデフォルト値は ON です。これは、すべての Fortran ターゲットに対して事前処理が有効になることを意味します。

設定方法

CMAKE_Fortran_PREPROCESS は、以下の方法で設定できます。

  • コマンドラインで -DCMAKE_Fortran_PREPROCESS=<value> オプションを使用する
  • CMakeLists.txt ファイルで set コマンドを使用する

以下の例は、すべての Fortran ターゲットに対して事前処理を無効にする方法を示します。

cmake_minimum_required(VERSION 3.18)
project(myproject LANGUAGES Fortran)

set(CMAKE_Fortran_PREPROCESS OFF)

add_executable(myprogram main.f)

以下の例は、特定のターゲットに対してのみ事前処理を無効にする方法を示します。

cmake_minimum_required(VERSION 3.18)
project(myproject LANGUAGES Fortran)

add_executable(myprogram main.f)
target_compile_options(myprogram PRIVATE -DCMAKE_Fortran_PREPROCESS=OFF)
  • ソースファイル単位で事前処理を制御したい場合は、Fortran_PREPROCESS ターゲットプロパティを使用します。
  • 一部のコンパイラでは、CMAKE_Fortran_PREPROCESSOFF に設定しても効果がない場合があります。
  • CMAKE_Fortran_PREPROCESS 変数は、Fortran プロジェクトのビルドプロセスを制御するための多くのオプションのうちの 1 つです。
  • CMake は、クロスコンパイルを含むさまざまな開発環境で Fortran プロジェクトをビルドするための強力なツールです。


cmake_minimum_required(VERSION 3.18)
project(myproject LANGUAGES Fortran)

set(CMAKE_Fortran_PREPROCESS OFF)

add_executable(myprogram main.f)

このコードは、myproject という名前のプロジェクトを作成し、main.f という名前の Fortran プログラムをビルドします。すべての Fortran ターゲットに対して事前処理が無効になっているため、main.f ファイルは事前処理されずにコンパイルされます。

例 2: 特定のターゲットに対してのみ事前処理を無効にする

cmake_minimum_required(VERSION 3.18)
project(myproject LANGUAGES Fortran)

add_executable(myprogram main.f)
target_compile_options(myprogram PRIVATE -DCMAKE_Fortran_PREPROCESS=OFF)

例 3: カスタムマクロを定義する

cmake_minimum_required(VERSION 3.18)
project(myproject LANGUAGES Fortran)

set(MY_MACRO "MY_VALUE")

add_executable(myprogram main.f)
target_compile_options(myprogram PRIVATE -DCMAKE_Fortran_PREPROCESS=ON -D"MY_MACRO=${MY_MACRO}")

このコードは、myproject という名前のプロジェクトを作成し、main.f という名前の Fortran プログラムをビルドします。MY_MACRO という名前のマクロが MY_VALUE に定義され、main.f ファイルの事前処理に使用されます。

説明

  • クロスコンパイルする場合は、適切なツールチェーンファイルを指定する必要があります。
  • CMake の最新バージョンを使用していることを確認してください。


代替方法

以下に、CMAKE_Fortran_PREPROCESS の代替方法をいくつか紹介します。

Fortran コンパイラオプションを使用する

ほとんどの Fortran コンパイラは、事前処理を制御するためのオプションを提供しています。これらのオプションを使用して、マクロ展開、インクルードファイルの挿入、条件付きコンパイルなどを設定することができます。

以下の例は、gfortran コンパイラを使用してマクロ MY_MACRO を定義し、main.f ファイルの事前処理に使用するものです。

gfortran -DMY_MACRO=MY_VALUE main.f -o myprogram

Fortran プリプロセッサを使用する

Fortran プリプロセッサは、スタンドアロンのツールとして使用できます。プリプロセッサを使用して、ソースコードを事前処理し、#include ディレクティブを展開し、マクロを展開することができます。

以下の例は、cpp という名前の Fortran プリプロセッサを使用して main.f ファイルを事前処理し、出力ファイルを main.i に保存する方法を示します。

cpp main.f > main.i

CMake ターゲットプロパティを使用する

CMake ターゲットプロパティを使用して、特定のターゲットに対して事前処理設定を指定することができます。この方法は、複数のターゲットを持つプロジェクトで事前処理設定を個別に制御したい場合に便利です。

以下の例は、myprogram ターゲットに対して事前処理を無効にする方法を示します。

cmake_minimum_required(VERSION 3.18)
project(myproject LANGUAGES Fortran)

add_executable(myprogram main.f)
target_compile_options(myprogram PRIVATE -DCMAKE_Fortran_PREPROCESS=OFF)

CMake カスタムコマンドを使用する

CMake カスタムコマンドを使用して、独自の事前処理ロジックを実装することができます。この方法は、複雑な事前処理要件を満たす必要がある場合に便利です。

以下の例は、mypreprocess という名前の CMake カスタムコマンドを作成し、main.f ファイルを事前処理する方法を示します。

cmake_minimum_required(VERSION 3.18)
project(myproject LANGUAGES Fortran)

register_custom_command(MYPREPROCESS
  COMMAND ${CMAKE_Fortran_COMPILER} -E main.f > main.i
  OUTPUT_FILE main.i
)

add_executable(myprogram main.i)
add_dependencies(myprogram MYPREPROCESS)
  • CMake の最新バージョンを使用していることを確認してください。
  • 上記の代替方法はそれぞれ長所と短所があります。プロジェクトのニーズに合った方法を選択してください。
  • Fortran プリプロセッサドキュメント: (Fortran プリプロセッサごとにドキュメントを参照する必要があります)
  • Fortran コンパイラドキュメント: (Fortran コンパイラごとにドキュメントを参照する必要があります)