CMake モジュール CheckFortranFunctionExists を使って Fortran 関数の存在を確認する方法


構文

CheckFortranFunctionExists(FUNCTION_NAME VARIABLE)

引数

  • VARIABLE: 検査結果を格納する変数名
  • FUNCTION_NAME: 検査対象のFortran関数の名前

動作

  1. CMake は、指定されたFortran関数がシステムで使用可能かどうかを調べます。
  2. 関数が存在する場合、VARIABLETRUE が設定されます。
  3. 関数が存在しない場合、VARIABLEFALSE が設定されます。

CheckFortranFunctionExists(sqrt FORTRAN_HAS_SQRT)

if (FORTRAN_HAS_SQRT)
  message(STATUS "Fortran sqrt function is available")
else()
  message(STATUS "Fortran sqrt function is not available")
endif()

この例では、sqrt 関数が存在するかどうかを確認します。関数が存在する場合、FORTRAN_HAS_SQRT 変数に TRUE が設定され、message コマンドでそのことが出力されます。関数が存在しない場合、FORTRAN_HAS_SQRT 変数に FALSE が設定され、別の方法で sqrt 関数の機能を提供する必要があることを示すメッセージが出力されます。

  • Fortran関数の可用性を判断するより確実な方法は、CheckSourceCompiles コマンドを使用して、関数を呼び出す短いFortranソースコードをコンパイルするかどうかのテストを実行することです。
  • CheckFortranFunctionExists は、Fortranモジュール内の関数を検出しません
  • CMake のモジュール機能を活用することで、複雑なプロジェクトの構築と管理を容易にすることができます。
  • CheckFortranFunctionExists は、Fortranライブラリやモジュールの使用を前提としたプロジェクトでよく使用されるモジュールです。
  • CMake モジュールは、特定のタスクを実行するために CMake に拡張機能を追加する再利用可能なスクリプトです。


cmake_minimum_required(VERSION 3.10)

project(FortranFunctionExistsExample)

# Fortranのソースコードを指定
set(FORTRAN_SOURCES main.f)

# Fortranコンパイラを指定
set(CMAKE_Fortran_COMPILER gfortran)

# CheckFortranFunctionExists を使用して sqrt 関数の存在を確認
CheckFortranFunctionExists(sqrt FORTRAN_HAS_SQRT)

# メッセージ出力
if (FORTRAN_HAS_SQRT)
  message(STATUS "Fortran sqrt function is available")
else()
  message(STATUS "Fortran sqrt function is not available")
endif()

# Fortranソースコードをコンパイル
add_executable(FortranFunctionExistsExample ${FORTRAN_SOURCES})

コードの説明

  1. cmake_minimum_required コマンドで、必要な CMake バージョンを指定します。
  2. project コマンドで、プロジェクトの名前を設定します。
  3. set コマンドで、Fortran ソースコードファイルと Fortran コンパイラを指定します。
  4. CheckFortranFunctionExists コマンドを使用して、sqrt 関数の存在を確認します。
  5. if ステートメントを使用して、sqrt 関数が存在するかどうかを確認します。
  6. 関数が存在する場合、message コマンドを使用してそのことを出力します。
  7. 関数が存在しない場合、別の方法で sqrt 関数の機能を提供する必要があることを示すメッセージが出力されます。
  8. add_executable コマンドを使用して、Fortran ソースコードファイルをコンパイルします。

実行方法

このコードを実行するには、以下のコマンドを実行します。

cmake .
make

このコマンドを実行すると、FortranFunctionExistsExample という名前の実行可能ファイルが作成されます。このファイルを実行すると、以下のメッセージが出力されます。

Fortran sqrt function is available

このメッセージは、sqrt 関数が存在することを示しています。

  • CMake モジュールに関する詳細については、CMake の公式ドキュメントを参照してください。
  • 実際のプロジェクトでは、より複雑な条件や処理が必要になる場合があります。
  • このコードは、CMake モジュールの CheckFortranFunctionExists を使用する方法を示す簡単な例です。


CheckSourceCompiles コマンドの使用

CheckSourceCompiles コマンドは、Fortran ソースコードをコンパイルして、特定の関数が存在するかどうかを確認します。この方法は、CheckFortranFunctionExists コマンドよりも柔軟性が高く、Fortran モジュール内の関数も検出できます。

CheckSourceCompiles(
  TEST_CODE "
    integer :: i
    call sqrt(i)
  "
  FORTRAN_HAS_SQRT)

if (FORTRAN_HAS_SQRT)
  message(STATUS "Fortran sqrt function is available")
else()
  message(STATUS "Fortran sqrt function is not available")
endif()

この例では、sqrt 関数を呼び出す短い Fortran ソースコードをコンパイルします。コンパイルが成功した場合、FORTRAN_HAS_SQRT 変数に TRUE が設定されます。

手動によるヘッダーファイルのインクルード

Fortran ヘッダーファイルを手動でインクルードすることで、特定の関数が存在するかどうかを確認できます。

if (HAVE_FORTRAN_STDINT)
  include(stdint.h)
else()
  message(STATUS "stdint.h header file is not available")
endif()

この例では、stdint.h ヘッダーファイルが存在するかどうかを確認します。ヘッダーファイルが存在する場合、stdint.h がインクルードされます。ヘッダーファイルが存在しない場合、stdint.h ヘッダーファイルが存在しないことを示すメッセージが出力されます。

pkg-config ツールの使用

pkg-config ツールを使用して、Fortran ライブラリやモジュールの情報にアクセスできます。

find_package(PkgConfig REQUIRED)
pkg_check_modules(FORTRAN_MODULE math)

if (FORTRAN_MODULE_FOUND)
  message(STATUS "Fortran math module is available")
else()
  message(STATUS "Fortran math module is not available")
endif()

この例では、math という名前の Fortran モジュールが存在するかどうかを確認します。モジュールが存在する場合、FORTRAN_MODULE_FOUND 変数に TRUE が設定されます。

システムコマンドの使用

system コマンドを使用して、Fortran 関数の存在を確認するシェルスクリプトを実行できます。

system(sh -c "if fortran -c -E 'sqrt(0)' ; then echo 'sqrt function is available' ; fi")

この例では、シェルスクリプトを実行して sqrt 関数の存在を確認します。スクリプトが成功した場合、sqrt 関数が存在することを示すメッセージが出力されます。

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

どの方法を選択するかは、プロジェクトの要件と開発者の好みによって異なります。一般的には、以下の点が考慮されます。

  • 制御: system コマンドは、最も詳細な制御を提供しますが、最も複雑な方法でもあります。
  • 移植性: pkg-config ツールは、システム間で移植性のある方法を提供します。
  • 簡潔性: CheckFortranFunctionExists コマンドは、最も簡潔で使いやすい方法です。
  • 柔軟性: CheckSourceCompiles コマンドは、Fortran モジュール内の関数も検出できるため、最も柔軟性があります。