Linux Makefile不是';t重建依赖关系?
合理的警告:我是一个使用makefile的新手,所以这可能是显而易见的。我试图做的是,当且仅当生成工具的源文件(称为.abc文件)更改时,使用make运行第三方代码生成工具。我引用了一个演示如何构建MD5的示例,并对这个想法进行了一些调整: 文件:abc.mkLinux Makefile不是';t重建依赖关系?,linux,makefile,dependencies,redhat,Linux,Makefile,Dependencies,Redhat,合理的警告:我是一个使用makefile的新手,所以这可能是显而易见的。我试图做的是,当且仅当生成工具的源文件(称为.abc文件)更改时,使用make运行第三方代码生成工具。我引用了一个演示如何构建MD5的示例,并对这个想法进行了一些调整: 文件:abc.mk target = all files := $(wildcard Abc/*.abc) bltfiles := $files $(addsuffix .built,$files) all: $bltfiles %.built:
target = all
files := $(wildcard Abc/*.abc)
bltfiles := $files $(addsuffix .built,$files)
all: $bltfiles
%.built: %.abc %.abc.md5
@echo "Building $*"
@ #Command that generates code from a .abc file
@touch $@
%.md5: FORCE
@echo "Checking $* for changes..."
@ #Command to update the .md5 file, if the sum of the .abc file is different
FORCE:
# Call this makefile as: make all --file=abc.mk
# Default Target
target = all
COMP_ABC_FILES := $(wildcard Abc/*.abc)
COMP_BLT_FILES := $(COMP_ABC_FILES) $(addsuffix .built, $(COMP_ABC_FILES) )
# This line is needed to keep make from deleting intermediary output files:
.SECONDARY:
# Targets:
.PHONY: all
all: $(COMP_BLT_FILES)
Abc/%.abc.built: Abc/%.abc Abc/%.abc.md5
@echo "Building $*"
@ #Command that generates code from a .abc file
@touch $@
%.md5: FORCE
@echo "Checking $* for changes..."
@$(if $(filter-out $(shell cat $@ 2>/dev/null),$(shell md5sum $*)),md5sum $* > $@)
# Empty rule to force re-build of files:
FORCE:
clean:
@echo "Cleaning .built & .md5 files..."
@rm Abc/*.built
@rm Abc/*.md5
我希望每个.abc文件都有两个辅助文件:.abc.build和.abc.md5。.build文件只是一个虚拟目标&它上一次构建时的时间戳,因为生成工具生成的代码不能很容易地定义为目标。.md5文件包含.abc文件最后已知内容的散列。仅当文件的哈希值更改时,才应更新它
但是,只有当.build文件不存在时,才会创建该文件。.md5规则永远不会运行,即使.abc文件具有更新的时间戳,.builded规则也不会重新生成。我做错什么了吗
更新:
对于子孙后代,我要做的是这样一个版本:
文件:abc.mk
target = all
files := $(wildcard Abc/*.abc)
bltfiles := $files $(addsuffix .built,$files)
all: $bltfiles
%.built: %.abc %.abc.md5
@echo "Building $*"
@ #Command that generates code from a .abc file
@touch $@
%.md5: FORCE
@echo "Checking $* for changes..."
@ #Command to update the .md5 file, if the sum of the .abc file is different
FORCE:
# Call this makefile as: make all --file=abc.mk
# Default Target
target = all
COMP_ABC_FILES := $(wildcard Abc/*.abc)
COMP_BLT_FILES := $(COMP_ABC_FILES) $(addsuffix .built, $(COMP_ABC_FILES) )
# This line is needed to keep make from deleting intermediary output files:
.SECONDARY:
# Targets:
.PHONY: all
all: $(COMP_BLT_FILES)
Abc/%.abc.built: Abc/%.abc Abc/%.abc.md5
@echo "Building $*"
@ #Command that generates code from a .abc file
@touch $@
%.md5: FORCE
@echo "Checking $* for changes..."
@$(if $(filter-out $(shell cat $@ 2>/dev/null),$(shell md5sum $*)),md5sum $* > $@)
# Empty rule to force re-build of files:
FORCE:
clean:
@echo "Cleaning .built & .md5 files..."
@rm Abc/*.built
@rm Abc/*.md5
在三个位置修复makefile:
target = all
files := $(wildcard Abc/*.abc)
bltfiles := $(files) $(patsubst %.abc,%.built,$(files))
all: $(bltfiles)
#Abc/%.abc.built: Abc/%.abc Abc/%.abc.md5
%.built: %.abc %.abc.md5
@echo "Building $*"
@ #Command that generates code from a .abc file
@touch $@
%.md5: FORCE
@echo "Checking $* for changes..."
@ #Command to update the .md5 file, if the sum of the .abc file is different
FORCE:
注意这些变化:
bltfiles:=$(文件)$(patsubst%.abc、%.builded、$(文件))
结果为“Abc/a.Build Abc/b.Build”,而不是“Abc/a.Abc.Build Abc/b.Abc.Build”,这是如何定义%.Build
规则所必需的all:$(bltfiles)
如上所述,对于$(文件)
,“$bltfiles”需要是$(bltfiles)
,因为否则make将解释为$(f)iles
和$(b)ltfiles
演示 输出类
Checking Abc/e.abc for changes...
Building Abc/e
Checking Abc/g.abc for changes...
Building Abc/g
Checking Abc/b.abc for changes...
Building Abc/b
Checking Abc/f.abc for changes...
Building Abc/f
Checking Abc/a.abc for changes...
Building Abc/a
Checking Abc/c.abc for changes...
Building Abc/c
Checking Abc/d.abc for changes...
Building Abc/d
正如sehe所修复的,但没有解释:Makefile语法与shell语法不同。默认情况下(由于历史原因),make变量只有一个字符长。如果想要更长的变量名,必须将其放在括号中,以便正确解析。例如,写入
$files
,实际上会扩展字符串“iles”,因为make只解析和扩展“f”变量(为空)的值
是的,很奇怪。但这是“制造”的方式。始终将变量放在括号中。添加了修复说明和演示运行谢谢!我接受了大部分更改(并根据上下文修改了一些其他更改),并将它们合并到一起。最重要的似乎是“Abc/%.Abc.builded:Abc/%.Abc/%.Abc.md5”行。添加文件夹前缀似乎有助于消除混淆。(另一个错误似乎是为了删除可识别的信息而重新键入的工件-doh!)