Alex
Alex

Reputation: 13136

Linux bash-script to run make in all subdirectories

I'm trying to write a bash-script in Linux which traverses the current directory and, in every subdirectory, it launches the existing makefile. It should work for each subdirectory, regardless of depth.

Some restrictions:

Any ideas on how to do it?

Upvotes: 1

Views: 2822

Answers (4)

boyvinall
boyvinall

Reputation: 1907

Given that this is make-related. I'd try to use a makefile at the top-level instead of a script. Something like this:

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 $@

I'd accept what @MLSC says about using for with find, and that kind of applies here too .. the problem with that is when you have a space in the directory name. However, in many cases that's not going to happen, and IMHO there are benefits in using a makefile instead of a script. (There might be a solution using make that can cope with spaces in the directory name, but I can't think of it off the top of my head.)

Upvotes: 2

legeyda
legeyda

Reputation: 86

You can use this script https://gist.github.com/legeyda/8b2cf2c213476c6fe6e25619fe22efd0.

Example usage is:

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

Upvotes: 1

Reinstate Monica Please
Reinstate Monica Please

Reputation: 11613

Using -exec and GNU

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

Upvotes: 5

tpatja
tpatja

Reputation: 682

This should work if dont care about the execution order or if parent directory also has a Makefile.

#!/bin/bash

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

Upvotes: 0

Related Questions