Makefile:特定目标的条件

问题描述 投票:0回答:1

在我理想的解决方案中,我想要一个基于 SAN 变量设置清理程序的 Makefile,仅当我调用目标“调试”时,并注意,像现在一样,gcc 不支持 -fsanitize=memory,因此仅当 CC 时才通过=叮当声

第一次尝试是:

...
CC=gcc # gcc|clang
CFLAGS=-Wall -O2
SAN?=address # address|thread|memory

all:
    $(CC) $(CFLAGS) $^ $(LDFLAGS) -o $(BIN)

debug: all
   CFLAGS+=-g -fsanitize=undefined
   LDFLAGS+=-fsanitize=undefined
   ifeq ($(SAN),address)
      CFLAGS+=-fsanitize=address -fno-omit-frame-pointer -fsanitize=undefined
      LDFLAGS+=-fsanitize=address -fsanitize=undefined
   endif
   ifeq ($(SAN),thread)
      CFLAGS+=-fsanitize=thread
      LDFLAGS+=-fsanitize=thread
   endif
   ifeq ($(SAN),memory)
      ifeq ($(CC),clang)
         CFLAGS+=-fsanitize=memory -fPIE -fno-omit-frame-pointer -fsanitize-memory-track-origins
         LDFLAGS+=-fsanitize=memory -fPIE -pie
      endif
   endif

但不起作用。

然后我尝试一些更简单的没有 SAN 变量的方法,例如:

CC=gcc
CFLAGS=-Wall -O2

debug: CFLAGS+=-g -fsanitize=address -fno-omit-frame-pointer -fsanitize=undefined
debug: LDFLAGS+=-fsanitize=address -fsanitize=undefined
debug: all
ifeq ($(CC),clang)
   CFLAGS+=-fsanitize=memory -fPIE -fno-omit-frame-pointer -fsanitize-memory-track-origins
   LDFLAGS+=-fsanitize=memory -fPIE -pie
endif

但还是不行。

这样做,但它真的太简单了:

debug: CFLAGS+=-g -fsanitize=address -fno-omit-frame-pointer -fsanitize=undefined
debug: LDFLAGS+=-fsanitize=address -fsanitize=undefined
debug: all

建议?

c makefile gnu-make sanitizer
1个回答
0
投票

您没有说出“它不起作用”的实际含义。 请显示您调用的命令,并剪切并粘贴您遇到的错误。 此外,提供您正在使用的 GNU Make 版本以及您正在构建的操作系统也会很有帮助。

您是否想象通过在像

debug: all
这样的目标后面缩进一些行,这些行会进行仅与目标
debug
相关的变量赋值? make 根本不是这样工作的。 要了解 makefile 语法,您可以阅读文档

这个:

debug: all
   CFLAGS+=-g -fsanitize=undefined
   LDFLAGS+=-fsanitize=undefined

与写作完全一样(就制作而言):

   CFLAGS+=-g -fsanitize=undefined
   LDFLAGS+=-fsanitize=undefined

debug: all

(或任何其他组合)。 当然,假设这里的缩进只是空格,而不是制表符:从你的问题中不清楚。 如果您向我们展示了您遇到的错误,那就很清楚了,因为这些行不是有效的 shell 脚本行。

做你想做的事情的一个选择是:

CFLAGS_address = -fsanitize=address -fno-omit-frame-pointer -fsanitize=undefined
LDFLAGS_address = -fsanitize=address -fsanitize=undefined

CFLAGS_thread = -fsanitize=thread
LDFLAGS_thread = -fsanitize=thread

ifeq ($(CC),clang)
  CFLAGS_memory = -fsanitize=memory -fPIE -fno-omit-frame-pointer -fsanitize-memory-track-origins
  LDFLAGS_memory = -fsanitize=memory -fPIE -pie
endif

debug: CFLAGS += -g -fsanitize=undefined $(CFLAGS_$(SAN))
debug: LDFLAGS += -fsanitize=undefined $(LDFLAGS_$(SAN))
debug: all
© www.soinside.com 2019 - 2024. All rights reserved.