2017-10-12 9 views
0

Je sais que je peux utiliser AC_CHECK_DECL/AC_CHECK_DECLS pour vérifier si un ensemble d'en-têtes fournit une déclaration pour un identificateur spécifié, mais comment puis-je vérifier non seulement si une macro est déclarée, mais aussi si son expansion répond à mes critères? Plus précisément, je voudrais vérifier si numa.h contient une définition de macro équivalent à cette ...Vérifier la valeur de C#define avec autoconf

#define LIBNUMA_API_VERSION 2 

... y compris la valeur spécifique « 2 ».

MISE À JOUR: tête <numa.h> contient une définition telle que #define LIBNUMA_API_VERSION 2 de déclarer sa version. code C qui utilise cet en-tête utilise généralement comme ceci:

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

Je veux déterminer la version d'en-tête NUMA avec autoconf et définir une macro qui transmet de façon succincte si la version NUMA 2 est fourni. i.e. .:

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

qui pourrait être utilisé comme ceci:

#ifdef NUMA_VERSION_2 
.... 
#endif 

Est-il possible? Je n'arrive pas à déterminer comment je pourrais définir la valeur de la variable have_numa_v2 dans mon fichier Autoconf.

+3

Vérifier d'où? De makefile? Script Shell Code C? – dbrank0

+0

L'OP dit de numa.h – Fredrik

+0

Si je comprends bien, cette définition fait partie de numa.h. Mais peut-être pas. – dbrank0

Répondre

3

Vous pouvez utiliser AC_COMPILE_IFELSE ou AC_RUN_IFELSE avec un programme de test adéquatement structuré pour déterminer si la macro est définie sur une valeur spécifique que vous désignez. Par exemple, en supposant que la langue courante est C:

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]) 

qui construit un programme dont la valeur retournée dépend si LIBNUMA_API_VERSION est définie comme une macro, et si oui, si elle se développe à 2. Si Autoconf ne peut pas le compiler (parce que, par exemple, il ne peut pas trouver numa.h) ou s'il quitte avec un statut autre que 0 alors rien d'autre ne se passe ($have_numa_v2 conserve sa valeur assignée de "no"). Sinon, l'affectation dans le deuxième argument est effectuée et $have_numa_v2 se termine par la valeur "yes".

Pour ce que ça vaut la peine, la source du programme de test particulier produit et utilisé par cette macro contient des définitions de macros Autoconf standard, plus ceci:

#include <numa.h> 

int 
main() 
{ 

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

    ; 
    return 0; 
} 

La version en utilisant AC_COMPILE_IFELSE serait similaire, mais construit en utilisant une directive de préprocesseur #error pour faire échouer la compilation si la macro n'est pas définie à la valeur spécifiée. Cette variation pourrait être un meilleur choix si vous prévoyez que votre programme sera compilé de façon croisée pour une architecture étrangère.