user4035
user4035

Reputation: 23719

Make recompiles non-updated files

I was experimenting with GNU make. Suppose, I have 3 C files with the following structure:

hellomake.c
    |
    |---------------------
    |                    |
    V                    V
hellofunc.c         hellomake.h

makefile:

hellomake: hellomake.c hellofunc.c
    gcc -o hellomake hellomake.c hellofunc.c -I.

When I type make for the 1-st time, it creates a program hellomake. When I run it for the 2-nd time, it prints:

make: `hellomake' is up to date.

Everything is working correctly.

I tried to use make for compiling LaTeX files. Suppose, I have 2 TeX files:

  1.tex
    |
    V
1_data.tex

1_data is included into 1.tex internally.

Makefile:

COMMAND = pdflatex

all: 1.tex 1_data.tex
    $(COMMAND) 1.tex

But it recompiles 1.tex every time I type make. Even if none of the files were modified.

What's wrong?

Upvotes: 0

Views: 88

Answers (1)

tripleee
tripleee

Reputation: 189297

makesimply looks at whether or not all exists. Since it doesn't, it attempts to create it (but doesn't even notice that your commands do not create the file!)

Assuming pdflatex really creates a file somewhere, use the file name as the target name. Then it will be recreated only if it is older than the dependencies.

To recapitulate, a Makefile declares a mapping of target files, their dependencies, and how to create them from the dependencies. When a target is missing or out of date with respect to its dependencies, Make runs the commands for recreating it.

(My first attempt at articulating this answer mentioned .PHONY: targets as an aside, but that's not really useful in this context; if you declared .PHONY: all it would run the recipe even if a file named all existed, so that's the opposite behavior of what you are looking for.)

Upvotes: 2

Related Questions