【问题标题】:How to print value of C macro in configure如何在配置中打印 C 宏的值
【发布时间】:2015-11-27 11:14:57
【问题描述】:

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

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. 方法是 suggested,作者是 Brett Hale

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

【问题讨论】:

    标签: linux linux-kernel autotools autoconf


    【解决方案1】:

    我建议使用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中列出的那些。

    【讨论】:

    • 谢谢。您的方法不适用于内核头文件。 Autoconf 制作了这段代码#include &lt;linux/module.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; [...] 结果: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' In file included 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
    • @RomanZaytsev - 您需要了解 Linux 构建 Makefile 的工作原理,以及如何使用 gcc 包含路径、CFLAGS、sysroot 选项设置内核(交叉)编译 - 这是“独立”的,等
    • 看来我的问题太宽泛了,取决于交叉编译标志等。我接受你的回答,因为它对非内核头文件是正确的。
    猜你喜欢
    • 2023-03-13
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    相关资源
    最近更新 更多