You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3.2 KiB

Makefile Documentation

SYNTAX: AUTOMATIC VARIABLES

https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html

  • $@ file name of the target of the rule.
  • $< name of the first prerequisite.
  • $? names of all the prerequisites that are newer than the target, with spaces between .
  • $^ names of all the prerequisites,
  • $(@D) directory part of the file name of the target,

SYNTAX: PRINTING / ERRORS

@ preceeding command tells make not to print the command being executed

  • preceeding a command tells make to ignore errors in a recipe line

DEPENDENCIES AND RULES

a rule "asks" a dependency to be executed, only if the depency does not exist as a file i.e. I have the 2 following rules in my make file:

list.txt:
	ls . -1 > $@

tts: list.txt
	cat $< | espeak

when i run: make tts tts rule will execute its dependency list.txt IF the list.xt does not exist in the top level of working directory. ELSE it will execute the list.txt

TARGET NAMES

use as rules' targets (first line of a rule,left of :) the name of resulting file(s)

One main problem in the OuNuPo makefile is the execution of the tesseract rule, every time another rule requests it (in make lingo has it as a dependency). This a duplication of the same process (ocr), which takes quite some time, and hence we want to avoid repeting, if the scanned images haven't changed. Make has a very simple way of avoiding this duplication of a process/rule. It is done carefully defining the rules' target - the name given to the rule, by which we invoke in order to execute that rule. By having the target of a rule take the name of the file(s), which will result from to the rule's execution, the Makefile, will check if that file is "out of date". "A target is out of date if it does not exist or if it is older than any of the prerequisites "

If the target/resulting file(s) are not present, the dependency rule will be executed If the target/resulting file(s) are not present, the dependency rule will NOT be executed

what follows is a simple example

foo.txt:
	echo "this is a test" >> foo.txt
	@echo "$@ was made"

art: foo.txt
	cat foo.txt | figlet
	@echo "$@ was made"

For the first time you run make art the foo.txt dependency rule will be executed In subsequent runs of make art foo.txt dependency rule will NOT be executed, because its target: foo.txt is already in the make working directory To trigger the execution of foo.txt rule, we need to remove its target from the working directoy That task if often delegate to a rule with target clean which removes the files/targets of make, such as

clean: removes output (target) files
	rm ocr/output.txt
	rm $(wildcard output/*)
	rm $(tmpfile)

After running make clean the foo.txt rule is executed (as a dependancy) when running make art

Targets can also include subfolders:

output/art.txt: foo.txt
	cat foo.txt | figlet > $@
	@echo "$@ was made"

which can be invoked by make output/art.txt

Read more on https://www.gnu.org/software/make/manual/html_node/Rule-Syntax.html#Rule-Syntax

LINKS