特定于目标的变量是有条件地设置变量的合适工具吗?

jww

我正在处理下面描述的问题。在研究它时,GNU Make 手册第 6.11 节说:

make 中的变量值通常是全局的;也就是说,无论它们在哪里计算,它们都是相同的......自动变量是一个例外(请参阅自动变量)。

另一个例外是特定于目标的变量值。此功能允许您根据 make 当前正在构建的目标为同一变量定义不同的值。与自动变量一样,这些值仅在目标配方的上下文中可用(以及在其他特定于目标的分配中)。

设置特定于目标的变量值,如下所示:

target … : variable-assignment

多个目标值分别为目标列表的每个成员创建一个特定于目标的变量值。

...

特定于目标的变量还有一个特殊功能:当您定义特定于目标的变量时,该变量值也对该目标的所有先决条件及其所有先决条件等有效(除非这些先决条件以其自己的目标特定变量值)。因此,例如,像这样的语句:

prog : CFLAGS = -g
prog : prog.o foo.o bar.o

...

在上面 GNU Make 示例的上下文中,我需要类似的内容:

带有 SSE4.2 的英特尔机器

crc-simd.o: CRC_FLAG = -msse4.2
crc-simd.o:
    $(CXX) $(CXXFLAGS) $(CRC_FLAG) -c $<

带有 CRC32 的 ARMv8a 机器

crc-simd.o: CRC_FLAG = -march=armv8-a+crc
crc-simd.o:
    $(CXX) $(CXXFLAGS) $(CRC_FLAG) -c $<

我认为在规则执行时定义 make 变量可能是相关的,但细节对我来说仍然是模糊的。我不确定它是基石还是另一种选择。

特定于目标的变量是有条件地设置变量的合适工具CRC_FLAG吗?如果是,那么我们如何使用它来有条件地设置变量?

如果没有,那么有没有办法CRC_FLAG仅在crc-simd.o需要构建为其赋值如果有,那我们怎么做呢?


这是我们的 GNUmakefile 包含的内容。尽管显示了 ARMv8a,但 x86/x32/x64 是相似的。我们对 SSE4.2、NEON、AES、SHA、CLMUL、AVX 和 BMI 做了类似的处理。

测试编译后,CRC_FLAG在MIPS上为空,-msse4.2在SSE4.2可用时-march=armv8-a+crc在ARMv8a上。问题是,它使食谱make clean需要太多时间来运行。即使构建一个脏对象文件也会招致所有编译的愤怒。滞后是明显的。

TEMPDIR ?= /tmp
EGREP ?= egrep

IS_ARMV8 ?= $(shell uname -m | $(EGREP) -i -c 'aarch32|aarch64')
...

ifeq ($(IS_ARMV8),1)
  HAS_CRC := $(shell $(CXX) $(CXXFLAGS) -march=armv8-a+crc -o $(TEMPDIR)/t.o -c crc-simd.cpp; echo $$?)
  ifeq ($(HAS_CRC),0)
    CRC_FLAG := -march=armv8-a+crc
  endif
endif
...

# SSE4.2 or ARMv8a available
crc-simd.o : crc-simd.cpp
    $(CXX) $(strip $(CXXFLAGS) $(CRC_FLAG) -c) $<
疯狂的科学家

如果您只需要为单个 .o 文件(如 )crc-simd.o使用此标志,那么为什么要:=在 的分配中使用CRC_FLAG如果您使用=它,那么它在使用之前不会被扩展,如果您只使用它一次,它只会被扩展一次。

就像是:

ifeq ($(IS_ARMV8),1)
  CRC_FLAG = $(shell $(CXX) $(CXXFLAGS) -march=armv8-a+crc -o $(TEMPDIR)/t.o -c crc-simd.cpp 2>/dev/null && printf %s -march=armv8-a+crc)
endif

# SSE4.2 or ARMv8a available
crc-simd.o : crc-simd.cpp
        $(CXX) $(strip $(CXXFLAGS) $(CRC_FLAG) -c) $<

这仍然编译文件两次;似乎应该有一种更快的方法来确定是否支持该标志,但无论如何。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何根据目标变量(Makefile)有条件地调用目标?

来自分类Dev

NLog:如何根据环境变量有条件地选择目标

来自分类Dev

如果变量的值匹配数组中的特定字符串,则有条件地设置样式

来自分类Dev

我可以有条件地选择要分配给哪个变量吗?

来自分类Dev

在Apache配置中有条件地设置环境变量

来自分类Dev

如何在一行中有条件地设置变量值?

来自分类Dev

Wix在运行时有条件地设置环境变量

来自分类Dev

根据React功能组件中的状态变量有条件地设置className

来自分类Dev

.tmux.conf:如何有条件地设置颜色变量?

来自分类Dev

在命令行中有条件地设置变量

来自分类Dev

有条件地将变量设置为只读的函数

来自分类Dev

如何在一行中有条件地设置变量值?

来自分类Dev

根据ReactJS中的变量有条件地设置复选框状态

来自分类Dev

有条件地设置变量而不切割祖先轴

来自分类Dev

有条件地包含ansible角色的变量文件

来自分类Dev

如何使用EJS有条件地显示变量

来自分类Dev

如何有条件地选择变量?

来自分类Dev

有条件地在变量前加上斜杠

来自分类Dev

有条件地按组总结几个变量

来自分类Dev

有条件地在python代码中添加变量

来自分类Dev

有条件地引用实例变量Ruby / Rails

来自分类Dev

使用dplyr有条件地更新多个变量

来自分类Dev

VBA 有条件地为变量赋值

来自分类Dev

在计算中有条件地替换变量

来自分类Dev

在特定于目标的变量中使用目标名称

来自分类Dev

有条件地根据另一个变量设置一个变量的值

来自分类Dev

Makefile中特定于目标的变量和先决条件

来自分类Dev

有条件设置变量的更短方法

来自分类Dev

如何在GNU make中将目标“私有”仅供内部使用?或者:如何最好地实施特定于目标的变量值?

Related 相关文章

  1. 1

    如何根据目标变量(Makefile)有条件地调用目标?

  2. 2

    NLog:如何根据环境变量有条件地选择目标

  3. 3

    如果变量的值匹配数组中的特定字符串,则有条件地设置样式

  4. 4

    我可以有条件地选择要分配给哪个变量吗?

  5. 5

    在Apache配置中有条件地设置环境变量

  6. 6

    如何在一行中有条件地设置变量值?

  7. 7

    Wix在运行时有条件地设置环境变量

  8. 8

    根据React功能组件中的状态变量有条件地设置className

  9. 9

    .tmux.conf:如何有条件地设置颜色变量?

  10. 10

    在命令行中有条件地设置变量

  11. 11

    有条件地将变量设置为只读的函数

  12. 12

    如何在一行中有条件地设置变量值?

  13. 13

    根据ReactJS中的变量有条件地设置复选框状态

  14. 14

    有条件地设置变量而不切割祖先轴

  15. 15

    有条件地包含ansible角色的变量文件

  16. 16

    如何使用EJS有条件地显示变量

  17. 17

    如何有条件地选择变量?

  18. 18

    有条件地在变量前加上斜杠

  19. 19

    有条件地按组总结几个变量

  20. 20

    有条件地在python代码中添加变量

  21. 21

    有条件地引用实例变量Ruby / Rails

  22. 22

    使用dplyr有条件地更新多个变量

  23. 23

    VBA 有条件地为变量赋值

  24. 24

    在计算中有条件地替换变量

  25. 25

    在特定于目标的变量中使用目标名称

  26. 26

    有条件地根据另一个变量设置一个变量的值

  27. 27

    Makefile中特定于目标的变量和先决条件

  28. 28

    有条件设置变量的更短方法

  29. 29

    如何在GNU make中将目标“私有”仅供内部使用?或者:如何最好地实施特定于目标的变量值?

热门标签

归档