-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathframework.mk
144 lines (127 loc) · 5.6 KB
/
framework.mk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# Makefile framework for Packer VM builds
# prerequisites
include $(FRAMEWORK_DIR)/lib/utils.mk
# protect against double inclusion
$(call mk_include_guard,vm_framework)
# load configuration file
include $(FRAMEWORK_DIR)/config.default.mk
# speed tweaks
MAKEFLAGS += --no-builtin-rules
.SUFFIXES:
## <vm>-specific (placeholder for VM's ID + goal) variables and their defaults
# <vm>-type: type of the rules generator (defaults to packer)
-vm-type = $(call _def_value,$(vm)-type,packer)
# <vm>-name: name of the VM (also used to generate VM's destination directory + images file)
-vm-name = $(call _def_value,$(vm)-name,$(vm))
# <vm>-src: source (root) directory of the Packer project (should contain .pkr.hcl file)
-vm-packer-src = $(call _def_value,$(vm)-packer-src,$(vm))
# <vm>-packer-def-args: default packer invocation arguments (before all other)
-vm-packer-def-args = $(call _def_value,$(vm)-packer-def-args,)
# <vm>-packer-args: extra packer invocation arguments
-vm-packer-extra-args = $(call _def_value,$(vm)-packer-args,)
# <vm>-src-from: take source image from another makefile VM (goal name)
-vm-source-from = $($(vm)-src-from)
# <vm>-src-image: take source image from another file (when ! <vm>-source-from)
-vm-source-image = $(strip $(if $(-vm-source-from),$(let vm,$(-vm-source-from),$(-vm-dest-image)),\
$(call _def_value,$(vm)-src-image,$$(BASE_VM_INSTALL_ISO))))
# <vm>-src-deps: override the VM target dependencies (defaults to "<vm>-src/**")
-vm-source-deps = $(call _def_value,$(vm)-src-deps,$(call rwildcard,$(-vm-packer-src),*))
# <vm>-dest-file: override the destination image filename (+ extension!)
-vm-dest-file = $(call _def_value,$(vm)-dest-file,$(-vm-name).qcow2)
# <vm>-dest-dir: override the destination directory (defaults to <vm>-name)
-vm-dest-dir = $(call _def_value,$(vm)-dest-dir,$$(BUILD_DIR)/$(-vm-name))
# <vm>-deps: add extra dependencies to the VM's targets
-vm-extra-deps = $(call _def_value,$(vm)-deps,)
# <vm>-extra-rules: generates extra rules for the current VM target
# -> use `define` to create multi-line rules;
# -> you can use $(vm) inside (or every other macro containing $(vm))!
-vm-extra-rules = $($(vm)-extra-rules)
# internal macros:
-vm-copy-scripts = $(call _def_value,$(vm)-copy-scripts,)
-vm-copy-scripts-list = $(call _packer_json_list,$(-vm-copy-scripts))
-vm-dest-image = $(-vm-dest-dir)/$(-vm-dest-file)
-vm-dest-timestamp = $(-vm-dest-dir)/.exists
-vm-image-deps = $(strip $(if $(-vm-source-from),$(let vm,$(-vm-source-from),$(-vm-dest-timestamp)),\
$(-vm-source-image)))
-vm-rule-deps = $(-vm-source-deps) $(-vm-extra-deps) $(-vm-image-deps) | $$(BUILD_DIR)/
-vm-packer-args = $$(PACKER_ARGS) $(-vm-packer-def-args) \
-var "vm_name=$(-vm-dest-file)" \
-var "source_image=$(-vm-source-image)" \
-var "output_directory=$(-vm-dest-dir)" \
$(-vm-packer-extra-args) $$(packer-args-extra)
# Packer build command with VM-specific vars
define vm_packer_cmd
$(if $(FORCE),rm -rf "$(-vm-dest-dir)";,) \
cd "$(-vm-packer-src)" && $(PACKER) build $(-vm-packer-args) "./"
endef
# Macro to generate packer-specific rules
define vm_gen_packer_rules
# VM build rules for $(vm)
$(vm)-dest-image := $(-vm-dest-image)
.PHONY: $(vm) $(vm)_clean $(vm)_edit $(vm)_commit
#@ $(vm) main build goal
$(vm): $(-vm-dest-image)
$(-vm-dest-image): $(-vm-rule-deps)
$(vm_packer_cmd)
touch "$(-vm-dest-timestamp)"
#@ $(vm) secondary target (ignores force rebuild, for use as dependency)
$(-vm-dest-timestamp):
$$(MAKE) FORCE= "$(-vm-dest-image)"
#@ $(vm) clean rule
$(vm)_clean:
rm -rf "$(-vm-dest-dir)/" "$$($(vm)-edit-dir)"
#@ $(vm) vmdk conversion rule
$(vm)-vmdk-file := $(-vm-dest-dir)/$(-vm-dest-file:.qcow2=.vmdk)
$(vm)_vmdk: $$($(vm)-vmdk-file)
$$($(vm)-vmdk-file): $(-vm-dest-timestamp)
qemu-img convert -O vmdk "$(-vm-dest-image)" "$$($(vm)-vmdk-file)"
ls -lh "$$($(vm)-vmdk-file)"
#@ $(vm) edit rule: uses $(vm) as backing file for rapid VM testing / editing
$(vm)_edit: PAUSE=1
$(vm)_edit: packer-args-extra=-var "use_backing_file=true"
$(vm)_edit: $(-vm-dest-timestamp)
$(let -vm-source-image,$(-vm-dest-image), \
$(let -vm-name,$(-vm-name)_edit,$(vm_packer_cmd)))
$(vm)-edit-dir := $(let -vm-name,$(-vm-name)_edit,$(-vm-dest-dir))
$(vm)-edit-file := $(let -vm-name,$(-vm-name)_edit,$(-vm-dest-file))
#@ commits $(vm)_edit changes back to its backing image
$(vm)_commit:
qemu-img commit "$$($(vm)-edit-dir)/$$($(vm)-edit-file)"
# extra rules? ::
$(-vm-extra-rules)
endef
vm_gen_one_target_rules = $(call check-var,vm_gen_$(-vm-type)_rules)$(vm_gen_$(-vm-type)_rules)
vm_gen_all_target_rules = $(foreach vm,$(build-vms),$(nl)$(vm_gen_one_target_rules))
vm_eval_all_target_rules = $(foreach vm,$(build-vms),$(eval $(nl)$(vm_gen_one_target_rules)))
define vm_gen_common_rules
.PHONY: _ init ssh
_: $(DEFAULT_GOAL)
init:
$(foreach vm,$(INIT_GOAL),packer init "$(-vm-packer-src)";)
# ssh into a Packer/qemu VM
ssh:
$$(SSH) $$(SSH_ARGS) $$(SSH_USER)@127.0.0.1 -p $$(SSH_PORT)
# creates the build directory
$$(BUILD_DIR)/:
mkdir -p "$$@"
endef
# debugging helper rules
define vm_gen_debug_rules
# debug helpers
.PHONY: @debug @debug-make @debug-rules
@debug: @debug-rules
@debug-rules:
$$(info $$(build-vms))
$$(info $$(vm_gen_all_target_rules))
@echo
@debug-make: @debug-rules
@$(MAKE) -r -p
@print-% : ; @echo $$* = $$($$*)
endef
vm_eval_debug_rules = $(eval $(vm_gen_debug_rules)$(nl))
vm_eval_common_rules = $(eval $(vm_gen_common_rules))$(call vm_eval_debug_rules)
# Macro to evaluate all rules
vm_eval_all_rules = $(vm_eval_common_rules)$(vm_eval_all_target_rules)
# backwards compatibility macro aliases (previously renamed)
eval_common_rules ?= $(vm_eval_common_rules)
eval_all_vm_rules ?= $(vm_eval_all_target_rules)