159 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| title:
 | |
| - Making Makefiles
 | |
| author:
 | |
| - Malin
 | |
| 
 | |
| theme:
 | |
| - Warsaw
 | |
| colortheme:
 | |
| - orchid
 | |
| ---
 | |
| 
 | |
| # Intro
 | |
| 
 | |
| The fundamental problem:
 | |
| 
 | |
| ```bash
 | |
| git submodule update --init soundscape
 | |
| cargo build --release
 | |
| install -pm755 target/release/tap /usr/local/bin/
 | |
| ```
 | |
| 
 | |
| You can't type this after every test.
 | |
| 
 | |
| ***
 | |
| 
 | |
| ## 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
 | |
| ```
 | |
| 
 | |
| ***
 | |
| 
 | |
| # Basic
 | |
| 
 | |
| - *Gotcha*: directories
 | |
| - This, that, and these
 | |
| 
 | |
| ***
 | |
| 
 | |
| ## Repetition, Repetition, Repetition
 | |
| 
 | |
| ```make
 | |
| .PHONY: output
 | |
| output: release/index.html
 | |
| 
 | |
| release/: backups.zip
 | |
| 	mkdir $@
 | |
| 
 | |
| release/index.html: index.html release/
 | |
| 	cp  $< $@
 | |
| 
 | |
| index.html: backups.zip
 | |
| 	unzip $<
 | |
| ```
 | |
| 
 | |
| ***
 | |
| 
 | |
| # Variables
 | |
| 
 | |
| - From your shell.
 | |
| - New variables.
 | |
| - Filenames as variables.
 | |
| - *Gotcha*: no shell variables, only make!
 | |
| 
 | |
| ## Equality
 | |
| 
 | |
| - Variables with '=', never ':='.
 | |
| - *Gotcha*: one shell per line.
 | |
| - Variables as shell output.
 | |
| 
 | |
| 
 | |
| ***
 | |
| 
 | |
| 
 | |
| # Phonies, and the Problems with Lies
 | |
| 
 | |
| - clean (common)
 | |
| - check (excellent)
 | |
| 
 | |
| ***
 | |
| 
 | |
| 
 | |
| ## Non-Compiling Checks
 | |
| 
 | |
| - `make` -n
 | |
| - *Gotcha*: shell output variables.
 | |
| 
 | |
| ***
 | |
| 
 | |
| 
 | |
| # The Fourth Sigil: `%`
 | |
| 
 | |
| - Standard rules, e.g. ImageMagick, copying, et c.
 | |
| - *Gotcha*: intermediaries are deleted.
 | |
| 
 | |
| ***
 | |
| 
 | |
| # Bling: make2graph
 | |
| 
 | |
| - *Gotcha*: completely outdated.
 | |
| 
 | |
| ***
 | |
| 
 | |
| # Inclusivity
 | |
| 
 | |
| - `include dir/Makefile`
 | |
| - *Gotcha*: directory has not changed
 | |
| - `$(MAKEFILE_LIST)`
 | |
| 
 | |
| 
 | |
| # Special Commands
 | |
| 
 | |
| - dir
 | |
| - `DIR = test -d $(dir $@) || mkdir $(dir $@)`
 | |
| - patsubst
 | |
| - Wildcards (or not?)
 | |
| 
 | |
| # Maintanance
 | |
| 
 | |
| - backups
 | |
| - saving files
 |