ending notes
This commit is contained in:
		| @@ -10,314 +10,4 @@ colortheme: | ||||
| - orchid | ||||
| --- | ||||
|  | ||||
| # 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 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 | ||||
|  | ||||
| (presentation in presentation.md) | ||||
|   | ||||
							
								
								
									
										314
									
								
								slides/makefiles/presentation.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										314
									
								
								slides/makefiles/presentation.md
									
									
									
									
									
										Normal 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 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 | ||||
		Reference in New Issue
	
	Block a user