CMake モジュール CheckFortranFunctionExists を使って Fortran 関数の存在を確認する方法
構文
CheckFortranFunctionExists(FUNCTION_NAME VARIABLE)
引数
- VARIABLE: 検査結果を格納する変数名
- FUNCTION_NAME: 検査対象のFortran関数の名前
動作
- CMake は、指定されたFortran関数がシステムで使用可能かどうかを調べます。
- 関数が存在する場合、
VARIABLE
にTRUE
が設定されます。 - 関数が存在しない場合、
VARIABLE
にFALSE
が設定されます。
例
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})
コードの説明
cmake_minimum_required
コマンドで、必要な CMake バージョンを指定します。project
コマンドで、プロジェクトの名前を設定します。set
コマンドで、Fortran ソースコードファイルと Fortran コンパイラを指定します。CheckFortranFunctionExists
コマンドを使用して、sqrt
関数の存在を確認します。if
ステートメントを使用して、sqrt
関数が存在するかどうかを確認します。- 関数が存在する場合、
message
コマンドを使用してそのことを出力します。 - 関数が存在しない場合、別の方法で
sqrt
関数の機能を提供する必要があることを示すメッセージが出力されます。 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 モジュール内の関数も検出できるため、最も柔軟性があります。