【问题标题】:Writing a Makefile rule, for a SINGLE target with MULTIPLE dependacies为具有多个依赖项的 SINGLE 目标编写 Makefile 规则
【发布时间】:2012-01-11 16:11:19
【问题描述】:

例如,如果我要用硬件描述语言编译一堆文件,我可以按以下方式编写 Makefile

    analyze: a.v b.v c.v top.v
        vcs $(OPTIONS) a.v
        vcs $(OPTIONS) b.v
        vcs $(OPTIONS) c.v
        vcs $(OPTIONS) top.v

进行分析,将编译其依赖项中的所有文件并构建最终的可执行文件。如何编写“单一 Makefile 规则”,它将编译其所有依赖项并构建可执行文件 - 使用类似规则模仿上述内容:

    analyze: %.v
        vcs $(OPTIONS) %.v

以上适用于单个文件依赖项。但是,如果我有多个文件依赖项,我将如何处理多个文件?我可以对所有依赖项使用“for 循环”吗?我正在寻找 Makefile 选项来访问要在 for 循环中使用的“依赖文件”,但找不到。

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    为每个要分析的文件使用一个虚拟标记目标:

    analyze : a.analyzed-stamp b.analyzed-stamp c.analyzed-stamp top.analyzed-stamp
    
    %.analyzed-stamp : %.v
        vcs $(OPTIONS) $<
        touch $@
    

    【讨论】:

    • 上述解决方案有效,但也会创建 .analyzed-stamp 文件。相反,Makefile 中是否还有其他优雅的解决方案,其中“for 循环”会自动循环目标中的所有依赖文件并构建最终的可执行文件。原因是我有大约 900 个设计 (.v) 文件,许多“*.analyzed-stamp”文件淹没了 Makefile 运行目录
    • 为分析目标“rm *.analyzed-stamp”添加一个动作将清理目录。为了知识,仍然想知道make是否支持任何特殊变量,帮助“for循环”遍历目标的所有依赖项。
    • @Mike: make 在循环等低级命令上运行不佳。当然,您可以简单地在命令部分执行for file in $^; do vcs $(OPTIONS) $$file; done。但是,这会每次都重新分析每个文件,通常最好将流程具体化为文件并避免重复。
    猜你喜欢
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多