【初心者向け】CMake CheckSourceRunsの使い方: ソースコードのコンパイル・リンク・実行を検証


CMake モジュール "CheckSourceRuns" は、指定されたソースコードがコンパイル、リンク、実行できるかどうかを確認するためのツールです。これは、特定の言語やライブラリが利用可能かどうかを検証する際に役立ちます。

構文

check_source_runs(<lang> <code> <resultVar> [SRC_EXT <extension>])

引数

  • [SRC_EXT <extension>]: ソースコードの拡張子 (省略可、デフォルトは言語に対応)
  • <resultVar>: チェック結果を格納する変数
  • <code>: チェック対象のソースコード
  • <lang>: ソースコードの言語 (例: C, CXX, Fortran)

機能

  • チェック結果はキャッシュされ、次回の CMake 実行では再実行されません (キャッシュを無効化するには、resultVar 変数を手動で削除する必要があります)。
  • チェック結果を指定された変数に格納します。
  • 生成された実行ファイルが実行できるかどうかを確認します。
  • コンパイルされたオブジェクトがリンクできるかどうかを確認します。
  • ソースコードが指定された言語でコンパイルできるかどうかを確認します。

オプション

  • CMAKE_REQUIRED_QUIET: チェックの実行中にメッセージを出力しないようにします。
  • CMAKE_REQUIRED_LIBRARIES: リンク時に必要なライブラリを指定します。
  • CMAKE_REQUIRED_LINK_OPTIONS: リンク時に必要なオプションを設定します。
  • CMAKE_REQUIRED_INCLUDES: コンパイル時に必要なヘッダーファイルをインクルードします。
  • CMAKE_REQUIRED_DEFINITIONS: コンパイル時に必要なマクロ定義を設定します。
  • CMAKE_REQUIRED_FLAGS: コンパイル時に必要なフラグを設定します。

以下の例では、C 言語のソースコードがコンパイル、リンク、実行できるかどうかを確認します。

check_source_runs(C "
#include <stdio.h>

int main() {
  printf(\"Hello, world!\n\");
  return 0;
}
" HAS_C_SOURCE_RUNS)

この例では、HAS_C_SOURCE_RUNS 変数が 1 に設定されます。これは、ソースコードが正常にコンパイル、リンク、実行されたことを意味します。

応用例

  • クロスコンパイル環境での動作を確認する
  • 複雑なコンパイルやリンク設定が必要なコードをテストする
  • 特定の言語やライブラリが利用可能かどうかを検証する
  • チェック結果は、コンパイラやリンカーの設定、およびシステム環境によって異なる場合があります。
  • キャッシュ機能は、ソースコードが変更されていない場合のみ有効です。
  • CheckSourceRuns モジュールは CMake 3.19 以降で利用可能です。
  • この解説が、CMake モジュール "CheckSourceRuns" を理解するのに役立つことを願っています。


C 言語のソースコード

check_source_runs(C "
#include <stdio.h>

int main() {
  printf(\"Hello, world!\n\");
  return 0;
}
" HAS_C_SOURCE_RUNS)

message(STATUS "C language source code runs: ${HAS_C_SOURCE_RUNS}")

このコードは、以下の出力を生成します。

-- CheckSourceRuns: Checking whether C language source code runs...
-- -- Compiling the source code...
-- -- Linking the object code...
-- -- Running the executable...
-- CheckSourceRuns: C language source code runs: 1

C++ 言語のソースコード

check_source_runs(CXX "
#include <iostream>

int main() {
  std::cout << \"Hello, world!\" << std::endl;
  return 0;
}
" HAS_CXX_SOURCE_RUNS)

message(STATUS "C++ language source code runs: ${HAS_CXX_SOURCE_RUNS}")
-- CheckSourceRuns: Checking whether C++ language source code runs...
-- -- Compiling the source code...
-- -- Linking the object code...
-- -- Running the executable...
-- CheckSourceRuns: C++ language source code runs: 1

オプションの使用

以下のコードは、CMAKE_REQUIRED_FLAGS オプションを使用して、コンパイル時に -Wall フラグを指定する方法を示しています。

check_source_runs(C "
#include <stdio.h>

int main() {
  printf(\"Hello, world!\n\");
  return 0;
}
" HAS_C_SOURCE_RUNS CMAKE_REQUIRED_FLAGS "-Wall")

message(STATUS "C language source code runs with -Wall flag: ${HAS_C_SOURCE_RUNS}")
-- CheckSourceRuns: Checking whether C language source code runs with -Wall flag...
-- -- Compiling the source code with -Wall flag...
-- -- Linking the object code...
-- -- Running the executable...
-- CheckSourceRuns: C language source code runs with -Wall flag: 1

複数のソースファイルの使用

以下のコードは、複数のソースファイルを指定して、ソースコードがコンパイル、リンク、実行できるかどうかを確認する方法を示しています。

set(SOURCE_FILES main.c helper.c)

check_source_runs(C "${SOURCE_FILES}" HAS_C_SOURCE_RUNS)

message(STATUS "C language source code runs: ${HAS_C_SOURCE_RUNS}")

このコードは、main.chelper.c という名前の 2 つのソースファイルを指定します。

以下のコードは、resultVar 変数を手動で削除して、キャッシュを無効化する方法を示しています。

set(HAS_C_SOURCE_RUNS FALSE)

check_source_runs(C "
#include <stdio.h>

int main() {
  printf(\"Hello, world!\n\");
  return 0;
}
" HAS_C_SOURCE_RUNS)

message(STATUS "C language source code runs: ${HAS_C_SOURCE_RUNS}")


  • 複雑なコンパイルやリンク設定が必要な場合、設定が煩雑になることがあります。
  • チェック結果は、コンパイラやリンカーの設定、およびシステム環境によって異なる場合があります。
  • キャッシュ機能は、ソースコードが変更されていない場合のみ有効です。

これらの制限を克服するために、"CheckSourceRuns" の代替方法をいくつか検討することができます。

手動によるコンパイル、リンク、実行

最も単純な方法は、手動でソースコードをコンパイル、リンク、実行することです。これは、以下のコマンドを使用して行うことができます。

# コンパイル
g++ main.c helper.c -o main

# リンク
./main

# 実行
./main

この方法は、最も柔軟性があり、詳細な制御を提供しますが、時間も労力もかかります。

CMake の "try_compile" コマンド

CMake の "try_compile" コマンドを使用して、ソースコードがコンパイルできるかどうかを確認できます。

try_compile(HAS_C_COMPILE
  SOURCES main.c helper.c
  COMPILE_FLAGS "-Wall")

message(STATUS "C language source code compiles: ${HAS_C_COMPILE}")

この方法は、"CheckSourceRuns" よりも柔軟性があり、コンパイルフラグなどのオプションを指定できます。

CMake の "target_link_libraries" コマンド

CMake の "target_link_libraries" コマンドを使用して、ソースコードがリンクできるかどうかを確認できます。

add_executable(main main.c helper.c)

target_link_libraries(main REQUIRED CMsg)

message(STATUS "C language source code links: ${NOT HAS_LINK_ERROR}")

この方法は、"CheckSourceRuns" よりも簡潔で、ライブラリへのリンクを検証するのに役立ちます。

CMake 外部ツール

CMake 外部のツールを使用して、ソースコードがコンパイル、リンク、実行できるかどうかを確認することもできます。

これらのツールは、より高度なテスト機能と、"CheckSourceRuns" では提供されていないオプションを提供します。

最適な方法の選択

"CheckSourceRuns" の代替方法を選択する際には、以下の要素を考慮する必要があります。

  • 柔軟性: コンパイルフラグやリンクオプションなどのオプションを指定する必要があるか。
  • 複雑性: 手動でコマンドを実行するのか、CMake の組み込みコマンドを使用するのか、それとも外部ツールを使用するのか。
  • 必要性: 単にソースコードがコンパイルできるかどうかを確認したいのか、それともより詳細なテストを実行したいのか。