グローバル変数 CMAKE_C_KNOWN_FEATURES の詳細

2024-05-24

CMake の "Properties of Global Scope" における "CMAKE_C_KNOWN_FEATURES" の詳細解説

"CMAKE_C_KNOWN_FEATURES" は、CMake の "Properties of Global Scope" に属するグローバル変数であり、現在使用しているCMakeバージョンで認識されているC言語機能のリストを提供します。このリストは、ターゲットのコンパイル時に使用できるC言語機能を決定するのに役立ちます。

機能

"CMAKE_C_KNOWN_FEATURES" には、以下の機能が含まれます。

  • C言語標準
    • c_std_90: C言語標準90
  • C言語機能
    • c_function_prototypes: 関数プロトタイプ
    • c_restrict: restrict キーワード
    • c_static_assert: 静的アサート
    • c_variadic_macros: 可変マクロ

使用方法

  1. CMakeLists.txtファイルで、target_compile_features コマンドを使用して、ターゲットにコンパイルするC言語機能を指定します。
  2. target_compile_features コマンドの引数として、CMAKE_C_KNOWN_FEATURES にリストされている機能名を指定します。

target_compile_features(my_target PUBLIC c_std_11 c_restrict)

上記の例では、my_target ターゲットはC言語標準11と restrict キーワードを使用してコンパイルされます。

注意事項

  • "CMAKE_C_KNOWN_FEATURES" にリストされている機能が、必ずしも現在のCコンパイラで利用できるとは限りません。
  • 実際のCコンパイラで利用できる機能を確認するには、CMAKE_C_COMPILE_FEATURES 変数を使用する必要があります。

    補足

    "CMAKE_C_KNOWN_FEATURES" は、CMake 3.1以降で使用できます。古いバージョンのCMakeを使用している場合は、この機能を使用できない可能性があります。

    "CMAKE_C_KNOWN_FEATURES" は、CMake でC言語機能を管理するのに役立つ便利なグローバル変数です。この変数を理解することで、ターゲットのコンパイル時に必要なC言語機能を正確に指定することができます。



    CMakeの"Properties of Global Scope"における"CMAKE_C_KNOWN_FEATURES"のサンプルコード

    cmake_minimum_required(VERSION 3.1)
    
    project(myproject)
    
    target_compile_features(mytarget PUBLIC c_std_11 c_restrict)
    
    add_executable(myprogram mytarget.c)
    

    この例では、以下の操作を行います。

    1. CMakeの最低バージョンを3.1に設定します。
    2. myprojectという名前のプロジェクトを作成します。
    3. mytargetという名前のターゲットを作成し、C言語標準11とrestrictキーワードを公開機能として指定します。
    4. mytarget.cソースファイルからmyprogramという名前の実行可能ファイルを作成します。

    例2: CMAKE_C_KNOWN_FEATURESを使用してコンパイラ機能を確認する

    cmake_minimum_required(VERSION 3.1)
    
    project(myproject)
    
    message(STATUS "CMAKE_C_KNOWN_FEATURES: ${CMAKE_C_KNOWN_FEATURES}")
    
    target_compile_features(mytarget PUBLIC c_std_11 c_restrict)
    
    add_executable(myprogram mytarget.c)
    
    1. CMAKE_C_KNOWN_FEATURESグローバル変数の内容をコンソールに出力します。

    例3: 特定のC言語コンパイラ機能を有効にする

    cmake_minimum_required(VERSION 3.1)
    
    project(myproject)
    
    if(CMAKE_C_COMPILER_ID MATCHES "GNU")
        target_compile_features(mytarget PUBLIC c_xcor)
    endif()
    
    add_executable(myprogram mytarget.c)
    
    1. 使用しているCコンパイラがGNUコンパイラである場合、c_xcor機能をmytargetターゲットの公開機能として指定します。

    上記の例はあくまでもサンプルであり、実際の使用状況に合わせて変更する必要があります。



      CMake で C 言語機能を管理するその他の方法

      CMAKE_C_COMPILER_FLAGS 変数を使用して、C コンパイラに渡されるフラグを指定できます。この変数に、C 言語機能を有効にするフラグを追加することで、ターゲットのコンパイル時に必要な機能を指定できます。

      target_compile_features(mytarget PUBLIC CFLAGS "-std=c11 -Wno-restrict")
      

      CMAKE_C_FLAGS 変数は、プロジェクト全体の C コンパイラフラグを指定するために使用されます。この変数に、C 言語機能を有効にするフラグを追加することで、プロジェクト内のすべてのターゲットで必要な機能を指定できます。

      set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11 -Wno-restrict")
      

      CMAKE_CXX_KNOWN_FEATURES 変数は、C++ 言語機能のリストを提供します。この変数は、CMake 3.10 以降で使用できます。

      CMAKE_CXX_COMPILER_FLAGS 変数は、C++ コンパイラに渡されるフラグを指定するために使用されます。この変数は、CMake 3.10 以降で使用できます。

      • 特定のターゲットに対してのみC言語機能を有効にしたい場合は、target_compile_features コマンドを使用するのが最善です。
      • プロジェクト全体のCコンパイラフラグを変更したい場合は、CMAKE_C_FLAGS 変数を使用するのが最善です。
      • C++ 言語機能を管理したい場合は、CMAKE_CXX_KNOWN_FEATURESCMAKE_CXX_COMPILER_FLAGS、または CMAKE_CXX_FLAGS 変数を使用する必要があります。
      • 使用するフラグ名は、使用しているCコンパイラによって異なる場合があります。詳細は、Cコンパイラのドキュメントを参照してください。
      • 複数のフラグを指定する場合は、スペースで区切ります。