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.
81 lines
3.2 KiB
Markdown
81 lines
3.2 KiB
Markdown
# 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
|
|
* About Makefile syntax: [5 Writing Recipes in Rules](https://www.gnu.org/software/make/manual/make.html#Recipes)
|