makefilegnu-make

Recursive wildcards in GNU make?


It's been a while since I've used make, so bear with me...

I've got a directory, flac, containing .FLAC files. I've got a corresponding directory, mp3 containing MP3 files. If a FLAC file is newer than the corresponding MP3 file (or the corresponding MP3 file doesn't exist), then I want to run a bunch of commands to convert the FLAC file to an MP3 file, and copy the tags across.

The kicker: I need to search the flac directory recursively, and create corresponding subdirectories in the mp3 directory. The directories and files can have spaces in the names, and are named in UTF-8.

And I want to use make to drive this.


Solution

  • I would try something along these lines

    FLAC_FILES = $(shell find flac/ -type f -name '*.flac')
    MP3_FILES = $(patsubst flac/%.flac, mp3/%.mp3, $(FLAC_FILES))
    
    .PHONY: all
    all: $(MP3_FILES)
    
    mp3/%.mp3: flac/%.flac
        @mkdir -p "$(@D)"
        @echo convert "$<" to "$@"
    

    A couple of quick notes for make beginners:

    Even if this should handle all UTF-8 characters and stuff, it will fail at spaces in file or directory names, as make uses spaces to separate stuff in the makefiles and I am not aware of a way to work around that. So that leaves you with just a shell script, I am afraid :-/