CMake: CMAKE_TRY_COMPILE_NO_PLATFORM_VARIABLES変数と代替方法


CMAKE_TRY_COMPILE_NO_PLATFORM_VARIABLESは、CMakeのtry_compile()コマンドで使用される変数で、テストプロジェクトにプラットフォーム変数を伝播しないように制御します。

try_compile()コマンドとプラットフォーム変数

try_compile()コマンドは、ソースコード片をコンパイルして、特定の機能がサポートされているかどうかを確認するために使用されます。このコマンドは、テストプロジェクトと呼ばれる一時的なプロジェクトを作成して、ソースコード片をコンパイルします。

テストプロジェクトを作成する際、try_compile()は、プラットフォームとツールチェーンの動作を構成するいくつかのCMake変数を自動的に伝播します。これらの変数は、CMAKE_<LANG>_FLAGSのような、CMakeにとって意味のあるものです。

さらに、CMAKE_TRY_COMPILE_PLATFORM_VARIABLES変数を使用して、ツールチェーンファイルにとって意味のあるカスタム変数をテストプロジェクトに渡すことができます。

CMAKE_TRY_COMPILE_NO_PLATFORM_VARIABLES変数の役割

CMAKE_TRY_COMPILE_NO_PLATFORM_VARIABLES変数をTRUEに設定すると、try_compile()コマンドは、プラットフォーム変数をテストプロジェクトに伝播しなくなります。これは、テストプロジェクトがプラットフォーム固有の変数の影響を受けないようにしたい場合に役立ちます。

具体的な使用方法

CMAKE_TRY_COMPILE_NO_PLATFORM_VARIABLES変数は、CMakeのキャッシュ設定ファイルまたはCMakeLists.txtファイルで設定できます。

# キャッシュ設定ファイルで設定
set(CMAKE_TRY_COMPILE_NO_PLATFORM_VARIABLES TRUE)
# CMakeLists.txtファイルで設定
cmake_minimum_required(VERSION 3.24)

set(CMAKE_TRY_COMPILE_NO_PLATFORM_VARIABLES TRUE)

try_compile(RESULT compile_test
  SOURCES test.c
)
  • CMAKE_TRY_COMPILE_NO_PLATFORM_VARIABLES変数は、CMake 3.24で導入されました。


# CMakeLists.txt

cmake_minimum_required(VERSION 3.24)

set(CMAKE_TRY_COMPILE_NO_PLATFORM_VARIABLES TRUE)

# テストソースコード
set(TEST_SOURCE_CODE main.cpp)

# テストソースコードをコンパイル
try_compile(RESULT compile_test
  SOURCES ${TEST_SOURCE_CODE}
)

# テスト結果の確認
if(NOT RESULT)
  message(FATAL_ERROR "テストのコンパイルに失敗しました。")
endif()
  1. cmake_minimum_required(VERSION 3.24): CMake 3.24以降が必要であることを宣言します。
  2. set(CMAKE_TRY_COMPILE_NO_PLATFORM_VARIABLES TRUE): CMAKE_TRY_COMPILE_NO_PLATFORM_VARIABLES変数をTRUEに設定し、テストプロジェクトにプラットフォーム変数を伝播しないようにします。
  3. set(TEST_SOURCE_CODE main.cpp): テスト対象のソースコードファイルをmain.cppに設定します。
  4. try_compile(RESULT compile_test SOURCES ${TEST_SOURCE_CODE}): try_compile()コマンドを使用して、main.cppファイルをコンパイルします。コンパイル結果をRESULT変数に格納します。
  5. if(NOT RESULT): コンパイルが失敗した場合、message()コマンドを使用してエラーメッセージを出力します。
  • try_compile()コマンドは、様々なオプションをサポートしています。詳細は、CMakeドキュメントを参照してください。
  • テスト結果の確認方法は、ニーズに合わせて変更できます。
  • テスト対象のソースコードファイルは、TEST_SOURCE_CODE変数で設定できます。


ツールチェーンファイルを使用する

ツールチェーンファイルを使用して、テストプロジェクト専用のビルド設定を定義することができます。ツールチェーンファイルには、プラットフォーム固有の変数を設定したり、カスタムビルドルールを定義したりすることができます。

# toolchain.cmake

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_C_COMPILER gcc)
set(CMAKE_CXX_COMPILER g++)

# ... 他のビルド設定 ...

CMakeLists.txtファイルで、以下のコマンドを使用してツールチェーンファイルを指定できます。

cmake_minimum_required(VERSION 3.15)

set(CMAKE_TOOLCHAIN_FILE toolchain.cmake)

# ... 他のCMakeコマンド ...

CMAKE_TRY_COMPILE_ARGS変数を使用する

CMAKE_TRY_COMPILE_ARGS変数を使用して、try_compile()コマンドに渡されるコマンドライン引数を設定することができます。この変数を使用して、プラットフォーム固有の影響を与える可能性のあるオプションを無効にすることができます。

cmake_minimum_required(VERSION 3.20)

set(CMAKE_TRY_COMPILE_ARGS "-Wno-deprecated-declarations")

try_compile(RESULT compile_test
  SOURCES test.c
)

カスタムCMakeモジュールを使用する

カスタムCMakeモジュールを作成して、テストプロジェクトをセットアップおよび管理することができます。このモジュール内で、プラットフォーム固有の影響を受けないようにするためのロジックを実装することができます。

# custom_test_module.cmake

# テストプロジェクトをセットアップする関数
function(setup_test_project)
  # プラットフォーム固有の影響を与える可能性のある変数を設定
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")

  # テストソースコードをコンパイル
  try_compile(RESULT compile_test
    SOURCES test.cpp
  )

  # テスト結果の確認
  if(NOT RESULT)
    message(FATAL_ERROR "テストのコンパイルに失敗しました。")
  endif()
endfunction()

# setup_test_project関数を呼び出す
setup_test_project()

CMakeLists.txtファイルで、以下のコマンドを使用してカスタムモジュールをインクルードできます。

cmake_minimum_required(VERSION 3.0)

include(custom_test_module)

手動でテストプロジェクトを構築する

CMakeを使用せずに、手動でテストプロジェクトを構築することもできます。この方法には、プラットフォーム固有の影響を与える可能性のある設定を明示的に指定する必要があります。

手順

  1. テストソースコードファイルを個別のディレクトリにコピーします。
  2. ディレクトリ内で、プラットフォーム固有の影響を与える可能性のある設定を指定するMakefileまたはCMakeLists.txtファイルを作成します。
  3. MakefileまたはCMakeLists.txtを使用して、テストソースコードファイルをコンパイルします。

注意事項

上記の代替方法は、それぞれ長所と短所があります。最適な方法は、特定のニーズによって異なります。

  • 手動でのテストプロジェクトの構築は、最も単純な方法ですが、最もエラーが発生しやすくなります。
  • カスタムCMakeモジュールは、柔軟性と制御性を提供しますが、開発労力が必要です。
  • CMAKE_TRY_COMPILE_ARGS変数は、単純なオプションを無効にするのに役立ちますが、より複雑なロジックには適していません。
  • ツールチェーンファイルは、プラットフォーム固有の影響を排除する最も強力な方法ですが、設定が複雑になる可能性があります。