2017-04-04 14 views
1

feature test macrosに基づいて条件付きで提供される特定のLinux/POSIX機能を使用したいとします。たとえば、タイプcpu_set_t、マクロCPU_SET_ZERO、および機能sched_setaffinityです。CMakeはglibc機能テストマクロをサポートしています

理想的には私はそれらに必要なことをCMakeに伝えたいと思います。また、現行のシステムでは提供できない場合には、特別な機能テストマクロを設定したり失敗したりするのがいいでしょう。それは可能ですか?

私はthemanpagesで検索し、手動でadd_definitions(-D_GNU_SOURCE)を使用できることを承知していますが、POSIX標準の異なるバージョンで導入され、廃止され、複数の機能が組み合わされたら、それは退屈になることができます。私の経験では、glibc実装のさまざまなバージョン間で移植性を維持することが難しくなる可能性があります。

CMake platform checksがありますが、確認に役立つように見えます。だから、makeではなくcmakeの間にエラーが発生しますが、手動で正しい機能テストマクロを見つけなければなりません。

cmake-compile-featuresは、ライブラリではなくコンパイラに直接関連する機能のみを提供するようです。

答えて

0

関数または変数が存在するかどうかを調べたい場合は、CheckSymbolExistsモジュールを使用できます。同様に、structのためにCheckStructHasMemberがあります(あなたが確認できる標準メンバーがあると仮定します)。だから、:

include (CheckSymbolExists) 
include (CheckStructHasMember) 

CHECK_SYMBOL_EXISTS(CPU_SET_ZERO sched.h CPU_SET_ZERO_exists) 
CHECK_SYMBOL_EXISTS(sched_setaffinity sched.h sched_setaffinity_exists) 
CHECK_STRUCT_HAS_MEMBER(cpu_set_t <member?> sched.h cpu_set_t_exists) 

cpu_set_tが不透明タイプであることが表示されますので、代わりにあなたはtry_compileコマンドのためのフロントエンドですCheckCXXSourceCompilesモジュールを、使用することができます。特定のコードがコンパイルされているかどうかを判断する一般的な方法です。 try_compileは、 'base' CMakeが機能を決定するために広く使用されます(Modulesディレクトリの検索を試してください)。基本的に、最小限のソースファイルに渡します。このファイルは、機能が存在しない場合はコンパイルに失敗し、結果をCMakeスクリプトに報告します。

関連する問題