Makefile Minecraft crafting
⏳ Doba čtení: ~4 min (565 slov)Odkaz na github
Pro hlubší pochopení Makefile jsem se rozhodl vytvořit jednoduchou simulaci Minecraft crafting systému pomocí Makefile. Cílem je ukázat, jak Makefile může být použit pro orchestraci závislostí a automatizaci procesů v kontextu, který je zábavný a snadno pochopitelný.
Předpisy make:
targets: prerequisites
recipe
Jednoduchá závislost pro ukázku:
crafting_table: oak_planks
@echo "$(YELLOW)Crafting$(RESET) crafting table from oak planks..."
@touch $@
stick: oak_planks
@echo "$(YELLOW)Crafting$(RESET) stick from oak planks..."
@touch $@
oak_planks: oak_log
@echo "$(YELLOW)Crafting$(RESET) oak planks from oak log..."
@touch $@
oak_log: visit_forest
@echo "$(YELLOW)Cutting$(RESET) a oak tree to get an oak log..."
@touch $@
visit_forest:
@echo "$(YELLOW)Visiting$(RESET) the forest to find an oak tree..."
@touch $@
| Pojem | Minecraft Analogie | Význam v automatizaci |
|---|---|---|
| Target | crafting_table | Výsledný artefakt (soubor). |
| Prerequisites | oak_planks | Vstupy, bez kterých proces nezačne. |
| Recipe | Make crafting table | Skript/příkaz, který transformuje vstupy na výstup. |
Příkaz touch $@ představuje vytvoření souboru, který reprezentuje úspěšné dokončení kroku.
Všechny targety jsou zde soubory, které se postupně vytvářejí. Pokud spustíme make crafting_table, make zkontroluje závislosti a spustí příkazy v pořadí, které zajistí, že všechny potřebné soubory budou vytvořeny.
crafting_table > oak_planks > oak_log > visit_forest
Postupně se nám tak vytvoří soubory:
visit_forestoak_logoak_plankscrafting_table
Zobecnění pravidla _ingot
%_ingot: %_ore furnace coal
@echo "Smelting $(notdir $<) in the furnace to create $@..."
@touch $@
% funguje jako wildcard. Pokud make hledá iron_ingot, dosadí za % iron. Vyžaduje k tomu soubor %_ore (např. iron_ore) a pec (furnace) a uhlí (coal).
Automatické proměnné:
$@: Cíl (např. iron_ingot).$<: První závislost (např. iron_ore). To je užitečné, protože v peci tavíme rudu, ne uhlí nebo pec samotnou.
Další zobecnění pro nástroje
# Definice nastroju
PICKAXES = diamond_pickaxe iron_pickaxe stone_pickaxe wooden_pickaxe
# Vybere prvni existujici nastroj z seznamu
PICKAXE = $(firstword $(wildcard diamond_pickaxe iron_pickaxe stone_pickaxe wooden_pickaxe))
# Nastroje vyzaduji: material + tycky + stul
%_pickaxe: %_material stick crafting_table
@echo "$(YELLOW)Crafting$(RESET) tool $@ from $<..."
@touch $@
# Definice, co je materialem pro dany typ (alias pro pattern rule)
iron_material: iron_ingot
@ln -sf $< $@
stone_material: cobblestone
@ln -sf $< $@
wooden_material: oak_planks
@ln -sf $< $@