2017-10-12 3 views
0

AC_CHECK_DECL/AC_CHECK_DECLSを使用して、指定された識別子の宣言があるかどうかを確認できますが、マクロが宣言されているかどうかだけでなく、私の基準を満たしている?具体的には、私は特定の値「2」を含む... ... numa.hはこれにマクロ定義相当が含まれているかどうかC#defineの値をautoconfで確認する

#define LIBNUMA_API_VERSION 2 

をチェックしたいと思います。

UPDATE<numa.h>ヘッダは、それがバージョンだ宣言するために、このような#define LIBNUMA_API_VERSION 2などの定義が含まれています。このヘッダを使用するCコードは、典型的にそうようにそれを使用する:

#if defined(LIBNUMA_API_VERSION) && LIBNUMA_API_VERSION >= 2 
.... 
#endif 

私はautoconfとNUMAヘッダのバージョンを決定し、簡潔NUMAバージョン2が設けられているかどうかを伝えるマクロを定義します。すなわち:

if test "$have_numa_v2" = "yes" ; then 
    AC_DEFINE(NUMA_VERSION_2, 1, [Determine whether NUMA v2 available) 
fi 

そうのように使用することができます:

#ifdef NUMA_VERSION_2 
.... 
#endif 

それは可能ですか?私は変数have_numa_v2の値を自分のAutoconfファイルにどのように設定できるかを決定するのに問題があります。

+3

どこからチェックしますか?メイクファイルから?シェルスクリプト? Cコード? – dbrank0

+0

OPはnuma.hからです – Fredrik

+0

私が理解するように、この定義はnuma.hの一部です。しかし、そうでないかもしれない。 – dbrank0

答えて

3

適切に構造化されたテストプログラムでAC_COMPILE_IFELSEまたはAC_RUN_IFELSEを使用して、マクロが指定された特定の値に定義されているかどうかを判断できます。例えば、現在の言語と仮定すると、Cである:

それは 2に展開するかどうか、もしそうであれば、戻り値 LIBNUMA_API_VERSIONがマクロとして定義されているかどうかに依存するプログラムを構築し、
have_numa_v2=no 
AC_RUN_IFELSE([AC_LANG_PROGRAM([ 
#include <numa.h> 
],[ 
#if LIBNUMA_API_VERSION != 2 
exit(1); 
#endif 
])], [have_numa_v2=yes]) 

。 Autoconfがコンパイルできない場合(numa.hが見つからないなど)、または0以外の状態で終了した場合、何も起こりません($have_numa_v2は割り当てられた値"no"を保持します)。それ以外の場合は、第2引数の代入が実行され、$have_numa_v2は値"yes"で終了します。何が価値がある、そのマクロによって生成され、使用される特定のテストプログラムのソースは、いくつかのAutoconf標準のマクロ定義が含まれている、プラスこのため

#include <numa.h> 

int 
main() 
{ 

#if LIBNUMA_API_VERSION != 2 
exit(1); 
#endif 

    ; 
    return 0; 
} 

AC_COMPILE_IFELSEを使用したバージョンは似ているが、構築されますマクロが指定された値に定義されていない場合は、#errorプリプロセッサディレクティブを使用してコンパイルに失敗することがあります。そのバリエーションは、あなたのプログラムが外国建築のためにクロスコンパイルされる可能性を予期するなら、より良い選択かもしれません。