gpt4 book ai didi

linux - 如果编译器选项与以前使用的选项不同,则使目标过时

转载 作者:太空狗 更新时间:2023-10-29 11:48:39 25 4
gpt4 key购买 nike

考虑以下目录树中的虚构玩具示例,该示例说明了要解决的问题:

- Makefile
- lib.c
+ foo/
|-- config.mk
+ bar/
|-- config.mk
  • foo/config.mk的内容:

    CFLAGS += -DFOO
  • bar/config.mk内容:

    CFLAGS += -DBAR
  • 使用 Makefile 为目标 foobar 调用 make 会生成文件 foo/config.mkbar/config.mk 分别被包含(通过 include directive ),并且正在构建 lib.o ,即:

    # build lib.o with the macro FOO defined
    $ make foo

    # build lib.o with the macro BAR defined
    $ make bar

    # build lib.o with both the macros FOO and BAR defined
    $ make foo bar
    $ make bar foo

构建lib.o的默认规则使用变量COMPILE.c,它被定义(根据调用make得到的输出) > 使用选项 --print-data-base ) 作为:

COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c

COMPILE.c 的扩展取决于变量 CFLAGS 的值,而后者又取决于关于是否包含 foo/config.mkbar/config.mk,因为这些 makefile 修改了 CFLAGS 变量。


如果变量 COMPILE 的扩展,我想要实现的是将目标 lib.o 视为过时目标。当前使用的 c 与之前构建 lib.o 时使用的不同。例如:

$ make foo

# It shouldn't rebuild anything since lib.o should be up-to-date
$ make foo

# It should rebuild lib.o since it should be out-of-date
$ make bar

# It should rebuild lib.o since it is again out-of-date
$ make foo bar

# It shouldn't rebuild lib.o since it is up-to-date
$ make bar foo

This solution解释了到目前为止我是如何实现这种行为的。欢迎任何建议。

最佳答案

我会将变量的值转储到另一个包含的 makefile 中,并检查当前值是否与包含的 makefile 中的值不同。像这样的东西:

ifeq ($(filter foo,$(MAKECMDGOALS)),foo)
include foo/config.mk
endif
ifeq ($(filter bar,$(MAKECMDGOALS)),bar)
include bar/config.mk
endif
-include old_compile.mk

COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c

ifneq ($(COMPILE.c),$(OLD_COMPILE.c))
FORCE := force
endif

lib.o: lib.c $(FORCE)
$(COMPILE.c) $< -o $@
echo 'OLD_COMPILE.c := $(COMPILE.c)' > old_compile.mk

.PHONY: foo bar all force

foo bar all: lib.o

演示:

$ make foo
cc -DFOO -c lib.c -o lib.o
echo 'OLD_COMPILE.c := cc -DFOO -c' > old_compile.mk
$ make foo
make: Nothing to be done for 'foo'.
$ make foo bar
cc -DFOO -DBAR -c lib.c -o lib.o
echo 'OLD_COMPILE.c := cc -DFOO -DBAR -c' > old_compile.mk
make: Nothing to be done for 'bar'.
$ make bar foo
make: Nothing to be done for 'bar'.
make: Nothing to be done for 'foo'.

关于linux - 如果编译器选项与以前使用的选项不同,则使目标过时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53703706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com