forked from sonic-net/sonic-buildimage
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfunctions
216 lines (188 loc) · 8.1 KB
/
functions
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
###############################################################################
## FUNCTIONS
###############################################################################
###############################################################################
## Colored output
###############################################################################
# Enable colored output
ifeq ($(SONIC_CONFIG_ENABLE_COLORS),y)
ifeq ($(MAKE_TERMOUT),)
RED=\033[1;31m
PURPLE=\033[1;35m
CYAN=\033[1;36m
GREEN=\033[1;32m
GRAY=\033[0m
endif
endif
ifeq ($(BUILD_LOG_TIMESTAMP),simple)
PROCESS_LOG_OPTION = -t
endif
# Print red colored output
# call:
# log_red message
log_red = echo -e "$(RED)$(1)$(GRAY)"
# Print purple colored output
# call:
# log_purple message
log_purple = echo -e "$(PURPLE)$(1)$(GRAY)"
# Print blue colored output
# call:
# log_blue message
log_blue = echo -e "$(CYAN)$(1)$(GRAY)"
# Print green colored output
# call:
# log_green message
log_green = echo -e "$(GREEN)$(1)$(GRAY)"
###############################################################################
## Logging
###############################################################################
FLUSH_LOG = rm -f $@.log
LOG_SIMPLE = &>> $(PROJECT_ROOT)/$@.log || { [ $$? -eq 0 ] || pushd $(PROJECT_ROOT) > /dev/null ; ./update_screen.sh -e $@ ; popd > /dev/null ; false ; }
LOG = < /dev/null |& $(PROJECT_ROOT)/scripts/process_log.sh $(PROCESS_LOG_OPTION) &>> $(PROJECT_ROOT)/$@.log ; test $${PIPESTATUS[-2]} -eq 0 || { [ $$? -eq 0 ] || pushd $(PROJECT_ROOT) > /dev/null ; ./update_screen.sh -e $@ ; popd > /dev/null ; false ; }
###############################################################################
## Header and footer for each target
###############################################################################
START_TIME = echo Build start time: $$(date -ud "@$($@_TSTMP_ST)") $(LOG)
END_TIME = echo Build end time: $$(date -ud "@$($@_TSTMP_END)") $(LOG)
ELAPSED_TIME = echo Elapsed time: $$(date -ud "@$$(( $($@_TSTMP_END) - $($@_TSTMP_ST) ))" +'%-Hh %-Mm %-Ss') $(LOG)
# Dump targets taht current depends on
ifeq ($(SONIC_CONFIG_PRINT_DEPENDENCIES),y)
PRINT_DEPENDENCIES = echo Dependencies for $@ are $^ $(LOG)
endif
# header for each rule
define HEADER
@
$(PRINT_DEPENDENCIES)
$(FLUSH_LOG)
$(eval $@_TSTMP_ST := $(shell date +%s))
$(START_TIME)
./update_screen.sh -a $@ $*
endef
# footer for each rule
define FOOTER
$(eval $@_TSTMP_END := `date +%s`)
$(END_TIME)
$(ELAPSED_TIME)
./update_screen.sh -d $@ $($*_CACHE_LOADED)
endef
###############################################################################
## Definition of derived target
###############################################################################
# call:
# add_derived_package some_deb.deb, some_derived_deb
define add_derived_package
$(2)_DEPENDS += $(1)
$(2)_RDEPENDS += $($(1)_RDEPENDS)
$(2)_MAIN_DEB = $(1)
$(1)_DERIVED_DEBS += $(2)
$(2)_URL = $($(1)_URL)
$(2)_SRC_PATH = $($(1)_SRC_PATH)
$(2)_NAME = $($(1)_NAME)
$(2)_VERSION = $($(1)_VERSION)
SONIC_DERIVED_DEBS += $(2)
endef
# call:
# add_extra_package some_deb.deb, some_extra_deb
define add_extra_package
$(2)_MAIN_DEB = $(1)
$(1)_EXTRA_DEBS += $(2)
SONIC_EXTRA_DEBS += $(2)
endef
###############################################################################
## Definition of conflict packages
###############################################################################
# call:
# add_conflict_package some_deb.deb, conflict_deb
define add_conflict_package
$(1)_CONFLICT_DEBS += $(2)
$(2)_CONFLICT_DEBS += $(1)
endef
###############################################################################
## Definition of debug dockers
###############################################################################
# call:
# add_dbg_docker some_docker.gz, some-docker-dbg.gz
define add_dbg_docker
$(2)_PATH = $($(1)_PATH)
$(2)_DBG_DEPENDS += $($(1)_DBG_DEPENDS)
$(2)_DBG_IMAGE_PACKAGES += $($(1)_DBG_IMAGE_PACKAGES)
$(2)_PYTHON_DEBS += $($(1)_PYTHON_DEBS)
$(2)_PYTHON_WHEELS += $($(1)_PYTHON_WHEELS)
$(2)_LOAD_DOCKERS += $($(1)_LOAD_DOCKERS)
$(2)_CACHE_MODE += $($(1)_CACHE_MODE)
$(2)_DEP_FLAGS += $($(1)_DEP_FLAGS)
$(2)_DEP_FILES += $($(1)_DEP_FILES)
$(2)_SMDEP_FILES += $($(1)_SMDEP_FILES)
$(2)_SMDEP_PATHS += $($(1)_SMDEP_PATHS)
$(2)_DEPENDS += $($(1)_DEPENDS)
$(2)_RDEPENDS += $($(1)_RDEPENDS)
$(2)_MAIN_DOCKER = $(1)
$(1)_DBG_DOCKER += $(2)
SONIC_DBG_DOCKERS += $(2)
endef
###############################################################################
## Utility functions
###############################################################################
# Recursive wildcard function
rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d))
expand = $(foreach d,$(1),$(call expand,$($(d)_$(2)),$(2))) $(1)
###############################################################################
## Uninstall debs
###############################################################################
define UNINSTALL_DEBS
if [ -n "$(1)" ]; then \
while true; do \
if mkdir $(DEBS_PATH)/dpkg_lock &> /dev/null; then \
{ sudo DEBIAN_FRONTEND=noninteractive dpkg -P $(foreach deb,$(1),$(firstword $(subst _, ,$(basename $(deb))))) $(LOG) && rm -d $(DEBS_PATH)/dpkg_lock && break; } || { rm -d $(DEBS_PATH)/dpkg_lock && exit 1 ; } \
fi; \
done; \
fi
endef
###############################################################################
## Setup overlay fs for dpkg admin directory /var/lib/dpkg
###############################################################################
define SETUP_OVERLAYFS_FOR_DPKG_ADMINDIR
upperdir=$(shell mktemp -d -p $(DPKG_ADMINDIR_PATH))
workdir=$(shell mktemp -d -p $(DPKG_ADMINDIR_PATH))
mergedir=$(shell mktemp -d -p $(DPKG_ADMINDIR_PATH))
sudo mount -t overlay overlay -olowerdir=/var/lib/dpkg,upperdir=$$upperdir,workdir=$$workdir $$mergedir
export SONIC_DPKG_ADMINDIR=$$mergedir
trap "sudo umount $$mergedir && rm -rf $$mergedir $$upperdir $$workdir" EXIT
endef
###############################################################################
## Manifest generation routine
## TODO: changelog generation
###############################################################################
# call:
# generate_manifest some_docker.gz, version_suffix
define generate_manifest
$(eval export version=$($(1).gz_VERSION))
$(eval export version_suffix=$(2))
$(eval export name=$($(1).gz_CONTAINER_NAME))
$(eval export package_name=$($(1).gz_PACKAGE_NAME))
$(eval export asic_service=$(shell [ -f files/build_templates/per_namespace/$(name).service.j2 ] && echo true || echo false))
$(eval export host_service=$(shell [ -f files/build_templates/$(name).service.j2 ] && echo true || echo false))
$(eval export depends=$($(1).gz_PACKAGE_DEPENDS))
$(eval export requires=$($(1).gz_SERVICE_REQUIRES))
$(eval export after=$($(1).gz_SERVICE_AFTER))
$(eval export before=$($(1).gz_SERVICE_BEFORE))
$(eval export dependent_of=$($(1).gz_SERVICE_DEPENDENT_OF))
$(eval export warm_shutdown_after=$($*.gz_WARM_SHUTDOWN_AFTER))
$(eval export warm_shutdown_before=$($*.gz_WARM_SHUTDOWN_BEFORE))
$(eval export fast_shutdown_after=$($*.gz_FAST_SHUTDOWN_AFTER))
$(eval export fast_shutdown_before=$($*.gz_FAST_SHUTDOWN_BEFORE))
$(eval export privileged=$($(1).gz_CONTAINER_PRIVILEGED))
$(eval export volumes=$($(1).gz_CONTAINER_VOLUMES))
$(eval export tmpfs=$($(1).gz_CONTAINER_TMPFS))
$(eval export config_cli_plugin=$($(1).gz_CLI_CONFIG_PLUGIN))
$(eval export show_cli_plugin=$($(1).gz_CLI_SHOW_PLUGIN))
$(eval export clear_cli_plugin=$($(1).gz_CLI_CLEAR_PLUGIN))
$(eval export support_rate_limit=$($(1).gz_SUPPORT_RATE_LIMIT))
j2 --customize scripts/j2cli/json_filter.py files/build_templates/manifest.json.j2 > $($(1).gz_PATH)/manifest.common.json
if [ -f $($*.gz_PATH)/manifest.part.json.j2 ]; then
j2 --customize scripts/j2cli/json_filter.py $($(1).gz_PATH)/manifest.part.json.j2 > $($(1).gz_PATH)/manifest.part.json
jq -s '.[0] * .[1]' $($(1).gz_PATH)/manifest.common.json $($(1).gz_PATH)/manifest.part.json > $($(1).gz_PATH)/manifest.json
else
mv $($(1).gz_PATH)/manifest.common.json $($(1).gz_PATH)/manifest.json
fi
endef