代码之家  ›  专栏  ›  技术社区  ›  Gqqnbig

在目标中追加目标

  •  0
  • Gqqnbig  · 技术社区  · 5 年前
    install-component-a:
        cp ...
        db reload
    
    install-component-b:
        cp ...
        db reload
    
    install-component-b:
        cp ...
        db reload
    

    我的Makefile不仅构建软件,还将软件安装到系统中。

    这三个目标都需要刷新数据库。

    make install ,我只需要数据库刷新一次,而不是三次。

    我喜欢这样的东西:

    install-component-a:
        cp ...
        a-make-command-to-add-new-target reload-database
    
    install-component-b:
        cp ...
        a-make-command-to-add-new-target reload-database
    
    install-component-b:
        cp ...
        a-make-command-to-add-new-target reload-database
    
    reload-database:
        db reload
    

    a-make-command-to-add-new-target 存在

    reload-database 到 all 目标还是目标 install 目标可能并不理想,因为如果组件a、b和c都没有更改,则数据库不必重新加载。

    1 回复  |  直到 5 年前
        1
  •  1
  •   Andreas    5 年前

    使配方具有自动变量 $? 扩展到比目标更新的先决条件。

    install-component-a:
        cp ...
    
    install-component-b:
        cp ...
    
    install-component-c:
        cp ...
    
    reload-database: install-component-a install-component-b install-component-c
        add new target $?
        db reload
    

    您的示例表明目标不是文件。这可能是一个问题,因为所有先决条件都被认为比不存在的文件更新。如果他们不考虑组件触摸文件,并使用该文件时间戳来确定重建的必要性。

        2
  •  0
  •   MadScientist    5 年前

    无法在maketargets中从生成的新文件中添加要添加的目标。您似乎想要的是一种定义命令的方法,该命令将在所有其他规则运行后始终运行一次。没有这样的东西。

    我所知道的使之工作的唯一方法是递归调用make。它看起来像这样:

    install-component-a install-component-b install-component-c: recurse ;
    
    recurse:
            $(MAKE) $(MAKECMDGOALS:%=r-%)
            db reload
    
    r-install-component-a:
        cp ...
    
    r-install-component-b:
        cp ...
    
    r-install-component-b:
        cp ...
    
        3
  •  0
  •   Hans-J. Schmid    5 年前

    使用make's eval 功能,例如参见 Metaprogramming Make VI — The eval Function