我有一个在命令行接受选项的 makefile
make OPTION_1=1
根据该值,它将向对象子集添加额外的编译器定义。
ifeq ($(OPTION_1), 1)
CC_FLAGS += -DOPTION_1_ON
endif
定义中的更改会影响包含的头文件内容 - 存根或实现会暴露给对象文件。
如何让 make 重建受此选项更改“影响”的文件?
我使用一个文件来记住此类选项的最后一个值,如下所示:
.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
的重建。
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])
允许您在依赖于目标名称的先决条件中编写语句。