0

I have the following directory structure for a dummy C project.

.
├── inc
│   ├── getmsg.c
│   └── getmsg.h
├── makefile
└── src
    └── main.c

My current generic Makefile is below,

TARGET = main

# finds all .c files, inc/getmsg.c src/main.c
SOURCES := $(shell find * -name *.c)
# converts all .c files to .o files, inc/getmsg.o src/main.o
OBJECTS := $(SOURCES:.c=.o)  
# directories that contain .h files for gcc -I flag, inc/
HEADERS := $(dir $(shell find * -name *.h))

CC     = gcc
CFLAGS = -Wall -std=c99 -iquote "$(HEADERS)"

all: $(TARGET)

%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

$(TARGET): $(OBJECTS)
    $(CC) -o $@ $^

clean:
    rm -rf $(shell find * -name *.o) $(TARGET)

This all compiles fine however it just dumps the .o files into the same directory as its corresponding .c file.

What I would like to do is have all object files put into a build directory. To do this I change the OBJECTS to OBJECTS := $(patsubst %,build/%,$(notdir $(SOURCES:.c=.o))) which lists the files build/getmsg.o build/main.o. Then I set the %.o target to build/%.o: %.c.

This however returns No rule to make target 'build/getmsg.o'. So the make file is unable to build the .o files. What am I missing here?

  • Duplicates http://stackoverflow.com/questions/13552575/gnu-make-pattern-to-build-output-in-different-directory-than-src – Alexey Semenyuk Feb 09 '17 at 17:46
  • Possible duplicate of [GNU Make pattern to build output in different directory than src](http://stackoverflow.com/questions/13552575/gnu-make-pattern-to-build-output-in-different-directory-than-src) – Mike Kinghan Feb 09 '17 at 18:43

1 Answers1

0

Try changing

%.o: %.c

to

build/%.o: %.c 
MrJagaloon
  • 102
  • 1
  • 7