Compare commits

...

6 Commits

Author SHA1 Message Date
andonome 0d2d466dac typo 2024-11-17 14:19:28 +01:00
andonome 8cc2a71235 note python makefile 2024-11-17 14:19:28 +01:00
andonome fa026b7eda ending notes 2024-11-13 16:40:30 +01:00
andonome 7bc84ab8a3 finish examples 2024-11-13 16:06:46 +01:00
andonome e59538a3bd place example makefiles 2024-11-13 14:23:44 +01:00
andonome a9f7fd7f75 add basic makefile examples 2024-11-12 03:58:47 +01:00
9 changed files with 413 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
*
+8
View File
@@ -0,0 +1,8 @@
CHECKER = command -v
.PHONY: check
check:
$(CHECKER) fortune >/dev/null
$(CHECKER) cowsay >/dev/null
file: | check
fortune | cowsay > $@
+13
View File
@@ -0,0 +1,13 @@
forts/big_fort.txt: forts/short.txt forts/long.txt
cat forts/short.txt forts/long.txt > forts/big_fort.txt
forts/:
mkdir forts
forts/short.txt: forts/
fortune -s > forts/short.txt
forts/long.txt: forts/
fortune -l > forts/long.txt
+21
View File
@@ -0,0 +1,21 @@
forts/big_fort.txt: forts/short.txt forts/long.txt
cat $^ > $@
README.md:
echo "For an example makefile for python" > $@
echo "check out the nd6 dice-roller at" >> $@
echo "ssh -p 2222 soft.dmz.rs -t nd6" >> $@
forts/: README.md
mkdir -p $@
forts/short.txt: forts/
fortune -s > $@
forts/long.txt: forts/
fortune -l > $@
clean:
rm -rf forts
+18
View File
@@ -0,0 +1,18 @@
IMAGES = $(wildcard jpgs/*)
COL = $(patsubst jpgs/%,collection/%,$(IMAGES))
.PHONY: help
help:
$(info try 'show' or 'output')
.PHONY: show
show:
$(info IMAGES is $(IMAGES))
$(info Col is $(COL))
.PHONY: output
output: $(COL)
collection/%.jpg: jpgs/%.jpg
mkdir -p $(@D)
cp $< $@
+15
View File
@@ -0,0 +1,15 @@
CP = ln -f
output: pngs/ldap.png
jpgs/ldap.jpg: ../../ldap/ldap.jpg
mkdir -p $(dir $@)
$(CP) $< $@
pngs/%.png: jpgs/%.jpg
mkdir -p $(dir $@)
$(info making $(@F) in $(@D))
magick $< $@
clean:
$(RM) -r pngs jpgs
+10
View File
@@ -0,0 +1,10 @@
include /etc/os-release
DAY != date +%d
MESSAGE != fortune -s
motd_$(DAY):
$(info Hello $(USER))
$(info Placing message:)
echo "Welcome to $(NAME)" > $@
echo $(MESSAGE) >> $@
+13
View File
@@ -0,0 +1,13 @@
---
title:
- Making Makefiles
author:
- Malin
theme:
- Warsaw
colortheme:
- orchid
---
(presentation in presentation.md)
+314
View File
@@ -0,0 +1,314 @@
# Intro
The fundamental problem:
```bash
git submodule update --init soundscape
cargo build --release
install -pm755 target/release/tap /usr/local/bin/
```
*But you can't type this for each run.*
***
## First Solution
```bash
#!/bin/sh
git submodule update --init soundscape
cargo build --release
install -pm755 target/release/tap /usr/local/bin/
```
At this point, every test takes 10 minutes.
## Second Solution
```bash
#!/bin/sh
[ -f soundscape/.git ] || git submodule update --init soundscape
[ -f target/release/tap ] || cargo build --release
[ -f target/release/tap ] || \
install -pm755 target/release/tap /usr/local/bin/
```
***
# Makefile Solutions
- input, process, output.
- automatic idempotence
```bash
INSTALL_DIR = /usr/local/bin
soundscape/.git:
git submodule update --init soundscape
/usr/local/bin/tap: target/release/tap
install -pm755 target/release/tap $(INSTALL_DIR)
target/release/tap: src soundscape/.git
cargo build --release
```
***
# The Three Sigils
Readable, but slow:
```make fort_1
forts/big_fort.txt: forts/short.txt forts/long.txt
cat forts/short.txt forts/long.txt > forts/big_fort.txt
forts/:
mkdir forts
forts/short.txt: forts/
fortune -s > forts/short.txt
forts/long.txt: forts/
fortune -l > forts/long.txt
```
***
| Make this | From That | From These |
|:---------:|:---------:|:----------:|
| `$@` | `$<` | `$^` |
```make fort_2
forts/big_fort.txt: forts/short.txt forts/long.txt
cat $^ > $@
forts/: README.md
mkdir $@
forts/short.txt: forts/
fortune -s > $@
forts/long.txt: forts/
fortune -l > $@
```
***
# Gotcha: Directories
```make fort_2
forts/big_fort.txt: forts/short.txt forts/long.txt
cat $^ > $@
forts/: README.md
mkdir $@
forts/short.txt: forts/
fortune -s > $@
forts/long.txt: forts/
fortune -l > $@
README.md:
echo "Find the fortunes in the fort dir" > $@
```
***
# Variables
```make vars
include /etc/os-release
DAY != date +%d
MESSAGE != fortune -s
motd_$(DAY):
$(info Placing message:)
echo "Welcome to $(NAME)" > $@
echo $(MESSAGE) >> $@
```
### Gotcha: Hanging Quotes
> echo "Welcome to "Arch Linux""
***
## Add New Variables
```make
make -f vars -e MESSAGE="Red alert, all hands on deck!"
```
### Gotcha: Quote, or Risk Escape
```make
make -f vars -e MESSAGE="<h1> HTML Headers </h1>"
```
***
# Gotcha: Variables from Shell
This works:
```make
file:
$(info Hello $(USER))
```
...but not this:
```make
file:
user=bob
echo $user
```
Nor this:
```make
numbers:
for x in 1 2 3 4 5; do
echo $x
done > $@
```
Nor this:
```make
numbers:
for x in 1 2 3 4 5; do echo $x ; done > $@
```
***
### Ugly Fixes are Ugly
This works, but don't.
```make
file:
for x in 1 2 ;\
do echo $$x ;\
done > $@
```
***
# Phonies, and the Problems with Lies
## Clean
```make
.PHONY: clean
clean:
git clean -fdX
```
## Gotcha: Recompiling without Changes
```make
CHECKER = command -v
.PHONY: check
check:
$(CHECKER) fortune >/dev/null
$(CHECKER) cowsay >/dev/null
file: check # Needs a '|'
fortune | cowsay > $@
```
***
## Non-Compiling Checks
- `make` -n
- *Gotcha*: shell output variables.
***
# The Fourth Sigil: `%`
Create standardized rules with `%`.
```make rules
CP = ln -f
output: pngs/ldap.png
jpgs/ldap.jpg: ../../ldap/ldap.jpg
mkdir -p $(dir $@)
$(CP) $< $@
pngs/%.png: jpgs/%.jpg
mkdir -p $(dir $@)
$(info making $(@F) in $(@D))
magick $< $@
```
***
# Bling: makefile2graph
```graph
┌────────────────┐ ┌────────────────────┐
│ forts/long.txt │ ◀── │ forts/ │
└────────────────┘ └────────────────────┘
│ │
│ │
│ ▼
│ ┌────────────────────┐
│ │ forts/short.txt │
│ └────────────────────┘
│ │
│ │
│ ▼
│ ┌────────────────────┐
└──────────────────▶ │ forts/big_fort.txt │
└────────────────────┘
```
### Gotcha: The Binary is Called `make2graph`
- Works with GUI tools maybe, IDK, I don't use Windows.
- Some systems can use `graph-easy`, but it's outdated.
***
# Patsubst and Wildcards
```make pats
IMAGES = $(wildcard jpgs/*)
COL = $(patsubst jpgs/%,collection/%,$(IMAGES))
.PHONY: show
show:
$(info IMAGES is $(IMAGES))
$(info Col is $(COL))
.PHONY: output
output: $(COL)
collection/%.jpg: jpgs/%.jpg
mkdir -p $(@D)
cp $< $@
```
***
# Use Cases
- Backups
- Making Websites
* `git clone https://gitlab.com/bindrpg/blag`
- `NOT installations`
- ...but maybe installations?
- Setting