【问题标题】:Why does following makefile rebuilt target "build" everytime为什么每次都遵循makefile重建目标“构建”
【发布时间】:2012-08-24 08:38:20
【问题描述】:

我有以下代码来解压目录中的所有文件并将其移动到构建目录。如果我多次调用 make,即使构建目录已经存在,它也会每次尝试执行“构建”目标。有没有人遇到过这个?

我发现了这个问题,但它不一样。 Makefile always running target

操作系统:Ubuntu 12.04 程序:GNU Make 3.81

build: mkBuildDir untar 
    chmod 700 build

.PHONY: mkBuildDir untar 

mkBuildDir: 
    mkdir build 

untar: *.tar.gz
    for prefix in *.tar.gz; do \
        tar xvf $$prefix --directory=build; \
    done

clean: 
    rm -Rf build

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    与您链接的问题几乎相同。您永远不会创建一个名为 mkBuildDir 的文件,所以它总是过时的,所以 build 总是过时的。

    您的mkBuildDir 目标没有做任何有用的事情(尽管我认为这是一个精简的makefile)。如果你这样做了

    # it'd be better to list the TARFILES explicitly, though this will probably work
    TARFILES=`ls *.tar.gz`
    
    all: build untar
    
    build: $(TARFILES)
        test -d build || mkdir build
        chmod 700 build
        for prefix in $(TARFILES); do \
            tar xvf $$prefix --directory=build; \
        done
    
    clean: 
        rm -Rf build
    

    这可能会完成你正在寻找的东西。

    在 Makefile 中有太多虚假目标通常是 Makefile 的“代码异味”。它们很少是最好的/惯用的做事方式。

    【讨论】:

    • 我认为最好使用TARFILES=$(wildcard *.tar.gz)。在原始情况下,如果没有匹配的文件名,则 TARFILES 将是 *.tar.gz 而不是空列表。更重要的是,无需创建一个进程。
    • 是的,但通配符行为仅适用于某些 shell 中的某些设置。此外,$(wildcard ...) 是一个 GNU Make 扩展,因此不可移植(这可能是也可能不是问题)。最后,每条操作线都会创建一个新流程,因此在此处保存一个流程并不会真正获得太多收益。
    • 在使用 2 个都需要构建目录的目标时,并行生成似乎失败了。 mkdir -p 将修复它(尽管您可能会得到不必要的命令输出)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-23
    • 1970-01-01
    • 2021-02-25
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多