如何在Makefile中找到基础架构?

Vic*_*cky 5 linux makefile gnu-make archlinux

我想在Makefile中找到,无论我是在32位还是64位机器上运行.

是否可以从Makefile中简单地访问任何宏或环境变量?

我在网上找到了这个相关的答案:

LBITS := $(shell getconf LONG_BIT)
ifeq ($(LBITS),64)
   # do 64 bit stuff here, like set some CFLAGS
else
   # do 32 bit stuff here
endif
Run Code Online (Sandbox Code Playgroud)

但是,我怀疑所有系统getconf工具是否可用.

gav*_*avv 6

TL;博士;

如果您只需要以long便携方式获取C中的类型位数,则可以使用getconf LONG_BIT.

除此以外:

  • 要检测主机架构,请使用config.guessshell脚本
  • 检测目标架构,使用gcc -dumpmachinegcc --help=target

检测主机架构

1) getconf

正如@ Dummy00001所述,它getconf是POSIX的一部分,并且可以广泛使用,但它没有提供足够的信息.

请注意,这getconf LONG_BIT只是longCEg 中类型的位数,在16位或64位计算机上可能是32位.它对确定主机架构毫无用处.

2) uname

uname 也是POSIX的一部分,它也没有提供足够的信息.

例如,它不区分Linux上的hardfloat和softfloat ARM.此外,它的架构命名不是真正可移植的.

3) /proc

您可以使用它/proc来收集体系结构信息,例如/proc/cpuinfo在Linux上.但是,它不便携,难以解析.

4) config.guess

最后,我推荐GNU config.guess脚本(源代码).它是一个独立的脚本,您可以将其复制到项目中.它是用便携式shell编写的,应该适用于任何UNIX.

$ sh config.guess
x86_64-pc-linux-gnu
Run Code Online (Sandbox Code Playgroud)

此脚本用于autotools,但您也可以在没有autotools的情况下使用它.


检测工具链的默认目标体系结构

检测正在使用的工具链的目标架构通常是有意义的.交叉编译时,它与主机架构不同.

1) gcc -E

您可以解析gcc -E输出以获取gcc目标体系结构的工具链元组:

$ gcc -v -E - </dev/null |& grep Target:
Target: x86_64-linux-gnu
Run Code Online (Sandbox Code Playgroud)

如果您使用GCC或clang,这应该适用于任何UNIX.

笔记:

  • 它会在构建GCC时打印--target传递给configure脚本的选项值.它不会受到传递给GCC的当前编译标志的影响,例如-m32-march.
  • config.guess此不同,此工具链元组是特定于发行版的.例如,在DebianGentoo的预构建工具链中使用了不同的方案.

2) gcc -dumpmachine

看来,gcc -dumpmachine 打印相同值前面的食谱:

$ gcc -dumpmachine
x86_64-linux-gnu
Run Code Online (Sandbox Code Playgroud)

它适用于GCC和clang.

3) gcc -print-multiarch

获取工具链元组的另一种方法:

$ gcc -print-multiarch
x86_64-linux-gnu
Run Code Online (Sandbox Code Playgroud)

它适用于海湾合作委员会,但不是铿锵声.此外,众所周知,此选项不适用于各种情况:

  • 在Debian上,如果禁用multilib,它为空
  • 在Gentoo上,它总是空的
  • 正如@ Dummy00001所提到的,交叉编译工具链可能是空的(我想这取决于工具链的构建方式)

根据当前标志检测目标架构

一些GCC选项喜欢-m32-march可能影响目标架构.

1) gcc --help=target

这将打印-march从默认目标体系结构(在构建GCC时配置)和当前编译选项推导出的选项值.

$ gcc -Q --help=target |& grep -e -march | awk '{print $2}'
x86-64

$ gcc -m32 -Q --help=target |& grep -e -march | awk '{print $2}'
i686

$ gcc -march=i386 -Q --help=target |& grep -e -march | awk '{print $2}'
i386
Run Code Online (Sandbox Code Playgroud)

它不适用于clang.