强制 gnu make 重建受编译器定义影响的对象

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

我有一个在命令行接受选项的 makefile

make OPTION_1=1

根据该值,它将向对象子集添加额外的编译器定义。

ifeq ($(OPTION_1), 1)
CC_FLAGS += -DOPTION_1_ON
endif

定义中的更改会影响包含的头文件内容 - 存根或实现会暴露给对象文件。

如何让 make 重建受此选项更改“影响”的文件?

makefile gnu-make
2个回答
51
投票

我使用一个文件来记住此类选项的最后一个值,如下所示:

.PHONY: force
compiler_flags: force
    echo '$(CC_FLAGS)' | cmp -s - $@ || echo '$(CC_FLAGS)' > $@

cmp || echo
位表示仅当设置更改时才会触及文件
compiler_flags
,因此现在您可以编写类似

的内容
$(OBJECTS): compiler_flags
每当编译器标志发生变化时,都会导致

$(OBJECTS)

 的重建。每次运行 make 时都会执行 compiler_flags 的规则,但只有在实际修改了 
$(OBJECTS)
 文件时才会触发 
compiler_flags
 的重建。


0
投票
上面的答案比这个答案更好。但是当我遇到同样的问题时,在找到上述解决方案之前,我通过以下方式实现了它。

flagstamp.sh:

#!/bin/bash FLAGS=$1 FLAGFILE=$2 # create FLAGFILE if doesn't exist [ -e $FLAGFILE ] || >$FLAGFILE # overwrite FLAGFILE if it differs from FLAGS [[ "$FLAGS" == `<$FLAGFILE` ]] || echo "$FLAGS" >$FLAGFILE # echo FLAGFILE name echo $FLAGFILE

Makefile

.SECONDEXPANSION: $(OBJECTS): $$(shell ./flagstamp '$(CC_FLAGS)' [email protected])

.SECONDEXPANSION:

 允许您在依赖于目标名称的先决条件中编写语句。
    

© www.soinside.com 2019 - 2024. All rights reserved.