Makefile learning notes

Keywords: Makefile Linux

Reference articles
makefile implements the automatic compilation and generation of the whole project under linux, especially in complex projects.
The rules for makefile s are simple:
target ... : prerequisites ...
command
...
...
Target is the target file you want, prerequisites is its dependent file, and the following command is the specific instruction.
A simple example

edit : main.o kbd.o command.o display.o /
insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o /
insert.o search.o files.o utils.o

main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit main.o kbd.o command.o display.o /
insert.o search.o files.o utils.o

edit is the final target file we want. It depends on 8. c files and 3. h files.

The above version is a little bloated. Here is a simple version

objects = main.o kbd.o command.o display.o /
insert.o search.o files.o utils.o

edit : $(objects)
cc -o edit $(objects)

main.o : defs.h
kbd.o : defs.h command.h
command.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h

.PHONY : clean
clean :
rm edit $(objects)

In this version, we use the variables objects and the automatic derivation mechanism of makefile, omit the dependency of main.o on main.c, and introduce the pseudo target file clean, which will be used to clear the files generated by compilation.

Putting the pseudo target at the beginning can realize the function of generating multiple targets at the same time, for example:

all : prog1 prog2 prog3
.PHONY : all

prog1 : prog1.o utils.o
cc -o prog1 prog1.o utils.o

prog2 : prog2.o
cc -o prog2 prog2.o

prog3 : prog3.o sort.o utils.o
cc -o prog3 prog3.o sort.o utils.o

The following describes static mode

objects = foo.o bar.o
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@

Equivalent to

foo.o : foo.c
$(CC) -c $(CFLAGS) foo.c -o foo.o
bar.o : bar.c
$(CC) -c $(CFLAGS) bar.c -o bar.o

Where $< represents the dependency set and $@ represents the target set.

Posted by bobob on Sun, 29 Mar 2020 07:39:55 -0700