如何在configure中打印C宏的值

时间:2015-11-27 11:14:58

标签: linux linux-kernel autotools autoconf

我有configure.in脚本。我想调用configure(在autoheader && autoconf之后),并从系统标头PAGE_SHIFT中查看page_types.h宏的值。像这样:

checking PAGE_SHIFT... 12

我试过那些:

1

AC_CHECK_DECL([PAGE_SHIFT],[HAVE_PAGE_SHIFT=$PAGE_SHIFT],[],
[#include <linux/module.h>])
AC_MSG_NOTICE([${HAVE_PAGE_SHIFT}])

结果:检测到宏PAGE_SHIFT,但尚未打印

checking whether PAGE_SHIFT is declared... yes
configure:

2

HAVE_PAGE_SHIFT="Unknown"
AC_MSG_CHECKING([PAGE_SHIFT])
AC_COMPILE_IFELSE(
[
AC_LANG_PROGRAM([
#include <linux/module.h>
#include <stdio.h>
],
[
printf("%d\n", PAGE_SHIFT);
])],
[HAVE_PAGE_SHIFT="$PAGE_SHIFT"], [])
AC_MSG_RESULT([${HAVE_PAGE_SHIFT}])

结果:不起作用

checking PAGE_SHIFT... 

3

AC_MSG_CHECKING(['PAGE_SHIFT' value])
AC_RUN_IFELSE(
[
#include <linux/module.h>
#include <stdio.h>
int
main ()
{

    printf("%d\n", PAGE_SHIFT);
    return 0;
}
]
)

结果:有效,但不能与交叉编译一起使用

checking 'PAGE_SHIFT' value... 12
  1. 方法是Brett Hale的suggested
  2. Autoconf将生成如下内容:

    #include <linux/module.h>
    static long int longval () { return PAGE_SHIFT; }
    static unsigned long int ulongval () { return PAGE_SHIFT; }
    #include <stdio.h>
    #include <stdlib.h>
    

    结果:不适用于内核头文件

    In file included from /usr/include/stdlib.h:314:0,
                 from conftest.c:125:
    /usr/include/x86_64-linux-gnu/sys/types.h:44:18: error: conflicting types for 'loff_t'
    typedef __loff_t loff_t;
                  ^
    In file included from /lib/modules/4.2.0-18-generic/build/arch/x86/include/asm/page_types.h:5:0,
                 from [...],
                 from conftest.c:121:
    /lib/modules/4.2.0-18-generic/build/include/linux/types.h:45:26: note: previous declaration of 'loff_t' was here
    typedef __kernel_loff_t  loff_t;
    

    Autoconf版本:autoconf(GNU Autoconf)2.69

1 个答案:

答案 0 :(得分:2)

我建议使用AC_COMPUTE_INT宏。如,

AC_MSG_CHECKING(['PAGE_SHIFT' value])

AC_COMPUTE_INT([PAGE_SHIFT_VAL], [PAGE_SHIFT], [[#include <linux/module.h>]],
  AC_MSG_FAILURE([linux/module.h: could not determine 'PAGE_SHIFT' value]))

AC_MSG_RESULT([$PAGE_SHIFT_VAL])

或者,您可以将FAILURE宏替换为PAGE_SHIFT_VAL=0,并在错误可恢复的情况下测试(0)的值。

请注意,在此上下文中,变量名称PAGE_SHIFT_VAL并不神奇;你可以用另一个名字。如果您希望在生成的文件中替换此值(例如AC_SUBST)或config.h中列出的值,则仍需要AC_CONFIG_FILES