我有一個針對多個不同體系結構的項目。例如,我有一個處理浮點寄存器的頭文件'fpr.h'。存在這些標題中:體系結構特定標頭
arch/amd64/fpr.h
arch/ppc32/fpr.h
...
我有需要包括fpr.h.的體系結構相關的文件「foo.c的」 顯然,我只想要包含目標體系結構的頭文件,但我不確定要做到這一點的最佳方法是什麼。我正在嘗試爲我的構建系統使用autotools,但我沒有看到任何建議的方式來執行此操作。
有什麼建議嗎?
我有一個針對多個不同體系結構的項目。例如,我有一個處理浮點寄存器的頭文件'fpr.h'。存在這些標題中:體系結構特定標頭
arch/amd64/fpr.h
arch/ppc32/fpr.h
...
我有需要包括fpr.h.的體系結構相關的文件「foo.c的」 顯然,我只想要包含目標體系結構的頭文件,但我不確定要做到這一點的最佳方法是什麼。我正在嘗試爲我的構建系統使用autotools,但我沒有看到任何建議的方式來執行此操作。
有什麼建議嗎?
一種方法是讓autoconf腳本檢測體系結構並設置符號鏈接arch/target
指向特定體系結構頭的正確目錄,然後#include <arch/target/fpr.h>
。不過,使用不合適的構建工作可能會非常棘手。
另一種方法是手動設置arch/target
目錄,並用fpr.h.in
這樣的文件填充它,這些文件由M4進行預處理,以引用實際的特定體系結構的標題。
讓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,然後可以在建築物實際啓動之前使用它來使配置失敗。
一種方法是將所有體系結構特定的頭文件放入特定於體系結構的目錄中,然後根據體系結構選擇合適的目錄放在包含搜索路徑中。
一種方法是使用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
這是不完全正確。我應該擁有所有標題,其中包括哪一個標題。 – dschatz
那麼,忘記AC_CHECK_HEADER並設置一個AC_ARG來在./configure時間捕獲命令行選擇。 –