Linux bash-script在所有子目录中运行make

时间:2014-04-15 10:44:19

标签: bash makefile

我试图在Linux中编写一个遍历当前目录的bash脚本,并在每个子目录中启动现有的makefile。它应该适用于每个子目录,无论深度如何。

一些限制:

  • 我不能使用Python;
  • 我事先并不知道有多少子目录及其名称;
  • 我事先并不知道当前目录的名称;
  • 只有在此类文件夹中有makefile时,才应启动每个目录的make命令。

关于如何做的任何想法?

4 个答案:

答案 0 :(得分:5)

使用-exec和GNU

find -type f \( -name 'GNUmakefile' -o -name 'makefile' -o -name 'Makefile' \) \
-exec bash -c 'cd "$(dirname "{}")" && make' \;

答案 1 :(得分:1)

您可以使用此脚本https://gist.github.com/legeyda/8b2cf2c213476c6fe6e25619fe22efd0

示例用法是:

foreach */ 'test -f Makefile && make'

答案 2 :(得分:1)

鉴于这与make有关。我尝试在顶层使用makefile而不是脚本。像这样:

MAKEFILES:=$(shell find . -mindepth 2 -name Makefile -type f)
DIRS:=$(foreach m,$(MAKEFILES),$(realpath $(dir $(m))))

.PHONY: all
all: $(DIRS)

.PHONY: $(DIRS)
$(DIRS):
     $(MAKE) -C $@

我接受@MLSC关于将forfind一起使用的说法,这种情况也适用于此...问题是当目录名中有空格时。但是,在许多情况下不会发生这种情况,恕我直言,使用makefile而不是脚本会有好处。 (可能有一个使用make的解决方案,可以处理目录名称中的空格,但我无法想到它。)

答案 3 :(得分:0)

如果不关心执行顺序或父目录也有Makefile,这应该有用。

#!/bin/bash

for f in $(find . -name Makefile); do
  pushd $(dirname $f)
  make
  popd
done