Linux Makefile不是';t重建依赖关系?

Linux 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:

合理的警告:我是一个使用makefile的新手,所以这可能是显而易见的。我试图做的是,当且仅当生成工具的源文件(称为.abc文件)更改时,使用make运行第三方代码生成工具。我引用了一个演示如何构建MD5的示例,并对这个想法进行了一些调整:

文件: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
我希望每个.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

  • 提示:这里有一个编辑器,可以突出显示makefiles的语法


    演示 输出类

    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!)