首页 > 解决方案 > ARM A-32 的条件 Automake 编译?

问题描述

我有一个需要为 ARM A-32 编译的源文件。A-32 包括 ARMv4 和 ARMv7(但不包括 Aarch32 或 Aarch64)。我们的 GNU makefile 有:

IS_ARM32 := $(shell echo "$(HOSTX)" | $(GREP) -i -c -E 'arm|armhf|arm7l|eabihf')
...

ifeq ($(IS_ARM32),1)
AES_ARCH = -march=armv7-a -marm
SRCS += aes-armv4.S
endif
...

ifeq ($(IS_ARM32),1)
aes-armv4.o : aes-armv4.S
    $(CC) $(strip $(CXXFLAGS) $(AES_ARCH) -mfloat-abi=$(FP_ABI) -c) $<
endif

根据使用 Automake Conditionals 的条件编译手册:

有条件地编译源文件的一种通常更简单的方法是使用 Automake 条件。例如,您可以使用这个 Makefile.am 构造来构建相同的 hello 示例:

bin_PROGRAMS = hello
if LINUX
hello_SOURCES = hello-linux.c hello-common.c
else
hello_SOURCES = hello-generic.c hello-common.c
endif

在这种情况下,configure.ac 应该使用 AM_CONDITIONAL 设置 LINUX 条件(请参阅Conditionals)。

在指向条件的链接之后,我没有看到LINUX示例中使用的条件列表。它还缺少对 ARM 和 PowerPC 等体系结构的条件编译的讨论。

Automake 对 ARM A-32 使用什么条件?

或者如何有条件地为 ARM A-32 编译?

标签: armautotoolsautomake

解决方案


在指向条件的链接之后,我没有看到像LINUX手册示例中那样的条件列表。它也缺少对平台条件编译的讨论,例如 ARM 和 PowerPC。

您似乎从手册的引用摘录中忽略了此文本:

在这种情况下,configure.ac 应该使用 AM_CONDITIONAL 设置 LINUX 条件

AM_CONDITIONAL是 Autoconf 宏,您可以使用它定义在 Automake 条件中使用的谓词。没有预制谓词。

Automake 对 ARM A-32 有什么用途?

或者如何有条件地为 ARM A-32 编译?

鉴于您现有的方法是基于

IS_ARM32 := $(shell echo "$(HOSTX)" | $(GREP) -i -c -E 'arm|armhf|arm7l|eabihf')

你可以这样做configure.ac

AM_CONDITIONAL([ARM32], [echo "$HOSTX" | $GREP -i -c -E 'arm|armhf|arm7l|eabihf'])

这假定HOSTXGREP是已设置值的 autoconf 输出变量。如果您不是这种情况,那么我相信它至少为您提供了一个模型供您开始使用。

使用ARM32configure.ac 中定义的谓词,您可以在Makefile.am文件中使用它,就像手册中的示例一样:

if ARM32
hello_SOURCES = hello-arm32.c hello-common.c
else
hello_SOURCES = hello-generic.c hello-common.c
endif

推荐阅读