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工具是否可用.
TL;博士;
如果您只需要以long便携方式获取C中的类型位数,则可以使用getconf LONG_BIT.
除此以外:
config.guessshell脚本gcc -dumpmachine或gcc --help=targetgetconf正如@ Dummy00001所述,它getconf是POSIX的一部分,并且可以广泛使用,但它没有提供足够的信息.
请注意,这getconf LONG_BIT只是longCEg 中类型的位数,在16位或64位计算机上可能是32位.它对确定主机架构毫无用处.
unameuname 也是POSIX的一部分,它也没有提供足够的信息.
例如,它不区分Linux上的hardfloat和softfloat ARM.此外,它的架构命名不是真正可移植的.
/proc您可以使用它/proc来收集体系结构信息,例如/proc/cpuinfo在Linux上.但是,它不便携,难以解析.
config.guess最后,我推荐GNU config.guess脚本(源代码).它是一个独立的脚本,您可以将其复制到项目中.它是用便携式shell编写的,应该适用于任何UNIX.
$ sh config.guess
x86_64-pc-linux-gnu
Run Code Online (Sandbox Code Playgroud)
此脚本用于autotools,但您也可以在没有autotools的情况下使用它.
检测正在使用的工具链的目标架构通常是有意义的.交叉编译时,它与主机架构不同.
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.
笔记:
--target传递给configure脚本的选项值.它不会受到传递给GCC的当前编译标志的影响,例如-m32或-march.config.guess此不同,此工具链元组是特定于发行版的.例如,在Debian和Gentoo的预构建工具链中使用了不同的方案.gcc -dumpmachine看来,gcc -dumpmachine 打印的相同值前面的食谱:
$ gcc -dumpmachine
x86_64-linux-gnu
Run Code Online (Sandbox Code Playgroud)
它适用于GCC和clang.
gcc -print-multiarch获取工具链元组的另一种方法:
$ gcc -print-multiarch
x86_64-linux-gnu
Run Code Online (Sandbox Code Playgroud)
它适用于海湾合作委员会,但不是铿锵声.此外,众所周知,此选项不适用于各种情况:
一些GCC选项喜欢-m32或-march可能影响目标架构.
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.