【问题标题】:One Makefile, used in many subdirectories一个 Makefile,在许多子目录中使用
【发布时间】:2011-02-19 15:58:30
【问题描述】:

我希望在当前目录的所有子目录中编写一个调用目标的单个 makefile。我提出了这个作为起点:

SUBDIRS := $(shell find . -maxdepth 1 -type d | sed -e 's/^/\"/;s/$$/\"/')

all:
        @for d in $(SUBDIRS); do \
                ($(MAKE) -f "../$(lastword $(MAKEFILE_LIST))" -C "$$d" gallery.html); \
        done

gallery.html:
        echo "Making gallery\n";
  1. 这是解决问题的正确方法吗?
  2. 这真的是发现目录并正确引用它们的“最干净”的方式吗?

我很高兴使用 GNU make 扩展。

【问题讨论】:

    标签: makefile gnu-make subdirectory quoting


    【解决方案1】:

    你所拥有的本质上是一个混淆的 shell 脚本——你没有使用 make 本身的任何功能。

    您的子目录名称是否包含空格字符?如果是这样,那么make 可能根本就不是适合这项工作的工具:它确实想要处理以空格分隔的单词列表,并且没有可以帮助它处理路径中空格的引用概念。

    如果子目录名称包含空格字符,我会将其拆分为单独的 shell 脚本和 makefile,如下所示:

    #/bin/sh
    find . -maxdepth 1 -type d | while read d; do
        make -f `dirname $0`/Makefile -C "$d" gallery.html
    done
    

    gallery.html:
            echo "Making gallery\n";
    

    (请记住,如果您的子目录中有更多带有空格的路径,make 仍然可能是一个糟糕的选择)

    如果子目录名称不包含空格字符,那么事情可以简单得多,并且您还可以避免递归 make 调用(谷歌“递归 make 被认为有害”原因):

    SUBDIRS := $(wildcard */)
    
    all: $(SUBDIRS:%=%/gallery.html)
    
    %/gallery.html:
        cd $* && echo "Making gallery in `pwd`\n"
    

    【讨论】:

    • 名称确实有空格,这是我试图解决的问题的一部分。我喜欢使用 shell 脚本来调用它的想法。 (稍后我将使用 make 本身的功能,我试图保持此处的示例清晰)
    【解决方案2】:

    这种递归只有在gallery.html 有一些复杂的本地先决条件时才有意义,即使那样它也可能不是最好的方法。这种对 makefile 名称的敏感性是一个非常不好的迹象。但如果这是您想要的,我建议进行以下更改:

    .PHONY: $(SUBDIRS)
    all: $(SUBDIRS)
    
    $(SUBDIRS):
        $(MAKE) -f "../$(lastword $(MAKEFILE_LIST))" -C $@ gallery.html
    

    【讨论】:

    • @awoodland:注意这个makefile是-j友好的。 (你的 makefile 序列化了所有的 submakes。)这始终是 make 编写良好的标志。
    猜你喜欢
    • 2012-08-16
    • 1970-01-01
    • 2020-11-24
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多