Fortranコンパイラ固有のオプションを使用してFortranソースコードをプリプロセスする方法

2024-04-06

CMakeにおけるCMAKE_Fortran_PREPROCESS変数の詳細解説

CMAKE_Fortran_PREPROCESSは、CMakeプロジェクト内のFortranソースコードのプリプロセスを制御するブール型の変数です。デフォルトはONに設定されており、Fortranソースコードがコンパイル前にプリプロセスされます。

機能

  • Fortranソースコードのプリプロセスの有効化/無効化:

    • ON: Fortranソースコードがコンパイル前にプリプロセスされます。
    • OFF: Fortranソースコードはプリプロセスされずにコンパイルされます。
  • 特定のターゲットに対するプリプロセスの制御:

    • target_compile_options()コマンドを使用して、特定のターゲットに対してCMAKE_Fortran_PREPROCESS変数を設定できます。
    • 個々のFortranソースファイルに対して、Fortran_PREPROCESSプロパティを設定することもできます。

使用例

例1: 全てのFortranソースコードのプリプロセスを無効にする

set(CMAKE_Fortran_PREPROCESS OFF)

add_executable(my_app main.f90)

この例では、CMAKE_Fortran_PREPROCESS変数をOFFに設定することで、プロジェクト内の全てのFortranソースコードのプリプロセスが無効化されます。

例2: 特定のターゲットに対してのみプリプロセスを有効にする

add_library(my_lib
    lib.f90
    other.f90)

target_compile_options(my_lib
    PRIVATE
    CMAKE_Fortran_PREPROCESS ON)

add_executable(my_app
    main.f90
    $<TARGET_OBJECTS:my_lib>)

この例では、my_libターゲットに対してのみCMAKE_Fortran_PREPROCESS変数をONに設定することで、my_libターゲットに属するFortranソースコードのみがプリプロセスされます。

注意事項

  • 一部のFortranコンパイラでは、CMAKE_Fortran_PREPROCESS変数をOFFに設定しても、ソースコードのプリプロセスが実行される場合があります。
  • Ninjaジェネレータを使用している場合は、CMAKE_Fortran_PREPROCESS変数をOFFに設定しても、モジュール依存関係情報の生成のためにソースコードがプリプロセスされる場合があります。

補足

  • CMAKE_Fortran_PREPROCESS変数は、CMakeバージョン3.18以降で導入されました。
  • Fortranソースコードのプリプロセスは、条件付きコンパイルやマクロの展開など、様々な目的に使用できます。


CMakeにおけるCMAKE_Fortran_PREPROCESS変数のサンプルコード

set(CMAKE_Fortran_PREPROCESS OFF)

add_executable(my_app main.f90)

例2: 特定のターゲットに対してのみプリプロセスを有効にする

add_library(my_lib
    lib.f90
    other.f90)

target_compile_options(my_lib
    PRIVATE
    CMAKE_Fortran_PREPROCESS ON)

add_executable(my_app
    main.f90
    $<TARGET_OBJECTS:my_lib>)

例3: 特定のソースファイルに対してのみプリプロセスを無効にする

add_executable(my_app
    main.f90
    other.f90)

set_property(SOURCE other.f90
    PROPERTY Fortran_PREPROCESS OFF)

例4: マクロ定義を使用してプリプロセスを制御する

set(CMAKE_Fortran_PREPROCESS_DEF "-DDEBUG")

add_executable(my_app main.f90)

例5: 条件付きコンパイルを使用してプリプロセスを制御する

if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    set(CMAKE_Fortran_PREPROCESS_DEF "-DDEBUG")
endif()

add_executable(my_app main.f90)


CMakeにおけるCMAKE_Fortran_PREPROCESS変数以外のFortranソースコードのプリプロセス方法

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

Fortranコンパイラには、ソースコードのプリプロセスを制御するためのオプションが用意されています。

例:

  • GNU Fortran (gfortran):
gfortran -cpp -o main main.f90
  • Intel Fortran (ifort):
ifort -cpp -o main main.f90

Makefileを使用して、Fortranソースコードのコンパイルとプリプロセスを同時に実行することができます。

例:

main: main.f90
    $(FC) -cpp -o main main.f90

clean:
    rm -f main

専用のプリプロセッサを使用する

Fortranソースコード専用のプリプロセッサを使用することもできます。

これらの方法は、CMAKE_Fortran_PREPROCESS変数を使用するよりも柔軟性がありますが、設定が複雑になる場合があります。




CMakeコマンド「ctest_submit()」でテスト結果をCDashサーバーに送信

ctest_submit()は、CMakeの「Commands」カテゴリに属するコマンドで、テスト結果をCDashなどのダッシュボードサーバーに送信するために使用されます。テスト実行後の結果を可視化、共有したい場合に役立ちます。基本構文オプション解説



CMakeにおける"get_target_property()"コマンド: ターゲットの情報を自在に操る

get_target_property()コマンドは、CMakeプロジェクトで定義されたターゲットからプロパティを取得するために使用されます。ターゲットプロパティは、ターゲットのビルド方法や動作を制御するために使用される情報です。構文引数VAR: ターゲットプロパティの値を格納する変数名


CMakeのCommandsにおけるuse_mangled_mesa()

use_mangled_mesa() は CMake の Commands における関数で、Mesa ライブラリの mangled シンボル名を解決するために使用されます。Mesa は OpenGL の実装であり、古いバージョンの Mesa ではシンボル名が mangled されるため、use_mangled_mesa() を使用してこれらのシンボル名を解決する必要があります。


CMake try_compile() を使って特定のライブラリがインストールされているかどうかを確認する方法

try_compile() は、CMake の強力なコマンドの一つで、コードを実際にコンパイルすることなく、コンパイルが成功するかどうかを確認することができます。これは、特定のコンパイラやオプションがシステム上で使用可能かどうかをテストしたり、コードの移植性を検証したりする際に非常に便利です。


CMakeコマンド mark_as_advanced() の詳細解説

mark_as_advanced() は、CMakeプロジェクトで特定のキャッシュ変数を "詳細設定" としてマークするために使用されるコマンドです。このコマンドによって、GUI ツールでこれらの変数はデフォルトでは表示されなくなり、ユーザーは "詳細設定" オプションを有効にするまで編集できなくなります。



FindRTIモジュール vs 手動設定:CMakeでRTIを使う際の比較

FindRTI モジュールは、CMake プロジェクトで HLA 標準に準拠した RTI (Run-Time Infrastructure) を簡単に検出して利用できるようにするモジュールです。このモジュールを使用することで、プロジェクト内で RTI のインストール場所やヘッダーファイル、ライブラリを自動的に設定できます。


回答:CMake は、ポリシー設定スタックを維持します。このスタックには、設定されたすべてのポリシー設定が含まれています。 cmake_policy コマンドを使用して設定されたポリシー設定は、スタックの最上位に追加されます。

CMake のポリシーは、プロジェクトのビルド方法を制御するためのメカニズムです。CMake の新しいバージョンがリリースされると、古いバージョンの CMake との互換性を維持するために、ビルド動作が変更される場合があります。ポリシーを使用すると、プロジェクトが特定のバージョンの CMake でビルドされる場合に、古い動作または新しい動作を選択することができます。


C++ソースコードの動作検証:CheckCXXSourceRuns vs その他の方法

CheckCXXSourceRuns は、CMake のモジュールの一つで、C++ ソースコードが正しくコンパイルされ、実行できるかどうかを確認するために使用されます。これは、プロジェクトで必要な機能がサポートされているかどうか、または特定のコンパイラオプションが正しく動作するかどうかを検証するのに役立ちます。


CMake の INTERFACE_SYSTEM_INCLUDE_DIRECTORIES とは?

INTERFACE_SYSTEM_INCLUDE_DIRECTORIES は、CMake のターゲットプロパティの一つであり、他のターゲットがこのターゲットを依存関係として使用する際に、コンパイル時に自動的に追加されるシステムヘッダーディレクトリを指定します。これは、ターゲットが提供するインターフェースの一部として公開されるヘッダーファイルへのパスを指定するために使用されます。


CMake: CTEST_CUSTOM_TESTS_IGNOREを使ってテストを制御する方法

CTEST_CUSTOM_TESTS_IGNORE は、CMake の ctest_test() コマンドで実行されるテストを制御するための変数です。これは、特定のテストをテスト実行から除外したい場合に役立ちます。構文説明<REGULAR_EXPRESSION_LIST> は、除外したいテストの名前を記述する正規表現のリストです。