Skip to content

Makefile

target: dependencies
    commands
hello.o: hello.c
    gcc -c hello.c
calc: main.o add.o sub.o
    gcc main.o add.o sub.o -o calc

main.o: main.c
    gcc -c main.c
add.o: add.c
    gcc -c add.c
sub.o: sub.c
    gcc -c sub.c

Variables

CC=gcc
CFLAGS=-Wall -g
OBJ = main.o add.o sub.o

calc: $(OBJ)
    $(CC) $(CFLAGS) $(OBJ) -o calc

Pattern Rules

CC = gcc
CFLAGS = -Wall -g
OBJ = main.o add.o sub.o 

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

Clean Rule

clean:
    rm -f *.o calc
Variable Meaning
$@ The target file name
$< The first prerequisite
$^ All prerequisites
$? Only prerequisites newer than the target
### Phony Target
  • Targets like clean don't produce real files
.PHONY: clean
clean:
    rm -f *.o calc

Multi Directory Project

src/ main.c math/ add.c sub.c include/ add.h sub.h

CC = gcc
CFLAGS = -Iinclude -Wall
SRC = src/main.c src/math/add.c src/math/sub.c
OBJ = $(SRC:.c=.o)
TARGET = calc 
$(TARGET): $(OBJ)
    $(CC) $(CFLAGS) -o $@

%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@
.PHONY: clean
clean:
    rm -f $(OBJ) $(TARGET)
MSG smitha HI THERE MACHA