Monday, January 31, 2022

[SOLVED] How exactly "make all" works?

Issue

So I am studying makefiles usage. Let's say I 've many functions fun_i.c where i is in [1,100]. I have wrote them all in seperate .c files in order to make faster compilation when I only change some of them. I need to create a Makefile. I was thinking something like that:

all : program
program: fun1.o fun2.o   ........ fun100.o main.o
         gcc -o program fun1.o fun2.o ..... fun100.o
fun1.o: fun1.c
        gcc -c fun1.c 
.
.
.
fun100.o: fun100.c 
          gcc -c fun100.c
main.o : main.c 
         gcc -c main.c 

I 've read many articles online talking about how the target "all" makes sure that everytime I change something in a function and I call make it will update only what changes (so I'm going to avoid uneccessary recompilation). However, I am not sure if I am using it right here. I checked my makefile ( with 2 functions though) and it worked fine. But I am not sure if that's the way to take advantage of all here. I tried to remove it and just leave program and below.. there and it worked as fine. What am I missing? Could you may provide examples that all is critical?


Solution

I 've read many articles online talking about how the target "all" makes sure that everytime I change something in a function and I call make it will update only what changes

all does not mean anything. It's just a convention. You have to define the targets correctly to do what you want. If you want make all to recompile everything, you need to define it so that it does that.

so I'm going to avoid uneccessary recompilation

In practice, I'd say that this is a completely unnecessary concern, and it's a waste of time creating makefiles that does this. If you have a large project you should not create makefiles manually. You use a build system like cmake.

If the project is small and only contain a few files, then the compilation time is in general not an issue. For a small project, my goal with a makefile would be to not have to type the compiler flags all the time.

Here is a makefile that would work fine for most very small projects like school assignments:

CFLAGS=-Wall -Wextra -pedantic -std=c17 -fsanitize=address
LIBS=-lm -lpthread

program:
        gcc $(CFLAGS) $(LIBS) *.c

clean:
        rm -rf *.o *~


Answered By - klutt
Answer Checked By - Gilberto Lyons (WPSolving Admin)