I have been struggling a bit to get make to compile only the files that have been edited. However I didn't have much success and all the files get recompiled. Can someone explain me why?
My files are:
main.c
a_functions.c
where main.c includes main.h and a_functions.c includes a.h
Here is my makefile:
CC=gcc
CFLAGS=-Wall -I. -c
EXEC_FILE=program1
all: program
a_functions.o: a_functions.c
a_functions.c: a.h
main.o: main.c
main.c: main.h
objects: a_functions.c main.c
$(CC) a_functions.c main.c $(CFLAGS)
program: a_functions.o main.o
$(CC) a_functions.o main.o -o $(EXEC_FILE)
Changing the makefile as per suggestions seems to have the same problem::
all: program
a_functions.o: a_functions.c a.h
gcc a_functions.c -c
main.o: main.c main.h
gcc main.c -c
program: a_functions.o main.o
gcc a_functions.o main.o -o program1
Not sure if this is causing your specific problem but the two lines:
are definitely wrong, because there's generally no command to re-create a C file based on a header it includes.
C files don't depend on their header files, the objects created by those C files do.
For example, a
main.c
of:would be in the
makefile
as something like:Change:
to:
(assuming that
a_functions.c
includesa.h
andmain.c
includesmain.h
) and try again.If that assumption above is wrong, you'll have to tell us what C files include what headers so we can tell you the correct rules.
If your contention is that the
makefile
is still building everything even after those changes, you need look at two things.The first is the output from
ls -l
on all relevant files so that you can see what dates and times they have.The second is the actual output from
make
. The output ofmake -d
will be especially helpful since it shows what files and datesmake
is using to figure out what to do.In terms of investigation,
make
seems to work fine as per the following transcript:The specific problem you're talking about -- Make rebuilds
program1
(by relinking the objects) even when nothing has changed -- is in this rule:The target of this rule is
program
, and Make assumes that it is a file. But since there is no such file, every time you run Make, Make thinks that this file needs to be rebuilt, and executes the rule. I suggest this:Or better, this:
Or better still this:
(And don't forget to change the
all
rule to match.)A few other points:
As @paxdiablo pointed out,
It doesn't make sense to link these objects together unless something in one (probably
main.o
) calls something in the other (probablya_functions.o
), so I would expect to see a dependency like this:So I suspect that you have some misplaced declarations.
You declare an
objects
rule, but never refer to it. So you never actually use it; Make uses the default rule for%.o: %.c
. I suggest this:(In which case you can change
$(EXEC_FILE): a_functions.o main.o
to$(EXEC_FILE): $(OBJECTS)
.) Or just this: