2011-10-31 51 views
0

我有一个针对多个不同体系结构的项目。例如,我有一个处理浮点寄存器的头文件'fpr.h'。存在这些标题中:体系结构特定标头

arch/amd64/fpr.h 
arch/ppc32/fpr.h 
... 

我有需要包括fpr.h.的体系结构相关的文件“foo.c的” 显然,我只想要包含目标体系结构的头文件,但我不确定要做到这一点的最佳方法是什么。我正在尝试为我的构建系统使用autotools,但我没有看到任何建议的方式来执行此操作。

有什么建议吗?

回答

1

一种方法是让autoconf脚本检测体系结构并设置符号链接arch/target指向特定体系结构头的正确目录,然后#include <arch/target/fpr.h>。不过,使用不合适的构建工作可能会非常棘手。

另一种方法是手动设置arch/target目录,并用fpr.h.in这样的文件填充它,这些文件由M4进行预处理,以引用实际的特定体系结构的标题。

1

让autotools设置构建定义。

有C文件重写包括取决于设置了正确的报头中的定义

#ifdef HAVE_PPC_FPR_H 
    #include <arch/ppc32/fpr.h> 
#endif 

#ifdef HAVE_AMD64_FPR_H 
    #include <arch/amd64/fpr.h> 
#endif 

您可以使用AC_CHECK_HEADER多次在autoconf的检测每个头文件,但记得要省略写失败如果找不到“action”部分。在“如果找到动作”部分中,建议不仅设置必要的定义,还要设置定义以找到浮点标题。这样,您可以在检查测试后嵌入,看看是否未设置FPR_FOUND,然后可以在建筑物实际启动之前使用它来使配置失败。

+0

这是不完全正确。我应该拥有所有标题,其中包括哪一个标题。 – dschatz

+0

那么,忘记AC_CHECK_HEADER并设置一个AC_ARG来在./configure时间捕获命令行选择。 –

0

一种方法是将所有体系结构特定的头文件放入特定于体系结构的目录中,然后根据体系结构选择合适的目录放在包含搜索路径中。

1

一种方法是使用C预处理:

#define PP_STRINGIZE_(x)  #x 
#define PP_STRINGIZE(x)  PP_STRINGIZE_(x) 

#define ARCH_HEADER(h)  PP_STRINGIZE(arch/ARCH/h) 

#include ARCH_HEADER(fpr.h) 

可以提供编译器命令行的ARCH定义:

gcc -DARCH="amd64" foo.c