Browse code

- Common Builder

- Introduced build.py in order to replace Makefile.
- The script is divided into 6 classes Utilities, BuildImage, RpmBuildTarget, CleanUp, Build_Config and BuildEnvironmentSetup.
- function defs from builder.py, imagebuilder.py and imagegenerator.py is used directly by build.py.
- A new config file called config.json which contains branch specific data and command-line arguments.

- Usage:
- In order to build following command needs to be used.
- Copy config.json to that cloned repo.
- If already cloned photon
Command : make [target-name] CONF=[config.json path](if config.json in current directory then no need to give config path)
Ex- make packages CONF=/root/dev/photon/config.json

- Done:
- Built iso,ova,azure,gce,ami for master and dev branches.
- Built all as well as specified packages.

- To-Do:
- Testing each target
- Testing all the images

Change-Id: Ifb93b03def33cc0e89fbc50a788805db3c8da95f
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/8429
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Anish Swaminathan <anishs@vmware.com>

Piyush Gupta authored on 2020/08/04 16:52:46
Showing 7 changed files
... ...
@@ -1,754 +1,6 @@
1
-#
2
-# Copyright VMware, Inc 2015
3
-#
4
-
5
-SRCROOT := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
6
-MAKEROOT=$(SRCROOT)/support/make
7
-
8
-# do not build these targets as '%'
9
-$(MAKEROOT)/makedefs.mk: ;
10
-Makefile: ;
11
-
12
-include $(MAKEROOT)/makedefs.mk
13
-
14
-export PATH := $(SRCROOT)/tools/bin:$(PATH)
15
-export PHOTON_BUILD_NUM=$(PHOTON_BUILD_NUMBER)
16
-export PHOTON_RELEASE_VER=$(PHOTON_RELEASE_VERSION)
17
-
18
-ifdef PHOTON_CACHE_PATH
19
-PHOTON_PACKAGES_MINIMAL := packages-cached
20
-PHOTON_PACKAGES := packages-cached
21
-else
22
-PHOTON_PACKAGES_MINIMAL := packages-minimal
23
-PHOTON_PACKAGES := packages
24
-endif
25
-
26
-ifdef PHOTON_SOURCES_PATH
27
-PHOTON_SOURCES := sources-cached
28
-else
29
-PHOTON_SOURCES ?= sources
30
-endif
31
-
32
-FULL_PACKAGE_LIST_FILE := build_install_options_all.json
33
-MINIMAL_PACKAGE_LIST_FILE := build_install_options_minimal.json
34
-RT_PACKAGE_LIST_FILE := build_install_options_rt.json
35
-
36
-ifdef PHOTON_PUBLISH_RPMS_PATH
37
-PHOTON_PUBLISH_RPMS := publish-rpms-cached
38
-else
39
-PHOTON_PUBLISH_RPMS := publish-rpms
40
-endif
41
-
42
-ifdef PHOTON_PUBLISH_XRPMS_PATH
43
-PHOTON_PUBLISH_XRPMS := publish-x-rpms-cached
44
-else
45
-PHOTON_PUBLISH_XRPMS := publish-x-rpms
46
-endif
47
-
48
-# Tri state RPMCHECK:
49
-# 1) RPMCHECK is not specified:  just build
50
-# 2) RPMCHECK=enable: build and run %check section. do not stop on error. will generate report file.
51
-# 3) RPMCHECK=enable_stop_on_error: build and run %check section. stop on first error.
52
-#
53
-# We use 2 parameters:
54
-# -u: enable checking.
55
-# -q: quit on error. if -q is not specified it will keep going
56
-
57
-ifeq ($(RPMCHECK),enable)
58
-PHOTON_RPMCHECK_FLAGS := --enable-rpmcheck
59
-else ifeq ($(RPMCHECK),enable_stop_on_error)
60
-PHOTON_RPMCHECK_FLAGS := --enable-rpmcheck --rpmcheck-stop-on-error
61
-else
62
-PHOTON_RPMCHECK_FLAGS :=
63
-endif
64
-
65
-ifeq ($(SCHEDULER_SERVER),enable)
66
-START_SCHEDULER_SERVER := --start-scheduler-server True
67
-else
68
-START_SCHEDULER_SERVER :=
69
-endif
70
-
71
-# KAT build for FIPS certification
72
-# Use KAT_BUILD=enable to build a kat kernel. By default, KAT_BUILD is disabled.
73
-ifeq ($(KAT_BUILD),enable)
74
-PHOTON_KAT_BUILD_FLAGS := --enable-katbuild
75
-endif
76
-
77
-ifeq ($(BUILDDEPS),true)
78
-PUBLISH_BUILD_DEPENDENCIES := --publish-build-dependencies True
79
-else
80
-PUBLISH_BUILD_DEPENDENCIES :=
81
-endif
82
-
83
-PACKAGE_WEIGHTS = --package-weights-path $(SRCROOT)/common/data/packageWeights.json
84
-
85
-ifdef PKG_BUILD_OPTIONS
86
-PACKAGE_BUILD_OPTIONS = --pkg-build-option-file $(PKG_BUILD_OPTIONS)
87
-else
88
-PACKAGE_BUILD_OPTIONS =
1
+ifndef CONF
2
+	CONF := config.json
89 3
 endif
90 4
 
91
-ifdef DISTRIBUTED_BUILD_CONFIG
92
-DISTRIBUTED_BUILD_OPTIONS = --distributed-build-option-file $(DISTRIBUTED_BUILD_CONFIG)
93
-else
94
-DISTRIBUTED_BUILD_OPTIONS =
95
-endif
96
-
97
-ifdef CROSS_TARGET
98
-CROSS_TARGET_FLAGS = --cross-target $(CROSS_TARGET)
99
-else
100
-CROSS_TARGET_FLAGS =
101
-endif
102
-
103
-TOOLS_BIN := $(SRCROOT)/tools/bin
104
-CONTAIN := $(TOOLS_BIN)/contain
105
-ifeq ($(ARCH),x86_64)
106
-VIXDISKUTIL := $(TOOLS_BIN)/vixdiskutil
107
-else
108
-VIXDISKUTIL :=
109
-endif
110
-
111
-#marker file indicating if run from container
112
-DOCKER_ENV=/.dockerenv
113
-
114
-$(TOOLS_BIN):
115
-	mkdir -p $(TOOLS_BIN)
116
-
117
-$(CONTAIN): $(TOOLS_BIN)
118
-	gcc -O2 -std=gnu99 -Wall -Wextra $(SRCROOT)/tools/src/contain/*.c -o $@_unpriv
119
-	sudo install -o root -g root -m 4755 $@_unpriv $@
120
-
121
-$(VIXDISKUTIL): $(TOOLS_BIN)
122
-	@cd $(SRCROOT)/tools/src/vixDiskUtil && \
123
-	make
124
-
125
-.PHONY : all iso clean image all-images \
126
-check-tools check-docker check-bison check-g++ check-gawk check-repo-tool check-kpartx check-sanity \
127
-clean-install clean-chroot build-updated-packages check generate-yaml-files
128
-
129
-THREADS?=1
130
-LOGLEVEL?=info
131
-
132
-# Build targets for rpm build
133
-#-------------------------------------------------------------------------------
134
-packages-minimal: check-tools photon-stage $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) generate-dep-lists
135
-	@echo "Building all minimal RPMS..."
136
-	@echo ""
137
-	@cd $(PHOTON_PKG_BUILDER_DIR) && \
138
-	$(PHOTON_PACKAGE_BUILDER) \
139
-		--spec-path $(PHOTON_SPECS_DIR) \
140
-		--rpm-path $(PHOTON_RPMS_DIR) \
141
-		--source-path $(PHOTON_SRCS_DIR) \
142
-		--build-root-path $(PHOTON_CHROOT_PATH) \
143
-		--packages-json-input $(PHOTON_DATA_DIR)/packages_minimal.json \
144
-		--log-path $(PHOTON_LOGS_DIR) \
145
-		--log-level $(LOGLEVEL) \
146
-		--publish-RPMS-path $(PHOTON_PUBLISH_RPMS_DIR) \
147
-		--pullsources-config $(PHOTON_PULLSOURCES_CONFIG) \
148
-		--dist-tag $(PHOTON_DIST_TAG) \
149
-		--build-number $(PHOTON_BUILD_NUMBER) \
150
-		--release-version $(PHOTON_RELEASE_VERSION) \
151
-		--pkginfo-file $(PHOTON_PKGINFO_FILE) \
152
-		$(PHOTON_RPMCHECK_FLAGS) \
153
-		$(START_SCHEDULER_SERVER) \
154
-		$(PUBLISH_BUILD_DEPENDENCIES) \
155
-		$(PACKAGE_WEIGHTS) \
156
-		--threads ${THREADS}
157
-
158
-packages-rt: check-tools photon-stage $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) generate-dep-lists
159
-	@echo "Building minimal RPMS for Real Time..."
160
-	@echo ""
161
-	@cd $(PHOTON_PKG_BUILDER_DIR) && \
162
-	$(PHOTON_PACKAGE_BUILDER) \
163
-		--spec-path $(PHOTON_SPECS_DIR) \
164
-		--rpm-path $(PHOTON_RPMS_DIR) \
165
-		--source-path $(PHOTON_SRCS_DIR) \
166
-		--build-root-path $(PHOTON_CHROOT_PATH) \
167
-		--packages-json-input $(PHOTON_DATA_DIR)/packages_rt.json \
168
-		--log-path $(PHOTON_LOGS_DIR) \
169
-		--log-level $(LOGLEVEL) \
170
-		--publish-RPMS-path $(PHOTON_PUBLISH_RPMS_DIR) \
171
-		--pullsources-config $(PHOTON_PULLSOURCES_CONFIG) \
172
-		--dist-tag $(PHOTON_DIST_TAG) \
173
-		--build-number $(PHOTON_BUILD_NUMBER) \
174
-		--release-version $(PHOTON_RELEASE_VERSION) \
175
-		--pkginfo-file $(PHOTON_PKGINFO_FILE) \
176
-		$(PHOTON_RPMCHECK_FLAGS) \
177
-		$(PUBLISH_BUILD_DEPENDENCIES) \
178
-		$(PACKAGE_WEIGHTS) \
179
-		--threads ${THREADS}
180
-
181
-packages-initrd: check-tools photon-stage $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) generate-dep-lists
182
-	@echo "Building all initrd package RPMS..."
183
-	@echo ""
184
-	@cd $(PHOTON_PKG_BUILDER_DIR) && \
185
-	$(PHOTON_PACKAGE_BUILDER) \
186
-		--spec-path $(PHOTON_SPECS_DIR) \
187
-		--rpm-path $(PHOTON_RPMS_DIR) \
188
-		--source-path $(PHOTON_SRCS_DIR) \
189
-		--build-root-path $(PHOTON_CHROOT_PATH) \
190
-		--packages-json-input $(PHOTON_DATA_DIR)/packages_installer_initrd.json \
191
-		--log-path $(PHOTON_LOGS_DIR) \
192
-		--log-level $(LOGLEVEL) \
193
-		--publish-RPMS-path $(PHOTON_PUBLISH_RPMS_DIR) \
194
-		--pullsources-config $(PHOTON_PULLSOURCES_CONFIG) \
195
-		--dist-tag $(PHOTON_DIST_TAG) \
196
-		--build-number $(PHOTON_BUILD_NUMBER) \
197
-		--release-version $(PHOTON_RELEASE_VERSION) \
198
-		--pkginfo-file $(PHOTON_PKGINFO_FILE) \
199
-		$(PHOTON_RPMCHECK_FLAGS) \
200
-		$(START_SCHEDULER_SERVER) \
201
-		$(PUBLISH_BUILD_DEPENDENCIES) \
202
-		$(PACKAGE_WEIGHTS) \
203
-		--threads ${THREADS}
204
-
205
-packages: check-docker-py check-tools photon-stage $(PHOTON_PUBLISH_XRPMS) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) check-spec-files generate-dep-lists
206
-	@echo "Building all RPMS..."
207
-	@echo ""
208
-	@cd $(PHOTON_PKG_BUILDER_DIR) && \
209
-	$(PHOTON_PACKAGE_BUILDER) \
210
-		--build-type $(PHOTON_BUILD_TYPE) \
211
-		--spec-path $(PHOTON_SPECS_DIR) \
212
-		--rpm-path $(PHOTON_RPMS_DIR) \
213
-		--source-rpm-path $(PHOTON_SRPMS_DIR) \
214
-		--source-path $(PHOTON_SRCS_DIR) \
215
-		--build-root-path $(PHOTON_CHROOT_PATH) \
216
-		--log-path $(PHOTON_LOGS_DIR) \
217
-		--log-level $(LOGLEVEL) \
218
-		--publish-RPMS-path $(PHOTON_PUBLISH_RPMS_DIR) \
219
-		--publish-XRPMS-path $(PHOTON_PUBLISH_XRPMS_DIR) \
220
-		--pullsources-config $(PHOTON_PULLSOURCES_CONFIG) \
221
-		--dist-tag $(PHOTON_DIST_TAG) \
222
-		--build-number $(PHOTON_BUILD_NUMBER) \
223
-		--release-version $(PHOTON_RELEASE_VERSION) \
224
-		--pkginfo-file $(PHOTON_PKGINFO_FILE) \
225
-		$(PACKAGE_BUILD_OPTIONS) \
226
-		$(PHOTON_RPMCHECK_FLAGS) \
227
-		$(START_SCHEDULER_SERVER) \
228
-		$(PHOTON_KAT_BUILD_FLAGS) \
229
-		$(CROSS_TARGET_FLAGS) \
230
-		$(PUBLISH_BUILD_DEPENDENCIES) \
231
-		$(PACKAGE_WEIGHTS) \
232
-		--threads ${THREADS}
233
-	$(PHOTON_REPO_TOOL) $(PHOTON_RPMS_DIR)
234
-
235
-packages-docker: check-docker-py check-docker-service check-tools photon-stage $(PHOTON_PUBLISH_XRPMS) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) generate-dep-lists
236
-	@echo "Building all RPMS..."
237
-	@echo ""
238
-	@cd $(PHOTON_PKG_BUILDER_DIR) && \
239
-	$(PHOTON_PACKAGE_BUILDER) \
240
-		--build-type $(PHOTON_BUILD_TYPE) \
241
-		--spec-path $(PHOTON_SPECS_DIR) \
242
-		--rpm-path $(PHOTON_RPMS_DIR) \
243
-		--source-rpm-path $(PHOTON_SRPMS_DIR) \
244
-		--source-path $(PHOTON_SRCS_DIR) \
245
-		--build-root-path $(PHOTON_CHROOT_PATH) \
246
-		--log-path $(PHOTON_LOGS_DIR) \
247
-		--log-level $(LOGLEVEL) \
248
-		--publish-RPMS-path $(PHOTON_PUBLISH_RPMS_DIR) \
249
-		--publish-XRPMS-path $(PHOTON_PUBLISH_XRPMS_DIR) \
250
-		--pullsources-config $(PHOTON_PULLSOURCES_CONFIG) \
251
-		--dist-tag $(PHOTON_DIST_TAG) \
252
-		--build-number $(PHOTON_BUILD_NUMBER) \
253
-		--release-version $(PHOTON_RELEASE_VERSION) \
254
-		--pkginfo-file $(PHOTON_PKGINFO_FILE) \
255
-		$(PACKAGE_BUILD_OPTIONS) \
256
-		$(PHOTON_RPMCHECK_FLAGS) \
257
-		$(START_SCHEDULER_SERVER) \
258
-		$(CROSS_TARGET_FLAGS) \
259
-		$(PUBLISH_BUILD_DEPENDENCIES) \
260
-		$(PACKAGE_WEIGHTS) \
261
-		--threads ${THREADS}
262
-
263
-updated-packages: check-tools photon-stage $(PHOTON_PUBLISH_XRPMS) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) generate-dep-lists
264
-	@echo "Building only updated RPMS..."
265
-	@echo ""
266
-	@cd $(PHOTON_PKG_BUILDER_DIR) && \
267
-	$(PHOTON_PACKAGE_BUILDER) \
268
-		--spec-path $(PHOTON_SPECS_DIR) \
269
-		--rpm-path $(PHOTON_UPDATED_RPMS_DIR) \
270
-		--source-path $(PHOTON_SRCS_DIR) \
271
-		--build-root-path $(PHOTON_CHROOT_PATH) \
272
-		--log-path $(PHOTON_LOGS_DIR) \
273
-		--log-level $(LOGLEVEL) \
274
-		--publish-RPMS-path $(PHOTON_PUBLISH_RPMS_DIR) \
275
-		--publish-XRPMS-path $(PHOTON_PUBLISH_XRPMS_DIR) \
276
-		--pullsources-config $(PHOTON_PULLSOURCES_CONFIG) \
277
-		--dist-tag $(PHOTON_DIST_TAG) \
278
-		--build-number $(PHOTON_BUILD_NUMBER) \
279
-		--release-version $(PHOTON_RELEASE_VERSION) \
280
-		--input-RPMS-path $(PHOTON_INPUT_RPMS_DIR) \
281
-		$(PHOTON_KAT_BUILD_FLAGS) \
282
-		$(PHOTON_RPMCHECK_FLAGS) \
283
-		$(START_SCHEDULER_SERVER) \
284
-		$(PUBLISH_BUILD_DEPENDENCIES) \
285
-		$(PACKAGE_WEIGHTS) \
286
-		--threads ${THREADS}
287
-
288
-tool-chain-stage1: check-tools photon-stage $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) generate-dep-lists
289
-	@echo "Building all RPMS..."
290
-	@echo ""
291
-	@cd $(PHOTON_PKG_BUILDER_DIR) && \
292
-	$(PHOTON_PACKAGE_BUILDER) \
293
-		--spec-path $(PHOTON_SPECS_DIR) \
294
-		--rpm-path $(PHOTON_RPMS_DIR) \
295
-		--source-rpm-path $(PHOTON_SRPMS_DIR) \
296
-		--source-path $(PHOTON_SRCS_DIR) \
297
-		--build-root-path $(PHOTON_CHROOT_PATH) \
298
-		--log-path $(PHOTON_LOGS_DIR) \
299
-		--log-level $(LOGLEVEL) \
300
-		--publish-RPMS-path $(PHOTON_PUBLISH_RPMS_DIR) \
301
-		--threads ${THREADS} \
302
-		--pullsources-config $(PHOTON_PULLSOURCES_CONFIG) \
303
-		--dist-tag $(PHOTON_DIST_TAG) \
304
-		--build-number $(PHOTON_BUILD_NUMBER) \
305
-		--release-version $(PHOTON_RELEASE_VERSION) \
306
-		$(PHOTON_RPMCHECK_FLAGS) \
307
-		$(START_SCHEDULER_SERVER) \
308
-		--tool-chain-stage stage1
309
-
310
-tool-chain-stage2: check-tools photon-stage $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) generate-dep-lists
311
-	@echo "Building all RPMS..."
312
-	@echo ""
313
-	@cd $(PHOTON_PKG_BUILDER_DIR) && \
314
-	$(PHOTON_PACKAGE_BUILDER) \
315
-		--spec-path $(PHOTON_SPECS_DIR) \
316
-		--rpm-path $(PHOTON_RPMS_DIR) \
317
-		--source-rpm-path $(PHOTON_SRPMS_DIR) \
318
-		--source-path $(PHOTON_SRCS_DIR) \
319
-		--build-root-path $(PHOTON_CHROOT_PATH) \
320
-		--log-path $(PHOTON_LOGS_DIR) \
321
-		--log-level $(LOGLEVEL) \
322
-		--publish-RPMS-path $(PHOTON_PUBLISH_RPMS_DIR) \
323
-		--threads ${THREADS} \
324
-		--pullsources-config $(PHOTON_PULLSOURCES_CONFIG) \
325
-		--dist-tag $(PHOTON_DIST_TAG) \
326
-		--build-number $(PHOTON_BUILD_NUMBER) \
327
-		--release-version $(PHOTON_RELEASE_VERSION) \
328
-		$(PHOTON_RPMCHECK_FLAGS) \
329
-		$(START_SCHEDULER_SERVER) \
330
-		--tool-chain-stage stage2
331
-
332
-%: check-tools $(PHOTON_PUBLISH_RPMS) $(PHOTON_PUBLISH_XRPMS) $(PHOTON_SOURCES) $(CONTAIN) check-spec-files $(eval PKG_NAME = $@)
333
-	$(eval PKG_NAME = $@)
334
-	@cd $(PHOTON_PKG_BUILDER_DIR) && \
335
-	$(PHOTON_PACKAGE_BUILDER) --install-package $(PKG_NAME)\
336
-		--build-type $(PHOTON_BUILD_TYPE) \
337
-		--build-root-path $(PHOTON_CHROOT_PATH) \
338
-		--spec-path $(PHOTON_SPECS_DIR) \
339
-		--rpm-path $(PHOTON_RPMS_DIR) \
340
-		--source-rpm-path $(PHOTON_SRPMS_DIR) \
341
-		--source-path $(PHOTON_SRCS_DIR) \
342
-		--publish-RPMS-path $(PHOTON_PUBLISH_RPMS_DIR) \
343
-		--publish-XRPMS-path $(PHOTON_PUBLISH_XRPMS_DIR) \
344
-		--pullsources-config $(PHOTON_PULLSOURCES_CONFIG) \
345
-		--log-level $(LOGLEVEL) \
346
-		--dist-tag $(PHOTON_DIST_TAG) \
347
-		--build-number $(PHOTON_BUILD_NUMBER) \
348
-		--release-version $(PHOTON_RELEASE_VERSION) \
349
-		$(PACKAGE_BUILD_OPTIONS) \
350
-		$(PHOTON_RPMCHECK_FLAGS) \
351
-		$(START_SCHEDULER_SERVER) \
352
-		$(PHOTON_KAT_BUILD_FLAGS) \
353
-		$(CROSS_TARGET_FLAGS) \
354
-		--log-path $(PHOTON_LOGS_DIR) \
355
-		--threads ${THREADS}
356
-
357
-check: packages
358
-	ifeq ($(RPMCHECK),enable_stop_on_error)
359
-		$(eval rpmcheck_stop_on_error = -q)
360
-	endif
361
-	@echo "Testing all RPMS ..."
362
-	@cd $(PHOTON_PKG_BUILDER_DIR) && \
363
-	$(PHOTON_PACKAGE_BUILDER) \
364
-		--build-type $(PHOTON_BUILD_TYPE) \
365
-		--spec-path $(PHOTON_SPECS_DIR) \
366
-		--rpm-path $(PHOTON_RPMS_DIR) \
367
-		--source-rpm-path $(PHOTON_SRPMS_DIR) \
368
-		--source-path $(PHOTON_SRCS_DIR) \
369
-		--build-root-path $(PHOTON_CHROOT_PATH) \
370
-		--log-path $(PHOTON_LOGS_DIR) \
371
-		--log-level $(LOGLEVEL) \
372
-		--publish-RPMS-path $(PHOTON_PUBLISH_RPMS_DIR) \
373
-		--publish-XRPMS-path $(PHOTON_PUBLISH_XRPMS_DIR) \
374
-		--pullsources-config $(PHOTON_PULLSOURCES_CONFIG) \
375
-		--dist-tag $(PHOTON_DIST_TAG) \
376
-		--build-number $(PHOTON_BUILD_NUMBER) \
377
-		--release-version $(PHOTON_RELEASE_VERSION) \
378
-		--pkginfo-file $(PHOTON_PKGINFO_FILE) \
379
-		$(PACKAGE_BUILD_OPTIONS) \
380
-		--enable-rpmcheck \
381
-		$(rpmcheck_stop_on_error) \
382
-		--threads ${THREADS}
383
-
384
-distributed-build:
385
-	@echo "Building RPMS through kubernetes ..."
386
-	@echo ""
387
-	@cd $(PHOTON_PKG_BUILDER_DIR) && \
388
-	$(PHOTON_DISTRIBUTED_BUILDER) \
389
-		--log-path $(PHOTON_LOGS_DIR) \
390
-		--log-level $(LOGLEVEL) \
391
-		$(DISTRIBUTED_BUILD_OPTIONS)
392
-
393
-#-------------------------------------------------------------------------------
394
-
395
-# The targets listed under "all" are the installer built artifacts
396
-#===============================================================================
397
-all: iso photon-docker-image all-images src-iso minimal-iso
398
-
399
-iso: check-tools photon-stage $(PHOTON_PACKAGES) ostree-repo
400
-	@echo "Building Photon Full ISO..."
401
-	@cd $(PHOTON_IMAGE_BUILDER_DIR) && \
402
-	sudo $(PHOTON_IMAGE_BUILDER) \
403
-		--iso-path $(PHOTON_STAGE)/photon-$(PHOTON_RELEASE_VERSION)-$(PHOTON_BUILD_NUMBER).iso \
404
-		--debug-iso-path $(PHOTON_STAGE)/photon-$(PHOTON_RELEASE_VERSION)-$(PHOTON_BUILD_NUMBER).debug.iso \
405
-		--log-path $(PHOTON_STAGE)/LOGS \
406
-		--log-level $(LOGLEVEL) \
407
-		--rpm-path $(PHOTON_STAGE)/RPMS \
408
-		--srpm-path $(PHOTON_STAGE)/SRPMS \
409
-		--package-list-file $(PHOTON_DATA_DIR)/$(FULL_PACKAGE_LIST_FILE) \
410
-		--generated-data-path $(PHOTON_STAGE)/common/data \
411
-		--pkg-to-rpm-map-file $(PHOTON_PKGINFO_FILE)
412
-
413
-minimal-iso: check-tools photon-stage $(PHOTON_PUBLISH_XRPMS) packages-minimal packages-initrd
414
-	@echo "Building Photon Minimal ISO..."
415
-	@$(PHOTON_REPO_TOOL) $(PHOTON_RPMS_DIR)
416
-	@$(CP) -f $(PHOTON_DATA_DIR)/$(MINIMAL_PACKAGE_LIST_FILE) $(PHOTON_GENERATED_DATA_DIR)/
417
-	@cd $(PHOTON_IMAGE_BUILDER_DIR) && \
418
-	sudo $(PHOTON_IMAGE_BUILDER) \
419
-                --iso-path $(PHOTON_STAGE)/photon-minimal-$(PHOTON_RELEASE_VERSION)-$(PHOTON_BUILD_NUM).iso \
420
-                --debug-iso-path $(PHOTON_STAGE)/photon-minimal-$(PHOTON_RELEASE_VERSION)-$(PHOTON_BUILD_NUMBER).debug.iso \
421
-                --log-path $(PHOTON_STAGE)/LOGS \
422
-                --log-level $(LOGLEVEL) \
423
-                --rpm-path $(PHOTON_STAGE)/RPMS \
424
-                --srpm-path $(PHOTON_STAGE)/SRPMS \
425
-                --package-list-file $(PHOTON_DATA_DIR)/$(MINIMAL_PACKAGE_LIST_FILE) \
426
-                --generated-data-path $(PHOTON_STAGE)/common/data \
427
-                --pkg-to-rpm-map-file $(PHOTON_PKGINFO_FILE) \
428
-                --pkg-to-be-copied-conf-file $(PHOTON_GENERATED_DATA_DIR)/$(MINIMAL_PACKAGE_LIST_FILE)
429
-
430
-rt-iso: check-tools photon-stage $(PHOTON_PUBLISH_XRPMS) packages-rt packages-initrd
431
-	@echo "Building Photon Real Time ISO..."
432
-	@$(PHOTON_REPO_TOOL) $(PHOTON_RPMS_DIR)
433
-	@$(CP) -f $(PHOTON_DATA_DIR)/$(RT_PACKAGE_LIST_FILE) $(PHOTON_GENERATED_DATA_DIR)/
434
-	@cd $(PHOTON_IMAGE_BUILDER_DIR) && \
435
-	sudo $(PHOTON_IMAGE_BUILDER) \
436
-                --iso-path $(PHOTON_STAGE)/photon-rt-$(PHOTON_RELEASE_VERSION)-$(PHOTON_BUILD_NUM).iso \
437
-                --debug-iso-path $(PHOTON_STAGE)/photon-rt-$(PHOTON_RELEASE_VERSION)-$(PHOTON_BUILD_NUMBER).debug.iso \
438
-                --log-path $(PHOTON_STAGE)/LOGS \
439
-                --log-level $(LOGLEVEL) \
440
-                --rpm-path $(PHOTON_STAGE)/RPMS \
441
-                --srpm-path $(PHOTON_STAGE)/SRPMS \
442
-                --package-list-file $(PHOTON_DATA_DIR)/$(RT_PACKAGE_LIST_FILE) \
443
-                --generated-data-path $(PHOTON_STAGE)/common/data \
444
-                --pkg-to-rpm-map-file $(PHOTON_PKGINFO_FILE) \
445
-                --pkg-to-be-copied-conf-file $(PHOTON_GENERATED_DATA_DIR)/$(RT_PACKAGE_LIST_FILE)
446
-
447
-src-iso: check-tools photon-stage $(PHOTON_PACKAGES)
448
-	@echo "Building Photon Full Source ISO..."
449
-	@cd $(PHOTON_IMAGE_BUILDER_DIR) && \
450
-	sudo $(PHOTON_IMAGE_BUILDER) \
451
-		--src-iso-path $(PHOTON_STAGE)/photon-$(PHOTON_RELEASE_VERSION)-$(PHOTON_BUILD_NUMBER).src.iso \
452
-		--log-path $(PHOTON_STAGE)/LOGS \
453
-		--log-level $(LOGLEVEL) \
454
-		--rpm-path $(PHOTON_STAGE)/RPMS \
455
-		--srpm-path $(PHOTON_STAGE)/SRPMS \
456
-		--package-list-file $(PHOTON_GENERATED_DATA_DIR)/$(FULL_PACKAGE_LIST_FILE) \
457
-		--generated-data-path $(PHOTON_STAGE)/common/data \
458
-		--pkg-to-rpm-map-file $(PHOTON_PKGINFO_FILE) > \
459
-		$(PHOTON_LOGS_DIR)/sourceiso-installer.log 2>&1
460
-
461
-image: check-kpartx photon-stage $(VIXDISKUTIL) $(PHOTON_PACKAGES) ostree-repo
462
-	@echo "Building image using $(CONFIG)..."
463
-	@cd $(PHOTON_IMAGE_BUILDER_DIR)
464
-	$(PHOTON_IMAGE_BUILDER) \
465
-		--config-file=$(CONFIG) \
466
-		--img-name=$(IMG_NAME) \
467
-		--src-root=$(SRCROOT) \
468
-		--generated-data-path=$(PHOTON_DATA_DIR) \
469
-		--stage-path=$(PHOTON_STAGE) \
470
-		--rpm-path $(PHOTON_STAGE)/RPMS
471
-
472
-all-images: check-kpartx photon-stage $(VIXDISKUTIL) $(PHOTON_PACKAGES) ostree-repo
473
-	@echo "Building all images - gce, ami, azure, ova..."
474
-	@cd $(PHOTON_IMAGE_BUILDER_DIR)
475
-	$(PHOTON_IMAGE_BUILDER) \
476
-		--src-root=$(SRCROOT) \
477
-		--generated-data-path=$(PHOTON_DATA_DIR) \
478
-		--stage-path=$(PHOTON_STAGE) \
479
-		--rpm-path $(PHOTON_STAGE)/RPMS \
480
-		--img-name=ami
481
-	$(PHOTON_IMAGE_BUILDER) \
482
-		--src-root=$(SRCROOT) \
483
-		--generated-data-path=$(PHOTON_DATA_DIR) \
484
-		--stage-path=$(PHOTON_STAGE) \
485
-		--rpm-path $(PHOTON_STAGE)/RPMS \
486
-		--img-name=gce
487
-	$(PHOTON_IMAGE_BUILDER) \
488
-		--src-root=$(SRCROOT) \
489
-		--generated-data-path=$(PHOTON_DATA_DIR) \
490
-		--stage-path=$(PHOTON_STAGE) \
491
-		--rpm-path $(PHOTON_STAGE)/RPMS \
492
-		--img-name=azure
493
-	$(PHOTON_IMAGE_BUILDER) \
494
-		--src-root=$(SRCROOT) \
495
-		--generated-data-path=$(PHOTON_DATA_DIR) \
496
-		--stage-path=$(PHOTON_STAGE) \
497
-		--rpm-path $(PHOTON_STAGE)/RPMS \
498
-		--img-name=ova
499
-	$(PHOTON_IMAGE_BUILDER) \
500
-		--src-root=$(SRCROOT) \
501
-		--generated-data-path=$(PHOTON_DATA_DIR) \
502
-		--stage-path=$(PHOTON_STAGE) \
503
-		--rpm-path $(PHOTON_STAGE)/RPMS \
504
-		--img-name=ova_uefi
505
-
506
-photon-docker-image:
507
-	$(PHOTON_REPO_TOOL) $(PHOTON_RPMS_DIR)
508
-	sudo docker build --no-cache --tag photon-build ./support/dockerfiles/photon
509
-	sudo docker run \
510
-		--rm \
511
-		--privileged \
512
-		--net=host \
513
-		-e PHOTON_BUILD_NUMBER=$(PHOTON_BUILD_NUMBER) \
514
-		-e PHOTON_RELEASE_VERSION=$(PHOTON_RELEASE_VERSION) \
515
-		-v `pwd`:/workspace \
516
-		photon-build \
517
-		./support/dockerfiles/photon/make-docker-image.sh tdnf
518
-
519
-k8s-docker-images: start-docker photon-docker-image
520
-	mkdir -p $(PHOTON_STAGE)/docker_images && \
521
-	cd ./support/dockerfiles/k8s-docker-images && \
522
-	./build-k8s-base-image.sh $(PHOTON_RELEASE_VERSION) $(PHOTON_BUILD_NUMBER) $(PHOTON_STAGE)  && \
523
-	./build-k8s-docker-images.sh $(PHOTON_DIST_TAG) $(PHOTON_RELEASE_VERSION) $(PHOTON_SPECS_DIR) $(PHOTON_STAGE) && \
524
-	./build-k8s-metrics-server-image.sh $(PHOTON_DIST_TAG) $(PHOTON_RELEASE_VERSION) $(PHOTON_SPECS_DIR) $(PHOTON_STAGE)  && \
525
-	./build-k8s-coredns-image.sh $(PHOTON_DIST_TAG) $(PHOTON_RELEASE_VERSION) $(PHOTON_SPECS_DIR) $(PHOTON_STAGE)  && \
526
-	./build-k8s-dns-docker-images.sh $(PHOTON_DIST_TAG) $(PHOTON_RELEASE_VERSION) $(PHOTON_SPECS_DIR) $(PHOTON_STAGE) && \
527
-	./build-k8s-dashboard-docker-images.sh $(PHOTON_DIST_TAG) $(PHOTON_RELEASE_VERSION) $(PHOTON_SPECS_DIR) $(PHOTON_STAGE) && \
528
-	./build-flannel-docker-image.sh $(PHOTON_DIST_TAG) $(PHOTON_RELEASE_VERSION) $(PHOTON_SPECS_DIR) $(PHOTON_STAGE) && \
529
-	./build-calico-docker-images.sh $(PHOTON_DIST_TAG) $(PHOTON_RELEASE_VERSION) $(PHOTON_SPECS_DIR) $(PHOTON_STAGE) && \
530
-	./build-k8s-heapster-image.sh $(PHOTON_DIST_TAG) $(PHOTON_RELEASE_VERSION) $(PHOTON_SPECS_DIR) $(PHOTON_STAGE) && \
531
-	./build-k8s-nginx-ingress.sh $(PHOTON_DIST_TAG) $(PHOTON_RELEASE_VERSION) $(PHOTON_SPECS_DIR) $(PHOTON_STAGE)  && \
532
-	./build-wavefront-proxy-docker-image.sh $(PHOTON_DIST_TAG) $(PHOTON_RELEASE_VERSION) $(PHOTON_SPECS_DIR) $(PHOTON_STAGE)
533
-
534
-ostree-repo: start-docker $(PHOTON_PACKAGES)
535
-	@echo "Creating OSTree repo from local RPMs in ostree-repo.tar.gz..."
536
-	@if [ -f  $(PHOTON_STAGE)/ostree-repo.tar.gz ]; then \
537
-		echo "ostree-repo.tar.gz already present, not creating again..."; \
538
-	else \
539
-		$(SRCROOT)/support/image-builder/ostree-tools/make-ostree-image.sh $(SRCROOT); \
540
-	fi
541
-#===============================================================================
542
-
543
-# Set up Build environment
544
-#_______________________________________________________________________________
545
-packages-cached:
546
-	@echo "Using cached RPMS..."
547
-	@$(RM) -f $(PHOTON_RPMS_DIR_NOARCH)/* && \
548
-	$(RM) -f $(PHOTON_RPMS_DIR_ARCH)/* && \
549
-	$(CP) -f $(PHOTON_CACHE_PATH)/RPMS/noarch/* $(PHOTON_RPMS_DIR_NOARCH)/ && \
550
-	$(CP) -f $(PHOTON_CACHE_PATH)/RPMS/$(ARCH)/* $(PHOTON_RPMS_DIR_ARCH)/
551
-	$(PHOTON_REPO_TOOL) $(PHOTON_RPMS_DIR)
552
-
553
-sources:
554
-	@$(MKDIR) -p $(PHOTON_SRCS_DIR)
555
-
556
-sources-cached:
557
-	@echo "Using cached SOURCES..."
558
-	@ln -sf $(PHOTON_SOURCES_PATH) $(PHOTON_SRCS_DIR)
559
-
560
-publish-rpms:
561
-	@echo "Pulling toolchain rpms..."
562
-	@cd $(PHOTON_PULL_PUBLISH_RPMS_DIR) && \
563
-	$(PHOTON_PULL_PUBLISH_RPMS) $(PHOTON_PUBLISH_RPMS_DIR)
564
-
565
-publish-x-rpms:
566
-	@echo "Pulling X toolchain rpms..."
567
-	@cd $(PHOTON_PULL_PUBLISH_RPMS_DIR) && \
568
-	$(PHOTON_PULL_PUBLISH_X_RPMS) $(PHOTON_PUBLISH_XRPMS_DIR)
569
-
570
-publish-rpms-cached:
571
-	@echo "Using cached toolchain rpms..."
572
-	@$(MKDIR) -p $(PHOTON_PUBLISH_RPMS_DIR)/{$(ARCH),noarch} && \
573
-	cd $(PHOTON_PULL_PUBLISH_RPMS_DIR) && \
574
-	$(PHOTON_PULL_PUBLISH_RPMS) $(PHOTON_PUBLISH_RPMS_DIR) $(PHOTON_PUBLISH_RPMS_PATH)
575
-
576
-publish-x-rpms-cached:
577
-	@echo "Using cached X toolchain rpms..."
578
-	@$(MKDIR) -p $(PHOTON_PUBLISH_XRPMS_DIR)/{$(ARCH),noarch} && \
579
-	cd $(PHOTON_PULL_PUBLISH_RPMS_DIR) && \
580
-	$(PHOTON_PULL_PUBLISH_X_RPMS) $(PHOTON_PUBLISH_XRPMS_DIR) $(PHOTON_PUBLISH_XRPMS_PATH)
581
-
582
-photon-stage:
583
-	@echo "Creating staging folder and subitems..."
584
-	@test -d $(PHOTON_STAGE) || $(MKDIR) -p $(PHOTON_STAGE)
585
-	@test -d $(PHOTON_CHROOT_PATH) || $(MKDIR) -p $(PHOTON_CHROOT_PATH)
586
-	@test -d $(PHOTON_RPMS_DIR_NOARCH) || $(MKDIR) -p $(PHOTON_RPMS_DIR_NOARCH)
587
-	@test -d $(PHOTON_RPMS_DIR_ARCH) || $(MKDIR) -p $(PHOTON_RPMS_DIR_ARCH)
588
-	@test -d $(PHOTON_SRPMS_DIR) || $(MKDIR) -p $(PHOTON_SRPMS_DIR)
589
-	@test -d $(PHOTON_UPDATED_RPMS_DIR_NOARCH) || $(MKDIR) -p $(PHOTON_UPDATED_RPMS_DIR_NOARCH)
590
-	@test -d $(PHOTON_UPDATED_RPMS_DIR_ARCH) || $(MKDIR) -p $(PHOTON_UPDATED_RPMS_DIR_ARCH)
591
-	@test -d $(PHOTON_SRCS_DIR) || $(MKDIR) -p $(PHOTON_SRCS_DIR)
592
-	@test -d $(PHOTON_LOGS_DIR) || $(MKDIR) -p $(PHOTON_LOGS_DIR)
593
-	@install -m 444 $(SRCROOT)/COPYING $(PHOTON_STAGE)/COPYING
594
-	@install -m 444 $(SRCROOT)/NOTICE-GPL2.0 $(PHOTON_STAGE)/NOTICE-GPL2.0
595
-	@install -m 444 $(SRCROOT)/NOTICE-Apachev2 $(PHOTON_STAGE)/NOTICE-Apachev2
596
-#_______________________________________________________________________________
597
-
598
-# Clean build environment
599
-#==================================================================
600
-clean: clean-install clean-chroot
601
-	@echo "Deleting Photon ISO..."
602
-	@$(RM) -f $(PHOTON_STAGE)/photon-*.iso
603
-	@echo "Deleting stage dir..."
604
-	@$(RMDIR) $(PHOTON_STAGE)
605
-	@echo "Deleting chroot path..."
606
-	@$(RMDIR) $(PHOTON_CHROOT_PATH)
607
-	@echo "Deleting tools/bin..."
608
-	@$(RMDIR) $(TOOLS_BIN)
609
-
610
-clean-install:
611
-	@echo "Cleaning installer working directory..."
612
-	@if [ -d $(PHOTON_STAGE)/photon_iso ]; then \
613
-		$(PHOTON_CHROOT_CLEANER) $(PHOTON_STAGE)/photon_iso; \
614
-	fi
615
-
616
-clean-chroot:
617
-	@echo "Cleaning chroot path..."
618
-	@if [ -d $(PHOTON_CHROOT_PATH) ]; then \
619
-		$(PHOTON_CHROOT_CLEANER) $(PHOTON_CHROOT_PATH); \
620
-	fi
621
-
622
-#==================================================================
623
-
624
-# Targets to check for tools support in build environment
625
-#__________________________________________________________________________________
626
-check-tools: check-bison check-g++ check-gawk check-repo-tool check-texinfo check-sanity check-docker check-pyopenssl
627
-
628
-check-docker:
629
-ifeq (,$(wildcard $(DOCKER_ENV)))
630
-	@command -v docker >/dev/null 2>&1 || { echo "Package docker not installed. Aborting." >&2; exit 1; }
631
-endif
632
-
633
-check-docker-service:
634
-ifeq (,$(wildcard $(DOCKER_ENV)))
635
-	@docker ps >/dev/null 2>&1 || { echo "Docker service is not running. Aborting." >&2; exit 1; }
636
-endif
637
-
638
-check-docker-py:
639
-ifeq (,$(wildcard $(DOCKER_ENV)))
640
-	@python3 -c "import docker; assert docker.__version__ >= '$(PHOTON_DOCKER_PY_VER)'" >/dev/null 2>&1 || { echo "Error: Python3 package docker-py3 $(PHOTON_DOCKER_PY_VER) not installed.\nPlease use: pip3 install docker==$(PHOTON_DOCKER_PY_VER)" >&2; exit 1; }
641
-endif
642
-
643
-check-pyopenssl:
644
-	@python3 -c "import OpenSSL" > /dev/null 2>&1 || { echo "Error pyOpenSSL package not installed.\nPlease use: pip3 install pyOpenSSL" >&2; exit 1; }
645
-
646
-check-bison:
647
-	@command -v bison >/dev/null 2>&1 || { echo "Package bison not installed. Aborting." >&2; exit 1; }
648
-
649
-check-texinfo:
650
-	@command -v makeinfo >/dev/null 2>&1 || { echo "Package texinfo not installed. Aborting." >&2; exit 1; }
651
-
652
-check-g++:
653
-	@command -v g++ >/dev/null 2>&1 || { echo "Package g++ not installed. Aborting." >&2; exit 1; }
654
-
655
-check-gawk:
656
-	@command -v gawk >/dev/null 2>&1 || { echo "Package gawk not installed. Aborting." >&2; exit 1; }
657
-
658
-check-repo-tool:
659
-	@command -v $(PHOTON_REPO_TOOL) >/dev/null 2>&1 || { echo "Package $(PHOTON_REPO_TOOL) not installed. Aborting." >&2; exit 1; }
660
-
661
-check-kpartx:
662
-	@command -v kpartx >/dev/null 2>&1 || { echo "Package kpartx not installed. Aborting." >&2; exit 1; }
663
-
664
-check-sanity:
665
-	@$(SRCROOT)/support/sanity_check.sh
666
-	@echo ""
667
-
668
-start-docker: check-docker
669
-	systemctl start docker
670
-
671
-install-photon-docker-image: photon-docker-image
672
-	sudo docker build -t photon:tdnf .
673
-#__________________________________________________________________________________
674
-
675
-# Spec file checker and utilities
676
-#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
677
-check-spec-files:
678
-	@./tools/scripts/check_spec_files.sh
679
-
680
-generate-dep-lists:
681
-	@echo ""
682
-	@$(RMDIR) $(PHOTON_GENERATED_DATA_DIR)
683
-	@$(MKDIR) -p $(PHOTON_GENERATED_DATA_DIR)
684
-	@cd $(PHOTON_SPECDEPS_DIR) && \
685
-	$(PHOTON_SPECDEPS) \
686
-		--spec-path $(PHOTON_SPECS_DIR) \
687
-		--stage-dir $(PHOTON_STAGE) \
688
-		--log-path $(PHOTON_LOGS_DIR) \
689
-		--log-level $(LOGLEVEL) \
690
-		--pkg $(PHOTON_GENERATED_DATA_DIR) \
691
-		--input-type=json \
692
-		--file "$$(ls $(PHOTON_DATA_DIR)/packages_*.json)" \
693
-		--display-option json \
694
-		--input-data-dir $(PHOTON_DATA_DIR)
695
-	@echo ""
696
-pkgtree:
697
-	@cd $(PHOTON_SPECDEPS_DIR) && \
698
-		$(PHOTON_SPECDEPS) \
699
-			--spec-path $(PHOTON_SPECS_DIR) \
700
-			--log-level $(LOGLEVEL) \
701
-			--input-type pkg \
702
-			--pkg $(pkg)
703
-
704
-imgtree:
705
-	@cd $(PHOTON_SPECDEPS_DIR) && \
706
-		$(PHOTON_SPECDEPS) \
707
-			--spec-path $(PHOTON_SPECS_DIR) \
708
-			--log-level $(LOGLEVEL) \
709
-			--input-type json \
710
-			--file $(PHOTON_DATA_DIR)/packages_$(img).json
711
-
712
-who-needs:
713
-	@cd $(PHOTON_SPECDEPS_DIR) && \
714
-		$(PHOTON_SPECDEPS) \
715
-			--spec-path $(PHOTON_SPECS_DIR) \
716
-			--log-level $(LOGLEVEL) \
717
-			--input-type who-needs \
718
-			--pkg $(pkg)
719
-
720
-print-upward-deps:
721
-	@cd $(PHOTON_SPECDEPS_DIR) && \
722
-		$(PHOTON_SPECDEPS) \
723
-			--spec-path $(PHOTON_SPECS_DIR) \
724
-			--input-type print-upward-deps \
725
-			--pkg $(pkg)
726
-
727
-#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
728
-
729
-generate-yaml-files: check-tools photon-stage $(PHOTON_PACKAGES)
730
-	@echo "Generating yaml files for packages ..."
731
-	@cd $(PHOTON_PKG_BUILDER_DIR) && \
732
-	$(PHOTON_GENERATE_OSS_FILES) --generate-yaml-files \
733
-		--spec-path $(PHOTON_SPECS_DIR) \
734
-		--source-rpm-path $(PHOTON_SRPMS_DIR) \
735
-		--log-path $(PHOTON_LOGS_DIR) \
736
-		--dist-tag $(PHOTON_DIST_TAG) \
737
-		--log-level $(LOGLEVEL) \
738
-		--pullsources-config $(PHOTON_PULLSOURCES_CONFIG) \
739
-		--pkg-blacklist-file $(PHOTON_PKG_BLACKLIST_FILE)
740
-
741
-# Input args: BASE_COMMIT= (optional)
742
-#
743
-# This target removes staged RPMS that can be affected by change(s) and should
744
-# be rebuilt as part of incremental build support
745
-# For every spec file touched - remove all upward dependent packages (rpms)
746
-# If support folder was touched - do full build
747
-#
748
-# The analyzed changes are:
749
-# - commits from BASE_COMMIT to HEAD (if BASE_COMMIT= parameter is specified)
750
-# - local changes (if no commits specified)
751
-clean-stage-for-incremental-build:
752
-	@test -z "$$(git diff --name-only $(BASE_COMMIT) @ | grep SPECS)" || $(PHOTON_SPECDEPS) --spec-path $(PHOTON_SPECS_DIR) -i remove-upward-deps -p $$(echo `git diff --name-only $(BASE_COMMIT) @ | grep .spec | xargs -n1 basename 2>/dev/null` | tr ' ' :)
753
-	@test -n "$$(git diff --name-only @~1 @ | grep '^support/\(make\|package-builder\|pullpublishrpms\)')" && { echo "Remove all staged RPMs"; $(RM) -rf $(PHOTON_RPMS_DIR); } ||:
754
-
5
+%:
6
+	@./build.py -c $(CONF) -t $@
755 7
new file mode 100755
... ...
@@ -0,0 +1,1099 @@
0
+#!/usr/bin/env python3
1
+
2
+import sys
3
+import os
4
+sys.path.insert(0, os.path.join(os.path.dirname(os.path.realpath(__file__)), "support/package-builder"))
5
+sys.path.insert(1, os.path.join(os.path.dirname(os.path.realpath(__file__)), "support/image-builder"))
6
+from pathlib import PurePath
7
+from constants import constants
8
+from argparse import ArgumentParser
9
+from CommandUtils import CommandUtils
10
+from builder import Builder
11
+from Logger import Logger
12
+from utils import Utils
13
+import subprocess
14
+import json
15
+import docker
16
+import shutil
17
+import traceback
18
+import glob
19
+configdict = {}
20
+
21
+targetList = {
22
+        "image":["iso", "ami", "gce", "azure", "rpi3", "ova", "ova_uefi", "all", "src-iso",
23
+                "photon-docker-image", "k8s-docker-images", "all-images", "minimal-iso", "rt-iso"],
24
+
25
+        "rpmBuild": ["packages", "packages-minimal", "packages-initrd", "packages-docker",
26
+                "updated-packages", "tool-chain-stage1", "tool-chain-stage2", "check",
27
+                "ostree-repo", "generate-yaml-files", "create-repo", "distributed-build"],
28
+
29
+        "buildEnvironment": ["packages-cached", "sources", "sources-cached", "publish-rpms",
30
+                "publish-x-rpms", "publish-rpms-cached", "publish-x-rpms-cached", "photon-stage"],
31
+
32
+        "cleanup": ["clean", "clean-install", "clean-chroot", "clean-stage-for-incremental-build"],
33
+
34
+        "tool-checkup": ["check-tools", "check-docker", "check-docker-service", "check-docker-py",
35
+                "check-bison", "check-texinfo", "check-g++", "check-gawk", "check-repo-tool",
36
+                "check-kpartx", "check-sanity", "start-docker", "install-photon-docker-image",
37
+                "check-spec-files", "check-pyopenssl"],
38
+
39
+        "utilities": ["generate-dep-lists", "pkgtree", "imgtree", "who-needs", "print-upward-deps"]
40
+        }
41
+
42
+curDir = os.getcwd()
43
+
44
+check_prerequesite = {
45
+        "vixdiskutil": False,
46
+        "tools-bin": False,
47
+        "contain": False,
48
+        "initialize-constants": False
49
+        }
50
+
51
+def vixdiskutil():
52
+    check_prerequesite["vixdiskutil"] = True
53
+    if not check_prerequesite["tools-bin"]:
54
+        tools_bin()
55
+    if subprocess.Popen(["cd " + curDir + "/tools/src/vixDiskUtil && make"], shell=True).wait() != 0:
56
+        raise Exception("Not able to make vixDiskUtil")
57
+
58
+def tools_bin():
59
+    check_prerequesite["tools-bin"] = True
60
+    if not os.path.isdir(os.path.join(curDir, "tools/bin")):
61
+        os.mkdir(os.path.join("tools","bin"))
62
+
63
+def contain():
64
+    check_prerequesite["contain"] = True
65
+    if not check_prerequesite["tools-bin"]:
66
+        tools_bin()
67
+
68
+    if subprocess.Popen(["gcc -O2 -std=gnu99 -Wall -Wextra " + curDir + \
69
+            "/tools/src/contain/*.c -o tools/bin/contain_unpriv && sudo install -o root -g root \
70
+            -m 4755 tools/bin/contain_unpriv tools/bin/contain"], shell=True).wait() != 0:
71
+        raise Exception("contain failed")
72
+
73
+
74
+class Build_Config:
75
+    buildThreads = 1
76
+    stagePath = ""
77
+    pkgJsonInput = None
78
+    rpmNoArchPath = ""
79
+    chrootPath = ""
80
+    generatedDataPath = ""
81
+    pullPublishRPMSDir = ""
82
+    pullPublishRPMS = ""
83
+    pullPublishXRPMS = ""
84
+    updatedRpmPath = ""
85
+    updatedRpmNoArchPath = ""
86
+    dockerEnv = "/.dockerenv"
87
+    updatedRpmArchPath = ""
88
+    installerPath = ""
89
+    pkgInfoFile = ""
90
+    rpmArchPath = ""
91
+    commonDir = ""
92
+    pkgBuildType = ""
93
+    dataDir = ""
94
+    packageListFile = "build_install_options_all.json"
95
+    pkgToBeCopiedConfFile = None
96
+    confFile = None
97
+    distributedBuildFile = "distributed_build_options.json"
98
+
99
+    @staticmethod
100
+    def setDockerEnv(dockerEnv):
101
+        Build_Config.dockerEnv = dockerEnv
102
+
103
+    @staticmethod
104
+    def setDistributedBuildFile(distributedBuildFile):
105
+        Build_Config.distributedBuildFile = distributedBuildFile
106
+
107
+    @staticmethod
108
+    def setPkgToBeCopiedConfFile(pkgToBeCopiedConfFile):
109
+        Build_Config.pkgToBeCopiedConfFile = pkgToBeCopiedConfFile
110
+
111
+    @staticmethod
112
+    def setRpmNoArchPath():
113
+        Build_Config.rpmNoArchPath = os.path.join(constants.rpmPath, "noarch")
114
+
115
+    @staticmethod
116
+    def setRpmArchPath():
117
+        Build_Config.rpmArchPath = os.path.join(constants.rpmPath, constants.buildArch)
118
+
119
+    @staticmethod
120
+    def setConfFile(confFile):
121
+        Build_Config.confFile = confFile
122
+
123
+    @staticmethod
124
+    def setPkgBuildType(pkgBuildType):
125
+        Build_Config.pkgBuildType = pkgBuildType
126
+
127
+    @staticmethod
128
+    def setBuildThreads(buildThreads):
129
+        Build_Config.buildThreads = buildThreads
130
+
131
+    @staticmethod
132
+    def setPkgJsonInput(pkgJsonInput):
133
+        Build_Config.pkgJsonInput = pkgJsonInput
134
+
135
+    @staticmethod
136
+    def setUpdatedRpmPath(updatedRpmPath):
137
+        Build_Config.updatedRpmPath = updatedRpmPath
138
+        Build_Config.updatedRpmNoArchPath = os.path.join(updatedRpmPath , "noarch")
139
+        Build_Config.updatedRpmArchPath = os.path.join(updatedRpmPath, constants.buildArch)
140
+
141
+    @staticmethod
142
+    def setStagePath(stagePath):
143
+        Build_Config.stagePath = stagePath
144
+
145
+    @staticmethod
146
+    def setInstallerPath(installerPath):
147
+        Build_Config.installerPath = installerPath
148
+
149
+    @staticmethod
150
+    def setPkgInfoFile(pkgInfoFile):
151
+        Build_Config.pkgInfoFile = pkgInfoFile
152
+
153
+    @staticmethod
154
+    def setChrootPath(chrootPath):
155
+        Build_Config.chrootPath = chrootPath
156
+
157
+    @staticmethod
158
+    def setGeneratedDataDir(generatedDataDir):
159
+        Build_Config.generatedDataPath = generatedDataDir
160
+
161
+    @staticmethod
162
+    def setCommonDir(commonDir):
163
+        Build_Config.commonDir = commonDir
164
+
165
+    @staticmethod
166
+    def setDataDir(dataDir):
167
+        Build_Config.dataDir = dataDir
168
+        Build_Config.packageListFile = os.path.join(Build_Config.dataDir, Build_Config.packageListFile)
169
+
170
+    @staticmethod
171
+    def setPullPublishRPMSDir(pullPublishRPMSDir):
172
+        Build_Config.pullPublishRPMSDir = pullPublishRPMSDir
173
+
174
+    @staticmethod
175
+    def setPullPublishXRPMS(pullPublishXRPMS):
176
+        Build_Config.pullPublishXRPMS = pullPublishXRPMS
177
+
178
+    @staticmethod
179
+    def setPullPublishRPMS(pullPublishRPMS):
180
+        Build_Config.pullPublishRPMS = pullPublishRPMS
181
+
182
+# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
183
+# class Utilities is used for generating spec dependency, priniting upward dependencies for package..      +
184
+#                                                                                                          +
185
+# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
186
+class Utilities:
187
+
188
+    global configdict
189
+    global check_prerequesite
190
+
191
+    def __init__(self):
192
+
193
+        from SpecDeps import SpecDependencyGenerator
194
+
195
+        cmdUtils = CommandUtils()
196
+        self.img = configdict.get("utility", {}).get("img", None)
197
+        self.json_file = configdict.get("utility", {}).get("file", "packages_*.json")
198
+        self.display_option = configdict.get("utility", {}).get("display-option", "json")
199
+        self.input_type = configdict.get("utility", {}).get("input-type", "json")
200
+        self.pkg = configdict.get("utility", {}).get("pkg", None)
201
+
202
+        self.logger = Logger.getLogger("SpecDeps", constants.logPath, constants.logLevel)
203
+        if not os.path.isdir(Build_Config.generatedDataPath):
204
+            cmdUtils.runCommandInShell("mkdir -p " + Build_Config.generatedDataPath)
205
+
206
+        if configdict["targetName"] in ["pkgtree", "who-needs", "print-upward-deps"] and "pkg" not in os.environ:
207
+            raise Exception("pkg not present in os.environ")
208
+        elif configdict["targetName"] in ["pkgtree", "who-needs", "print-upward-deps"]:
209
+            self.pkg = os.environ["pkg"]
210
+            self.display_option = "tree"
211
+
212
+        if configdict["targetName"] == "imgtree" and "img" not in os.environ:
213
+            raise Exception("img not present in os.environ")
214
+        elif configdict["targetName"] == "imgtree":
215
+            self.json_file = "packages_" + os.environ["img"] + ".json"
216
+
217
+        self.specDepsObject = SpecDependencyGenerator(constants.logPath, constants.logLevel)
218
+
219
+    def generate_dep_lists(self):
220
+        check_prerequesite["generate-dep-lists"] = True
221
+        list_json_files = glob.glob(os.path.join(Build_Config.dataDir, self.json_file))
222
+        # Generate the expanded package dependencies json file based on package_list_file
223
+        self.logger.info("Generating the install time dependency list for all json files")
224
+        if list_json_files:
225
+            shutil.copy2(os.path.join(Build_Config.dataDir, "build_install_options_all.json"), Build_Config.generatedDataPath)
226
+            shutil.copy2(os.path.join(Build_Config.dataDir, "build_install_options_minimal.json"), Build_Config.generatedDataPath)
227
+            shutil.copy2(os.path.join(Build_Config.dataDir, "build_install_options_rt.json"), Build_Config.generatedDataPath)
228
+        for json_file in list_json_files:
229
+            output_file = None
230
+            if self.display_option == "json":
231
+                output_file = os.path.join(Build_Config.generatedDataPath, os.path.splitext(os.path.basename(json_file))[0]+"_expanded.json")
232
+                self.specDepsObject.process(self.input_type, json_file, self.display_option, output_file)
233
+
234
+    def pkgtree(self):
235
+        self.input_type = "pkg"
236
+        self.specDepsObject.process(self.input_type, self.pkg, self.display_option)
237
+
238
+    def who_needs(self):
239
+        self.input_type = "who-needs"
240
+        self.specDepsObject.process(self.input_type, self.pkg, self.display_option)
241
+
242
+    def imgtree(self):
243
+        self.input_type = "json"
244
+        self.generate_dep_lists()
245
+
246
+    def print_upward_deps(self):
247
+        whoNeedsList = self.specDepsObject.process("get-upward-deps", self.pkg, self.display_option)
248
+        self.logger.info("Upward dependencies: " + str(whoNeedsList))
249
+
250
+# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
251
+#  class Buildenvironmentsetup does job like pulling toolchain RPMS and creating stage...                   +
252
+#                                                                                                           +
253
+# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
254
+
255
+
256
+class BuildEnvironmentSetup:
257
+
258
+    global configdict
259
+    global check_prerequesite
260
+
261
+    def packages_cached():
262
+        check_prerequesite["packages-cached"]=True
263
+        CommandUtils.runCommandInShell("rm -rf " + Build_Config.rpmNoArchPath + "/*")
264
+        CommandUtils.runCommandInShell("rm -rf " + Build_Config.rpmArchPath + "/*")
265
+        CommandUtils.runCommandInShell("cp -rf " + configdict["additional-path"]["photon-cache-path"] + "/RPMS/noarch/* " + Build_Config.rpmNoArchPath)
266
+        CommandUtils.runCommandInShell("cp -rf " + configdict["additional-path"]["photon-cache-path"] + \
267
+                "/RPMS/" + constants.currentArch + "/* " + Build_Config.rpmArchPath)
268
+        RpmBuildTarget.create_repo()
269
+
270
+    def sources():
271
+        if configdict['additional-path']['photon-sources-path'] is None:
272
+            check_prerequesite["sources"]=True
273
+            if not os.path.isdir(constants.sourcePath):
274
+                os.mkdir(constants.sourcePath)
275
+        else:
276
+            BuildEnvironmentSetup.sources_cached()
277
+
278
+    def sources_cached():
279
+        check_prerequesite["sources-cached"]=True
280
+        print("Using cached SOURCES...")
281
+        CommandUtils.runCommandInShell("ln -sf " + configdict["additional-path"]["photon-sources-path"] + "  " + constants.sourcePath)
282
+
283
+    def publish_rpms():
284
+        if configdict['additional-path']['photon-publish-rpms-path'] is None:
285
+            check_prerequesite["publish-rpms"]=True
286
+            print("Pulling toolchain RPMS...")
287
+            if subprocess.Popen(["cd " + Build_Config.pullPublishRPMSDir + " && " \
288
+                    + Build_Config.pullPublishRPMS + " " + constants.prevPublishRPMRepo], shell=True).wait() != 0:
289
+                raise Exception("Cannot run publish-rpms")
290
+        else:
291
+            BuildEnvironmentSetup.publish_rpms_cached()
292
+
293
+    def publish_rpms_cached():
294
+        check_prerequesite["publish-rpms-cached"]=True
295
+        if not os.path.isdir(constants.prevPublishRPMRepo + "/" + constants.currentArch):
296
+            os.makedirs(constants.prevPublishRPMRepo + "/" + constants.currentArch)
297
+        if not os.path.isdir(constants.prevPublishRPMRepo + "/noarch"):
298
+            os.makedirs(constants.prevPublishRPMRepo + "/noarch")
299
+        if subprocess.Popen(["cd " + Build_Config.pullPublishRPMSDir + " && " + \
300
+                Build_Config.pullPublishRPMS + " " + constants.prevPublishRPMRepo + "  " + \
301
+                configdict["additional-path"]["photon-publish-rpms-path"]], shell=True).wait() != 0:
302
+            raise Exception("Cannot run publish-rpms-cached")
303
+
304
+    def publish_x_rpms_cached():
305
+        check_prerequesite["publish-x-rpms-cached"]=True
306
+        if not os.path.isdir(constants.prevPublishXRPMRepo + "/" + constants.currentArch):
307
+            os.makedirs(constants.prevPublishXRPMRepo + "/" + constants.currentArch)
308
+        if not os.path.isdir(constants.prevPublishRPMRepo + "/noarch"):
309
+            os.makedirs(constants.prevPublishXRPMRepo + "/noarch")
310
+        if subprocess.Popen(["cd " + Build_Config.pullPublishRPMSDir + " && " + Build_Config.pullPublishXRPMS \
311
+                + " " + constants.prevPublishXRPMRepo + "  " + \
312
+                configdict["additional-path"]["photon-publish-x-rpms-path"]], shell=True).wait() != 0:
313
+            raise Exception("Cannot run publish-x-rpms-cached")
314
+
315
+
316
+    def publish_x_rpms():
317
+        if configdict['additional-path']['photon-publish-x-rpms-path'] is None:
318
+            check_prerequesite["publish-x-rpms"]=True
319
+            print("\nPulling X toolchain RPMS...")
320
+            if subprocess.Popen(["cd " + Build_Config.pullPublishRPMSDir + " && " + Build_Config.pullPublishXRPMS \
321
+                    + " " + constants.prevPublishXRPMRepo], shell=True).wait() != 0:
322
+                raise Exception("Cannot run publishx-rpms")
323
+        else:
324
+            BuildEnvironmentSetup.publish_x_rpms_cached()
325
+
326
+    def photon_stage():
327
+        check_prerequesite["photon-stage"]=True
328
+        print("\nCreating staging folder and subitems...")
329
+
330
+        if not os.path.isdir(Build_Config.stagePath):
331
+            os.mkdir(Build_Config.stagePath)
332
+
333
+        if not os.path.isdir(constants.buildRootPath):
334
+            os.mkdir(constants.buildRootPath)
335
+
336
+        if not os.path.isdir(constants.rpmPath):
337
+            os.mkdir(constants.rpmPath)
338
+            if not os.path.isdir(Build_Config.rpmArchPath):
339
+                os.mkdir(Build_Config.rpmArchPath)
340
+            if not os.path.isdir(Build_Config.rpmNoArchPath):
341
+                os.mkdir(Build_Config.rpmNoArchPath)
342
+
343
+        if not os.path.isdir(constants.sourceRpmPath):
344
+            os.mkdir(constants.sourceRpmPath)
345
+
346
+        if not os.path.isdir(Build_Config.updatedRpmPath):
347
+            os.mkdir(Build_Config.updatedRpmPath)
348
+            if not os.path.isdir(Build_Config.updatedRpmNoArchPath):
349
+                os.mkdir(Build_Config.updatedRpmNoArchPath)
350
+            if not os.path.isdir(Build_Config.updatedRpmArchPath):
351
+                os.mkdir(Build_Config.updatedRpmArchPath)
352
+
353
+        if not os.path.isdir(constants.sourcePath):
354
+            os.mkdir(constants.sourcePath)
355
+
356
+        if not os.path.isdir(constants.logPath):
357
+            os.mkdir(constants.logPath)
358
+
359
+        if not os.path.isfile(Build_Config.stagePath + "/COPYING"):
360
+            CommandUtils.runCommandInShell("install -m 444 " + curDir + "/COPYING " + Build_Config.stagePath + "/COPYING")
361
+
362
+        if not os.path.isfile(Build_Config.stagePath + "/NOTICE-GPL2.0"):
363
+            CommandUtils.runCommandInShell("install -m 444 " + curDir + "/NOTICE-GPL2.0 " + Build_Config.stagePath + "/NOTICE-GPL2.0")
364
+
365
+        if not os.path.isfile(Build_Config.stagePath + "/NOTICE-Apachev2"):
366
+            CommandUtils.runCommandInShell("install -m 444 " + curDir + "/NOTICE-Apachev2 " + Build_Config.stagePath + "/NOTICE-Apachev2")
367
+
368
+# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
369
+# class Cleanup does the job of cleaning up the stage directory...                                              +
370
+#                                                                                                               +
371
+# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
372
+class CleanUp:
373
+
374
+    def clean():
375
+        CleanUp.clean_install()
376
+        CleanUp.clean_chroot()
377
+        print("Deleting Photon ISO...")
378
+        CommandUtils.runCommandInShell("rm -f " + Build_Config.stagePath + "/photon-*.iso")
379
+        print("Deleting stage dir...")
380
+        CommandUtils.runCommandInShell("rm -rf " + Build_Config.stagePath)
381
+        print("Deleting chroot path...")
382
+        CommandUtils.runCommandInShell("rm -rf " + constants.buildRootPath)
383
+        print("Deleting tools/bin...")
384
+        CommandUtils.runCommandInShell("rm -rf tools/bin")
385
+
386
+    def clean_install():
387
+        print("Cleaning installer working directory...")
388
+        if os.path.isdir(os.path.join(Build_Config.stagePath, "photon_iso")):
389
+            if subprocess.Popen(["support/package-builder/clean-up-chroot.py", os.path.join(Build_Config.stagePath, "photon_iso")]).wait() != 0:
390
+                raise Exception("Not able to clean chroot")
391
+
392
+    def clean_chroot():
393
+        print("Cleaning chroot path...")
394
+        if os.path.isdir(constants.buildRootPath):
395
+            if subprocess.Popen([curDir + "/support/package-builder/clean-up-chroot.py", constants.buildRootPath]).wait() != 0:
396
+                raise Exception("Not able to clean chroot")
397
+
398
+    def clean_stage_for_incremental_build():
399
+        command = ["cd "+  configdict["photon-path"]+ ";test -z \"$$(git diff --name-only "\
400
+                + configdict["photon-build-param"].get("base-commit", "") + " @ | grep SPECS)\" || "\
401
+                + curDir + "/support/package-builder/SpecDeps.py  --spec-path SPECS/ -i remove-upward-deps -p \"$$(echo `git diff --name-only "\
402
+                + configdict["photon-build-param"].get("base-commit", "")+" @ | grep .spec | xargs -n1 basename 2>/dev/null` | tr ' ' :)\""]
403
+        subprocess.Popen(command, shell=True).wait()
404
+
405
+        command = ["test -n \"$$(git diff --name-only @~1 @ | grep '^support/\(make\|package-builder\|pullpublishrpms\)')\" && " \
406
+                + "{ cd " + configdict["photon-path"] + "; echo 'Remove all staged RPMs'; /bin/rm -rf ./stage/RPMS; } ||:"]
407
+        if subprocess.Popen(command, shell=True).wait() != 0:
408
+            raise Exception("Not able to run clean_stage_for_incremental_build")
409
+        return
410
+
411
+
412
+# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
413
+# class Rpmbuildtarget does the job of building all the RPMs for the SPECS                                            +
414
+# It uses Builder class in builder.py in order to build packages.                                                     +
415
+# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
416
+
417
+class RpmBuildTarget:
418
+
419
+    global configdict
420
+    global check_prerequesite
421
+
422
+    def __init__(self):
423
+        from SpecData import SPECS
424
+
425
+        self.logger = Logger.getLogger("Main", constants.logPath, constants.logLevel)
426
+
427
+        if not check_prerequesite["check-docker-py"]:
428
+            CheckTools.check_docker_py()
429
+
430
+        if not check_prerequesite["check-tools"]:
431
+            CheckTools.check_tools()
432
+
433
+        if not check_prerequesite["photon-stage"]:
434
+            BuildEnvironmentSetup.photon_stage()
435
+
436
+        if configdict["additional-path"]["photon-publish-x-rpms-path"] is not None and not check_prerequesite["publish-x-rpms-cached"]:
437
+            BuildEnvironmentSetup.publish_x_rpms_cached()
438
+        else:
439
+            if not check_prerequesite["publish-x-rpms"]:
440
+                BuildEnvironmentSetup.publish_x_rpms()
441
+
442
+        if configdict["additional-path"]["photon-publish-rpms-path"] is not None and not check_prerequesite["publish-rpms-cached"]:
443
+            BuildEnvironmentSetup.publish_rpms_cached()
444
+        else:
445
+            if not check_prerequesite["publish-rpms"]:
446
+                BuildEnvironmentSetup.publish_rpms()
447
+
448
+        if configdict["additional-path"]["photon-sources-path"] is not None and not check_prerequesite["sources-cached"]:
449
+            BuildEnvironmentSetup.sources_cached()
450
+        else:
451
+            if not check_prerequesite["sources"]:
452
+                BuildEnvironmentSetup.sources()
453
+
454
+        if not check_prerequesite["contain"]:
455
+            contain()
456
+
457
+        if not check_prerequesite["check-spec-files"]:
458
+            CheckTools.check_spec_files()
459
+
460
+        a = Utilities()
461
+        a.generate_dep_lists()
462
+
463
+        if constants.buildArch != constants.targetArch:
464
+            CommandUtils.runCommandInShell("mkdir -p " + constants.rpmPath + "/" + constants.targetArch)
465
+
466
+        self.logger.debug("Source Path :" + constants.sourcePath)
467
+        self.logger.debug("Spec Path :" + constants.specPath)
468
+        self.logger.debug("Rpm Path :" + constants.rpmPath)
469
+        self.logger.debug("Log Path :" + constants.logPath)
470
+        self.logger.debug("Log Level :" + constants.logLevel)
471
+        self.logger.debug("Top Dir Path :" + constants.topDirPath)
472
+        self.logger.debug("Publish RPMS Path :" + constants.prevPublishRPMRepo)
473
+        self.logger.debug("Publish X RPMS Path :" + constants.prevPublishXRPMRepo)
474
+
475
+        Builder.get_packages_with_build_options(configdict['photon-build-param']['pkg-build-options'])
476
+
477
+        os.chdir(str(PurePath(curDir, "support", "package-builder")))
478
+        if not check_prerequesite["generate-dep-lists"]:
479
+            SPECS()
480
+        if constants.buildArch != constants.targetArch:
481
+            # It is cross compilation
482
+            # first build all native packages
483
+            Builder.buildPackagesForAllSpecs(Build_Config.buildThreads, Build_Config.pkgBuildType, Build_Config.pkgInfoFile, self.logger)
484
+
485
+            # Then do the build to the target
486
+            constants.currentArch = constants.targetArch
487
+            constants.crossCompiling = True
488
+
489
+
490
+    @staticmethod
491
+    def create_repo():
492
+        check_prerequesite["create-repo"]=True
493
+        if subprocess.Popen(["createrepo " + constants.rpmPath], shell=True).wait() != 0:
494
+            raise Exception("Not able to create repodata")
495
+
496
+    @staticmethod
497
+    def ostree_repo():
498
+        check_prerequesite["ostree-repo"]=True
499
+        if not check_prerequesite["start-docker"]:
500
+            CheckTools.start_docker()
501
+        if not os.path.isfile(os.path.join(Build_Config.stagePath, "ostree-repo.tar.gz")):
502
+            process = subprocess.Popen([curDir + "/support/image-builder/ostree-tools/make-ostree-image.sh", curDir, Build_Config.stagePath])
503
+
504
+            retval = process.wait()
505
+            if retval != 0:
506
+                print("Not able to execute make-ostree-image.sh")
507
+        else:
508
+            print("Creating OSTree repo from local RPMs in ostree-repo.tar.gz...")
509
+
510
+    def packages(self):
511
+        check_prerequesite["packages"]=True
512
+        if configdict['additional-path']['photon-cache-path'] is None:
513
+            Builder.buildPackagesForAllSpecs(Build_Config.buildThreads,
514
+                                                Build_Config.pkgBuildType,
515
+                                                Build_Config.pkgInfoFile,
516
+                                                self.logger)
517
+            RpmBuildTarget.create_repo()
518
+        else:
519
+            BuildEnvironmentSetup.packages_cached()
520
+        os.chdir(curDir)
521
+
522
+    def package(self, pkgName):
523
+        check_prerequesite["package"] = True
524
+        self.logger.debug("Package to build:" + pkgName)
525
+        Builder.buildSpecifiedPackages([pkgName], Build_Config.buildThreads, Build_Config.pkgBuildType)
526
+        os.chdir(curDir)
527
+
528
+    def packages_minimal(self):
529
+        check_prerequesite["packages-minimal"] = True
530
+        if configdict['additional-path']['photon-cache-path'] is None:
531
+            Builder.buildPackagesInJson(os.path.join(Build_Config.dataDir, "packages_minimal.json"), \
532
+                    Build_Config.buildThreads, Build_Config.pkgBuildType, Build_Config.pkgInfoFile, self.logger)
533
+        else:
534
+            BuildEnvironmentSetup.packages_cached()
535
+        os.chdir(curDir)
536
+
537
+    def packages_rt(self):
538
+        check_prerequesite["packages-rt"] = True
539
+        if configdict['additional-path']['photon-cache-path'] is None:
540
+            Builder.buildPackagesInJson(os.path.join(Build_Config.dataDir, "packages_rt.json"), \
541
+                    Build_Config.buildThreads, Build_Config.pkgBuildType, Build_Config.pkgInfoFile, self.logger)
542
+        else:
543
+            BuildEnvironmentSetup.packages_cached()
544
+        os.chdir(curDir)
545
+
546
+    def packages_initrd(self):
547
+        check_prerequesite["packages-initrd"] = True
548
+        Builder.buildPackagesInJson(os.path.join(Build_Config.dataDir, "packages_installer_initrd.json"), \
549
+                Build_Config.buildThreads, Build_Config.pkgBuildType, Build_Config.pkgInfoFile, self.logger)
550
+        os.chdir(curDir)
551
+
552
+    def packages_docker(self):
553
+        check_prerequesite["packages-docker"] = True
554
+        Builder.buildPackagesForAllSpecs(Build_Config.buildThreads, Build_Config.pkgBuildType, Build_Config.pkgInfoFile, self.logger)
555
+        os.chdir(curDir)
556
+
557
+    def updated_packages(self):
558
+        check_prerequesite["updated-packages"] = True
559
+        constants.setRpmPath(Build_Config.updatedRpmPath)
560
+        Builder.buildPackagesForAllSpecs(Build_Config.buildThreads, Build_Config.pkgBuildType, Build_Config.pkgInfoFile, self.logger)
561
+        os.chdir(curDir)
562
+
563
+    def check(self):
564
+        check_prerequesite["check"] = True
565
+        constants.setRPMCheck(True)
566
+        constants.setRpmCheckStopOnError(True)
567
+        Builder.buildPackagesForAllSpecs(Build_Config.buildThreads, Build_Config.pkgBuildType, Build_Config.pkgInfoFile, self.logger)
568
+        os.chdir(curDir)
569
+
570
+    def distributed_build():
571
+        from DistributedBuilder import DistributedBuilder
572
+        print("Building RPMS through kubernetes ...")
573
+        os.chdir(str(PurePath(curDir, "support", "package-builder")))
574
+        with open(Build_Config.distributedBuildFile, 'r') as configFile:
575
+            distributedBuildConfig = json.load(configFile)
576
+
577
+        distributedBuilder = DistributedBuilder(distributedBuildConfig)
578
+        distributedBuilder.create()
579
+        distributedBuilder.getLogs()
580
+        distributedBuilder.monitorJob()
581
+        distributedBuilder.copyFromNfs()
582
+        distributedBuilder.deleteBuild()
583
+        distributedBuilder.clean()
584
+
585
+        os.chdir(curDir)
586
+
587
+    def tool_chain_stage1(self):
588
+        from PackageManager import PackageManager
589
+        check_prerequesite["tool-chain-stage1"] = True
590
+        pkgManager = PackageManager()
591
+        pkgManager.buildToolChain()
592
+
593
+    def tool_chain_stage2(self):
594
+        from PackageManager import PackageManager
595
+        check_prerequesite["tool-chain-stage2"] = True
596
+        pkgManager = PackageManager()
597
+        pkgManager.buildToolChainPackages(Build_Config.buildThreads)
598
+
599
+    def generate_yaml_files(self):
600
+
601
+        import GenerateOSSFiles
602
+
603
+        print("Generating yaml files for packages...")
604
+        check_prerequesite["generate-yaml-files"] = True
605
+        if not check_prerequesite["check-tools"]:
606
+            CheckTools.check_tools()
607
+        if not check_prerequesite["photon-stage"]:
608
+            BuildEnvironmentSetup.photon_stage()
609
+        if not check_prerequesite["packages"]:
610
+            rpmBuildTarget = RpmBuildTarget()
611
+            rpmBuildTarget.packages()
612
+        os.chdir(curDir + "/support/package-builder")
613
+        if "generate-pkg-list" in configdict["photon-build-param"] and configdict["photon-build-param"]["generate-pkg-list"]:
614
+            GenerateOSSFiles.buildPackagesList(os.path.join(Build_Config.stagePath, "packages_list.csv"))
615
+        else:
616
+            blackListPkgs = GenerateOSSFiles.readBlackListPackages(configdict.get("additional-path", {}).get("pkg-black-list-file", ""))
617
+            logger = Logger.getLogger("GenerateYamlFiles", constants.logPath, constants.logLevel)
618
+            GenerateOSSFiles.buildSourcesList(Build_Config.stagePath, blackListPkgs, logger)
619
+            GenerateOSSFiles.buildSRPMList(constants.sourceRpmPath, Build_Config.stagePath, blackListPkgs, constants.dist, logger)
620
+        os.chdir(curDir)
621
+
622
+# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
623
+# class CheckTools does the job of checking weather all the tools required for starting build process are present on the system  +
624
+#                                                                                                                                +
625
+# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
626
+
627
+class CheckTools:
628
+
629
+    global configdict
630
+    global check_prerequesite
631
+
632
+    def check_tools():
633
+        check_prerequesite["check-tools"] = True
634
+        CheckTools.check_bison()
635
+        CheckTools.check_gplusplus()
636
+        CheckTools.check_gawk()
637
+        CheckTools.check_repo_tool()
638
+        CheckTools.check_texinfo()
639
+        CheckTools.check_sanity()
640
+        CheckTools.check_docker()
641
+        CheckTools.check_pyopenssl()
642
+
643
+    def check_bison():
644
+        check_prerequesite["check-bison"]=True
645
+        if shutil.which("bison") is None:
646
+            raise Exception("bison not present")
647
+
648
+    def check_gplusplus():
649
+        check_prerequesite["check-gplusplus"]=True
650
+        if shutil.which('g++') is None:
651
+            raise Exception("g++ not present")
652
+
653
+    def check_gawk():
654
+        check_prerequesite["check-gawk"]=True
655
+        if shutil.which('gawk') is None:
656
+            raise Exception("gawk not present")
657
+
658
+    def check_repo_tool():
659
+        check_prerequesite["check-repotool"]=True
660
+        if shutil.which('createrepo') is None:
661
+            raise Exception("createrepo not present")
662
+
663
+    def check_texinfo():
664
+        check_prerequesite["check-texinfo"]=True
665
+        if shutil.which('makeinfo') is None:
666
+            raise Exception("texinfo not present")
667
+
668
+    def check_sanity():
669
+        check_prerequesite["check-sanity"]=True
670
+        if subprocess.Popen([curDir + "/support/sanity_check.sh"], shell=True).wait() != 0:
671
+            raise Exception("Not able to run script sanity_check.sh")
672
+
673
+    def check_docker():
674
+        check_prerequesite["check-docker"]=True
675
+        if not glob.glob(Build_Config.dockerEnv) and shutil.which('docker') is None:
676
+            raise Exception("docker not present")
677
+
678
+    def check_docker_service():
679
+        check_prerequesite["check-docker-service"]=True
680
+        if not glob.glob(Build_Config.dockerEnv) and subprocess.Popen(["docker ps >/dev/null 2>&1"], shell=True).wait() != 0:
681
+            raise Exception("Docker service is not running. Aborting.")
682
+
683
+    def check_docker_py():
684
+        check_prerequesite["check-docker-py"]=True
685
+        if not glob.glob(Build_Config.dockerEnv) and docker.__version__ < "2.3.0":
686
+            raise Exception("Error: Python3 package docker-py3 2.3.0 not installed.\nPlease use: pip3 install docker==2.3.0")
687
+
688
+    def check_pyopenssl():
689
+        check_prerequesite["check-pyopenssl"]=True
690
+        try:
691
+            import OpenSSL
692
+        except Exception as e:
693
+            raise Exception(e)
694
+
695
+    def check_spec_files():
696
+        check_prerequesite["check-spec-files"]=True
697
+        print()
698
+        if "base-commit" in configdict["photon-build-param"]:
699
+            command = ["./tools/scripts/check_spec_files.sh", str(configdict["photon-build-param"].get("base-commit"))]
700
+        else:
701
+            command = ["./tools/scripts/check_spec_files.sh"]
702
+        if subprocess.Popen(command, shell=True).wait() != 0:
703
+            raise Exception("spec file check failed")
704
+
705
+    def check_kpartx():
706
+        check_prerequesite["check-kpartx"]=True
707
+        if shutil.which('kpartx') is None:
708
+            raise Exception("Package kpartx not installed. Aborting.")
709
+
710
+    def start_docker():
711
+        check_prerequesite["start-docker"]=True
712
+        CheckTools.check_docker()
713
+        if subprocess.Popen(["systemctl start docker"], shell=True).wait() != 0:
714
+            raise Exception("Not able to start docker")
715
+
716
+    def install_photon_docker_image():
717
+        if not check_prerequesite["photon-docker-image"]:
718
+            BuildImage.photon_docker_image()
719
+        if subprocess.Popen("sudo docker build -t photon:tdnf .").wait() != 0:
720
+            raise Exception("Not able to install photon docker image")
721
+
722
+# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
723
+# class BuildImage does the job of building all the images like iso, rpi3, ami, gce, azure, ova...                              +
724
+# It uses class ImageBuilder to build different images.                                                                         +
725
+# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
726
+
727
+class BuildImage:
728
+
729
+    global configdict
730
+    global check_prerequesite
731
+
732
+    def __init__(self, imgName):
733
+        self.src_root = configdict["photon-path"]
734
+        self.installer_path = Build_Config.installerPath
735
+        self.generated_data_path = Build_Config.dataDir
736
+        self.stage_path = Build_Config.stagePath
737
+        self.log_path = constants.logPath
738
+        self.log_level = constants.logLevel
739
+        self.config_file = configdict["additional-path"]["conf-file"]
740
+        self.img_name = imgName
741
+        self.rpm_path = constants.rpmPath
742
+        self.srpm_path = constants.sourceRpmPath
743
+        self.pkg_to_rpm_map_file = os.path.join(Build_Config.stagePath, "pkg_info.json")
744
+
745
+    def set_Iso_Parameters(self, imgName):
746
+        self.generated_data_path = Build_Config.stagePath + "/common/data"
747
+        self.src_iso_path = None
748
+        if imgName == "iso":
749
+            self.iso_path = os.path.join(Build_Config.stagePath, "photon-"+constants.releaseVersion+"-"+constants.buildNumber+".iso")
750
+            self.debug_iso_path = self.iso_path.rpartition(".")[0]+".debug.iso"
751
+
752
+        if imgName == "minimal-iso":
753
+            self.iso_path = os.path.join(Build_Config.stagePath, "photon-minimal-"+constants.releaseVersion+"-"+constants.buildNumber+".iso")
754
+            self.debug_iso_path = self.iso_path.rpartition(".")[0]+".debug.iso"
755
+            self.package_list_file = os.path.join(Build_Config.dataDir, "build_install_options_minimal.json")
756
+            self.pkg_to_be_copied_conf_file = os.path.join(Build_Config.generatedDataPath, "build_install_options_minimal.json")
757
+        elif imgName == "rt-iso":
758
+            self.iso_path = os.path.join(Build_Config.stagePath, "photon-rt-"+constants.releaseVersion+"-"+constants.buildNumber+".iso")
759
+            self.debug_iso_path = self.iso_path.rpartition(".")[0]+".debug.iso"
760
+            self.package_list_file = os.path.join(Build_Config.dataDir, "build_install_options_rt.json")
761
+            self.pkg_to_be_copied_conf_file = os.path.join(Build_Config.generatedDataPath, "build_install_options_rt.json")
762
+
763
+        else:
764
+            self.pkg_to_be_copied_conf_file = Build_Config.pkgToBeCopiedConfFile
765
+            self.package_list_file = Build_Config.packageListFile
766
+
767
+        if imgName == "src-iso":
768
+            self.iso_path = None
769
+            self.debug_iso_path = None
770
+            self.src_iso_path = os.path.join(Build_Config.stagePath, "photon-"+constants.releaseVersion+"-"+constants.buildNumber+".src.iso")
771
+
772
+
773
+    def build_iso(self):
774
+
775
+        import imagebuilder
776
+
777
+        rpmBuildTarget = RpmBuildTarget()
778
+        if not check_prerequesite["check-tools"]:
779
+            CheckTools.check_tools()
780
+        if not check_prerequesite["photon-stage"]:
781
+            BuildEnvironmentSetup.photon_stage()
782
+        if self.img_name == "iso" and not check_prerequesite["packages"]:
783
+            rpmBuildTarget.packages()
784
+        elif self.img_name == "rt-iso":
785
+            rpmBuildTarget.packages_rt()
786
+        else:
787
+            rpmBuildTarget.packages_minimal()
788
+        if self.img_name == "rt-iso" or "minimal-iso" and not check_prerequesite["packages-initrd"]:
789
+            rpmBuildTarget.packages_initrd()
790
+        if not check_prerequesite["create-repo"]:
791
+            RpmBuildTarget.create_repo()
792
+        if self.img_name != "minimal-iso" and not check_prerequesite["ostree-repo"]:
793
+            RpmBuildTarget.ostree_repo()
794
+        self.generated_data_path = Build_Config.generatedDataPath
795
+        print("Building Full ISO...")
796
+        os.chdir(str(PurePath(curDir, "support", "image-builder")))
797
+        imagebuilder.createIso(self)
798
+        os.chdir(curDir)
799
+
800
+    def build_image(self):
801
+
802
+        import imagebuilder
803
+
804
+        if not check_prerequesite["check-kpartx"]:
805
+            CheckTools.check_kpartx()
806
+        if not check_prerequesite["photon-stage"]:
807
+            BuildEnvironmentSetup.photon_stage()
808
+        if not check_prerequesite["vixdiskutil"]:
809
+            vixdiskutil()
810
+        rpmBuildTarget = None
811
+        if not check_prerequesite["packages"]:
812
+            rpmBuildTarget = RpmBuildTarget()
813
+            rpmBuildTarget.packages()
814
+        if not check_prerequesite["ostree-repo"]:
815
+            RpmBuildTarget.ostree_repo()
816
+        print("Building image " + self.img_name)
817
+        os.chdir(str(PurePath(curDir, "support", "image-builder")))
818
+        imagebuilder.createImage(self)
819
+        os.chdir(curDir)
820
+
821
+    @staticmethod
822
+    def photon_docker_image():
823
+        if not check_prerequesite["create-repo"]:
824
+            RpmBuildTarget.create_repo()
825
+        if subprocess.Popen(["cd " + configdict["photon-path"] + ";sudo docker build --no-cache --tag photon-build " + curDir + "/support/dockerfiles/photon && sudo docker run --rm --privileged --net=host -e PHOTON_BUILD_NUMBER="+constants.buildNumber + " -e PHOTON_RELEASE_VERSION="+constants.releaseVersion + " -v "+curDir+":/workspace -v "+Build_Config.stagePath+":/workspace/stage photon-build ./support/dockerfiles/photon/make-docker-image.sh tdnf"], shell=True).wait() != 0:
826
+            raise Exception("Not able to run photon-docker-image")
827
+
828
+    def k8s_docker_images(self):
829
+        if not check_prerequesite["start-docker"]:
830
+            CheckTools.start_docker()
831
+        if not check_prerequesite["photon-docker-image"]:
832
+            BuildImage.photon_docker_image()
833
+        if not os.path.isdir(os.path.join(Build_Config.stagePath, "docker_images")):
834
+            os.mkdir(os.path.join(Build_Config.stagePath, "docker_images"))
835
+        os.chdir(os.path.join(curDir, 'support/dockerfiles/k8s-docker-images'))
836
+        if subprocess.Popen(['./build-k8s-base-image.sh', constants.releaseVersion, constants.buildNumber, Build_Config.stagePath]).wait() == 0 and \
837
+        subprocess.Popen(['./build-k8s-docker-images.sh', configdict["photon-build-param"]["photon-dist-tag"], constants.releaseVersion, constants.specPath, Build_Config.stagePath]).wait() == 0 and \
838
+        subprocess.Popen(['./build-k8s-metrics-server-image.sh', configdict["photon-build-param"]["photon-dist-tag"], constants.releaseVersion, constants.specPath, Build_Config.stagePath]).wait() ==0 and \
839
+        subprocess.Popen(['./build-k8s-coredns-image.sh', configdict["photon-build-param"]["photon-dist-tag"], constants.releaseVersion, constants.specPath, Build_Config.stagePath]).wait() == 0 and \
840
+        subprocess.Popen(['./build-k8s-dns-docker-images.sh', configdict["photon-build-param"]["photon-dist-tag"], constants.releaseVersion, constants.specPath, Build_Config.stagePath]).wait() == 0 and \
841
+        subprocess.Popen(['./build-k8s-dashboard-docker-images.sh', configdict["photon-build-param"]["photon-dist-tag"], constants.releaseVersion, constants.specPath, Build_Config.stagePath]).wait() == 0 and \
842
+        subprocess.Popen(['./build-flannel-docker-image.sh', configdict["photon-build-param"]["photon-dist-tag"], constants.releaseVersion, constants.specPath, Build_Config.stagePath]).wait() == 0 and \
843
+        subprocess.Popen(['./build-calico-docker-images.sh', configdict["photon-build-param"]["photon-dist-tag"], constants.releaseVersion, constants.specPath, Build_Config.stagePath]).wait() == 0 and \
844
+        subprocess.Popen(['./build-k8s-heapster-image.sh', configdict["photon-build-param"]["photon-dist-tag"], constants.releaseVersion, constants.specPath, Build_Config.stagePath]).wait() == 0 and \
845
+        subprocess.Popen(['./build-k8s-nginx-ingress.sh', configdict["photon-build-param"]["photon-dist-tag"], constants.releaseVersion, constants.specPath, Build_Config.stagePath]).wait() == 0 and \
846
+        subprocess.Popen(['./build-wavefront-proxy-docker-image.sh', configdict["photon-build-param"]["photon-dist-tag"], constants.releaseVersion, constants.specPath, Build_Config.stagePath]).wait() == 0:
847
+            print("Successfully built all the docker images")
848
+
849
+        else:
850
+            raise Exception("k8s-docker-images build failed")
851
+        os.chdir(curDir)
852
+
853
+    def all_images(self):
854
+        images = ["ami", "gce", "azure", "ova_uefi", "ova" ]
855
+        for img in images:
856
+           self.img_name = img
857
+           self.build_image()
858
+
859
+    def all(self):
860
+        images = ["iso", "photon-docker-image", "k8s-docker-images", "all-images", "src-iso", "minimal-iso"]
861
+        for img in images:
862
+            self.img_name = img
863
+            self.set_Iso_Parameters(img)
864
+            if img in ["iso", "src-iso"]:
865
+                self.build_iso()
866
+            else:
867
+                configdict["targetName"] = img.replace('-', '_')
868
+                getattr(self, configdict["targetName"])()
869
+
870
+# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
871
+# initialize_constants initialize all the paths like stage Path, spec path, rpm path, and other parameters           +
872
+# used by package-builder and imagebuilder...                                                                        +
873
+# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
874
+
875
+def initialize_constants():
876
+
877
+    global configdict
878
+    global check_prerequesite
879
+    check_prerequesite["initialize-constants"]=True
880
+
881
+    Build_Config.setStagePath(os.path.join(str(PurePath(configdict["photon-path"], configdict["stage-path"])), "stage"))
882
+    constants.setSpecPath(os.path.join(str(PurePath(configdict["photon-path"], configdict["spec-path"])), "SPECS"))
883
+    Build_Config.setBuildThreads(configdict["photon-build-param"]["threads"])
884
+    Build_Config.setPkgBuildType(configdict["photon-build-param"]["photon-build-type"])
885
+    Build_Config.setPkgJsonInput(configdict.get("additional-path", {}).get("pkg-json-input", None))
886
+    constants.setLogPath(os.path.join(Build_Config.stagePath ,"LOGS"))
887
+    constants.setLogLevel(configdict["photon-build-param"]["loglevel"])
888
+    constants.setDist(configdict["photon-build-param"]["photon-dist-tag"])
889
+    constants.setBuildNumber(configdict["photon-build-param"]["input-photon-build-number"])
890
+    constants.setReleaseVersion(configdict["photon-build-param"]["photon-release-version"])
891
+    constants.setPullSourcesURL(Builder.get_baseurl(configdict["pull-sources-config"]))
892
+    constants.setRPMCheck(configdict["photon-build-param"].get("rpm-check-flag", False))
893
+    constants.setRpmCheckStopOnError(configdict["photon-build-param"].get("rpm-check-stop-on-error", False))
894
+    constants.setPublishBuildDependencies(configdict["photon-build-param"].get("publish-build-dependencies", False))
895
+    constants.setRpmPath(os.path.join(Build_Config.stagePath ,"RPMS"))
896
+    Build_Config.setRpmNoArchPath()
897
+    Build_Config.setRpmArchPath()
898
+    constants.setSourceRpmPath(os.path.join(Build_Config.stagePath ,"SRPMS"))
899
+    Build_Config.setUpdatedRpmPath(os.path.join(Build_Config.stagePath ,"UPDATED_RPMS"))
900
+    constants.setSourcePath(os.path.join(Build_Config.stagePath ,"SOURCES"))
901
+    constants.setPrevPublishRPMRepo(os.path.join(Build_Config.stagePath , "PUBLISHRPMS"))
902
+    constants.setPrevPublishXRPMRepo(os.path.join(Build_Config.stagePath , "PUBLISHXRPMS"))
903
+    Build_Config.setInstallerPath(os.path.join(configdict["photon-path"], "installer"))
904
+    Build_Config.setPkgInfoFile(os.path.join(Build_Config.stagePath ,"pkg_info.json"))
905
+    constants.setBuildRootPath(os.path.join(Build_Config.stagePath ,"photonroot"))
906
+    Build_Config.setGeneratedDataDir(os.path.join(Build_Config.stagePath ,"common/data"))
907
+    constants.setTopDirPath("/usr/src/photon")
908
+    Build_Config.setCommonDir(os.path.join(curDir ,"common"))
909
+    Build_Config.setDataDir(os.path.join(curDir, "common/data"))
910
+    constants.setInputRPMSPath(configdict.get("input-rpms-path", os.path.join(curDir,"inputRPMS")))
911
+    Build_Config.setPullPublishRPMSDir(os.path.join(curDir, "support/pullpublishrpms"))
912
+    Build_Config.setPullPublishRPMS(os.path.join(Build_Config.pullPublishRPMSDir ,"pullpublishrpms.sh"))
913
+    Build_Config.setPullPublishXRPMS(os.path.join(Build_Config.pullPublishRPMSDir ,"pullpublishXrpms.sh"))
914
+    constants.setPackageWeightsPath(os.path.join(Build_Config.dataDir ,"packageWeights.json"))
915
+    constants.setKatBuild(configdict["photon-build-param"].get("kat-build", False))
916
+    Build_Config.setConfFile(configdict["additional-path"]["conf-file"])
917
+    Build_Config.setPkgToBeCopiedConfFile(configdict.get("additional-path", {}).get("pkg-to-be-copied-conf-file"))
918
+    Build_Config.setDistributedBuildFile(configdict.get("additional-path", {}).get("distributed-build-option-file", PurePath(curDir, "common", "data", "distributed_build_options.json")))
919
+    Builder.get_packages_with_build_options(configdict['photon-build-param']['pkg-build-options'])
920
+    Build_Config.setCommonDir(PurePath(curDir, "common", "data"))
921
+    constants.setStartSchedulerServer(configdict["photon-build-param"]['start-scheduler-server'])
922
+    constants.initialize()
923
+
924
+
925
+def set_default_value_of_config():
926
+
927
+    global configdict
928
+
929
+    configdict["pull-sources-config"] = os.path.join(curDir , "support/package-builder/bintray.conf")
930
+    configdict.setdefault("additional-path", {}).setdefault("photon-cache-path", None)
931
+    configdict["photon-build-param"]["input-photon-build-number"]=subprocess.check_output(["git rev-parse --short HEAD"], shell=True).decode('ASCII').rstrip()
932
+    configdict.setdefault('additional-path', {}).setdefault('photon-sources-path', None)
933
+    configdict.setdefault('additional-path', {}).setdefault('photon-publish-rpms-path', None)
934
+    configdict.setdefault('additional-path', {}).setdefault('photon-publish-x-rpms-path', None)
935
+    configdict['photon-build-param']['pkg-build-options'] = curDir + "/common/data/" + configdict['photon-build-param']['pkg-build-options']
936
+    configdict.setdefault("additional-path", {}).setdefault("conf-file", None)
937
+    configdict.setdefault("photon-build-param", {}).setdefault("start-scheduler-server", False)
938
+
939
+
940
+def main():
941
+
942
+    parser = ArgumentParser()
943
+
944
+    parser.add_argument("-b", "--branch", dest="photonBranch", default=None)
945
+    parser.add_argument("-c", "--config", dest="configPath", default=None)
946
+    parser.add_argument("-t", "--target", dest="targetName", default=None)
947
+
948
+    options = parser.parse_args()
949
+
950
+    if options.photonBranch is None and options.configPath is None:
951
+        raise Exception("Either specify branchName or configpath...")
952
+
953
+    if options.photonBranch is not None and not os.path.isdir(os.path.join(curDir ,"photon-" + options.photonBranch)):
954
+        CommandUtils.runCommandInShell("git clone https://github.com/vmware/photon.git -b " + options.photonBranch + " photon-" + options.photonBranch)
955
+    elif options.photonBranch is not None:
956
+        print("Using already cloned repository...")
957
+
958
+    if options.configPath is None:
959
+        options.configPath = str(PurePath(curDir, "photon-" + options.photonBranch, "config.json"))
960
+
961
+    global configdict
962
+    global check_prerequesite
963
+
964
+    with open(options.configPath) as jsonData:
965
+        configdict = json.load(jsonData)
966
+
967
+    options.configPath = os.path.abspath(options.configPath)
968
+
969
+    set_default_value_of_config()
970
+
971
+    os.environ['PHOTON_RELEASE_VER']=configdict["photon-build-param"]["photon-release-version"]
972
+    os.environ['PHOTON_BUILD_NUM']=configdict["photon-build-param"]["input-photon-build-number"]
973
+
974
+
975
+    if configdict["photon-path"] == "":
976
+        configdict["photon-path"] = os.path.dirname(options.configPath)
977
+
978
+    if 'INPUT_PHOTON_BUILD_NUMBER' in os.environ:
979
+        configdict["photon-build-param"]["input-photon-build-number"]=os.environ['IMPUT_PHOTON_BUILD_NUMBER']
980
+
981
+    if 'THREADS' in os.environ:
982
+        configdict["photon-build-param"]["threads"] = int(os.environ['THREADS'])
983
+
984
+    if 'LOGLEVEL' in os.environ:
985
+        configdict["photon-build-param"]["loglevel"] = os.environ["LOGLEVEL"]
986
+
987
+    if 'PHOTON_PULLSOURCES_CONFIG' in os.environ:
988
+        configdict['pull-sources-config'] = os.environ['PHOTON_PULLSOURCES_CONFIG']
989
+
990
+    if 'PHOTON_CACHE_PATH' in os.environ:
991
+        configdict.setdefault("additional-path", {}).setdefault("photon-cache-path", os.environ['PHOTON_CACHE_PATH'])
992
+    if 'PHOTON_SOURCES_PATH' in os.environ:
993
+        configdict.setdefault('additional-path', {}).setdefault('photon-sources-path', os.environ["PHOTON_SOURCES_PATH"])
994
+
995
+    if 'PHOTON_PUBLISH_RPMS_PATH' in os.environ:
996
+        configdict.setdefault('additional-path', {}).setdefault('photon-publish-rpms-path', os.environ['PHOTON_PUBLISH_RPMS_PATH'])
997
+
998
+    if 'PHOTON_PUBLISH_XRPMS_PATH' in os.environ:
999
+        configdict.setdefault('additional-path', {}).setdefault('photon-publish-x-rpms-path', os.environ['PHOTON_PUBLISH_XRPMS_PATH'])
1000
+
1001
+    if "PHOTON_PKG_BLACKLIST_FILE" in os.environ:
1002
+        configdict["additional-path"]["pkg-black-list-file"] = os.environ["PHOTON_PKG_BLACKLIST_FILE"]
1003
+
1004
+    if "DISTRIBUTED_BUILD_CONFIG" in os.environ:
1005
+        configdict["additional-path"]["distributed-build-option-file"] = os.environ["DISTRIBUTED_BUILD_CONFIG"]
1006
+    if 'RPMCHECK' in os.environ:
1007
+        if os.environ['RPMCHECK']=="enable":
1008
+            configdict['photon-build-param']['rpm-check-flag'] = True
1009
+        elif os.environ['RPMCHECK']=="enable_stop_on_error":
1010
+            configdict['photon-build-param']["rpm-check-stop-on-error"] = True
1011
+
1012
+    if 'KAT_BUILD' in os.environ and os.environ['KAT_BUILD'] == "enable":
1013
+        configdict['photon-build-param']['kat-build'] = True
1014
+
1015
+    if 'BUILDDEPS' in os.environ and os.environ['BUILDDEPS']=="True":
1016
+        configdict['photon-build-param']['publish-build-dependencies'] = True
1017
+
1018
+    if 'PKG_BUILD_OPTIONS' in os.environ:
1019
+        configdict['photon-build-param']['pkg-build-options'] = os.environ['PKG_BUILD_OPTIONS']
1020
+
1021
+    if 'CROSS_TARGET' in os.environ:
1022
+        configdict['photon-build-param']['tarsetdefaultArch'] = os.environ['CROSS_TARGET']
1023
+
1024
+    if 'CONFIG' in os.environ:
1025
+        configdict['additional-path']['conf-file'] = os.path.abspath(os.environ['CONFIG'])
1026
+        jsonData = Utils.jsonread(os.environ['CONFIG'])
1027
+        options.targetName = jsonData['image_type']
1028
+
1029
+    if 'IMG_NAME' in os.environ:
1030
+        options.targetName = os.environ['IMG_NAME']
1031
+
1032
+    if 'SCHEDULER_SERVER' in os.environ and os.environ['SCHEDULER_SERVER'] == "enable":
1033
+        configdict['photon-build-param']['start-scheduler-server'] = True
1034
+
1035
+    if 'DOCKER_ENV' in os.environ:
1036
+        Build_Config.setDockerEnv(os.environ['DOCKER_ENV'])
1037
+
1038
+
1039
+    initialize_constants()
1040
+
1041
+    configdict["packageName"]=None
1042
+
1043
+    for target in targetList:
1044
+        for item in targetList[target]:
1045
+            check_prerequesite[item]=False
1046
+
1047
+    if options.targetName is None:
1048
+        options.targetName = configdict["photon-build-param"]["target"]
1049
+
1050
+    configdict["targetName"] = options.targetName.replace('-', '_')
1051
+
1052
+    try:
1053
+        if options.targetName in targetList["image"]:
1054
+            buildImage = BuildImage(options.targetName)
1055
+            if options.targetName in ["iso", "src-iso", "minimal-iso", "rt-iso"]:
1056
+                buildImage.set_Iso_Parameters(options.targetName)
1057
+                buildImage.build_iso()
1058
+            elif options.targetName in ["ami", "gce", "ova", "ova_uefi", "rpi3", "azure"]:
1059
+                buildImage.build_image()
1060
+            else:
1061
+                attr = getattr(buildImage, configdict["targetName"])
1062
+                attr()
1063
+        elif options.targetName in targetList["rpmBuild"]:
1064
+            attr = None
1065
+            if options.targetName != "distributed-build":
1066
+                rpmBuildTarget = RpmBuildTarget()
1067
+                attr = getattr(rpmBuildTarget, configdict["targetName"])
1068
+            else:
1069
+                attr = getattr(RpmBuildTarget, configdict["targetName"])
1070
+            attr()
1071
+        elif options.targetName in targetList["buildEnvironment"]:
1072
+            attr = getattr(BuildEnvironmentSetup, configdict["targetName"])
1073
+            attr()
1074
+        elif options.targetName in targetList["cleanup"]:
1075
+            attr = getattr(CleanUp, configdict["targetName"])
1076
+            attr()
1077
+        elif options.targetName in targetList["tool-checkup"]:
1078
+            if options.targetName == "check-g++":
1079
+                CheckTools.check_gplusplus()
1080
+            else:
1081
+                attr = getattr(CheckTools, configdict["targetName"])
1082
+                attr()
1083
+        elif options.targetName in targetList["utilities"]:
1084
+            utility = Utilities()
1085
+            attr = getattr(utility, configdict["targetName"])
1086
+            attr()
1087
+        else:
1088
+            rpmBuildTarget = RpmBuildTarget()
1089
+            rpmBuildTarget.package(options.targetName)
1090
+    except Exception as e:
1091
+        print(e)
1092
+        traceback.print_exc()
1093
+        sys.exit(1)
1094
+    sys.exit(0)
1095
+
1096
+
1097
+if __name__ == "__main__":
1098
+    main()
0 1099
new file mode 100644
... ...
@@ -0,0 +1,15 @@
0
+{
1
+    "photon-build-param" : {
2
+            "photon-build-type" : "chroot",
3
+            "photon-dist-tag" : ".ph3",
4
+            "photon-release-version" : "3.0",
5
+            "threads" : 1,
6
+            "loglevel" : "info",
7
+            "full-package-list-file" : "build_install_options_all.json",
8
+            "pkg-build-options" : "pkg_build_options.json",
9
+            "target": "iso"
10
+    },
11
+    "photon-path" : "",
12
+    "stage-path" : "" ,
13
+    "spec-path" : ""
14
+}
0 15
new file mode 100644
... ...
@@ -0,0 +1,163 @@
0
+Build config file is a json format with possible parameters:
1
+
2
+
3
+"photon-build-param" :
4
+
5
+  "photon-build-type":
6
+        Default value: "chroot"
7
+        values: ["chroot", "container"]
8
+        Example: { "photon-build-param": { "photon-build-type" : "chroot" } }
9
+
10
+  "photon-dist-tag":
11
+        Default value: ".ph3"
12
+        values: [".ph3"]
13
+        Example: { "photon-build-param": { "photon-dist-tag" : ".ph3" }
14
+
15
+  "photon-build-no":
16
+	    Default value: "0000000"
17
+        Example: { "photon-build-param": { "photon-build-no" : "1234567" }
18
+
19
+  "photon-release-version":
20
+        Default value: "3.0"
21
+        Example: { "photon-build-param": { "photon-release-version" : "3.0" } }
22
+
23
+  "photon-repo-tool":
24
+        Default value: "createrepo"
25
+        Example: { "photon-build-param": { "photon-repo-tool" : "createrepo" } }
26
+
27
+  "threads":
28
+        Default value: 1
29
+        values: [1,2,3...]
30
+        Example: { "photon-build-param": { "threads" : 32 } }
31
+
32
+  "loglevel":
33
+        Default value: "info"
34
+        values: ["info", "debug"]
35
+        Example: { "photon-build-param": { "loglevel" : "info" } }
36
+
37
+  "full-package-list-file":
38
+        Default value: "build_install_options_all.json"
39
+        Example: { "photon-build-param": { "full-package-list-file" : "build_install_options_all.json" } }
40
+
41
+  "rpm-check-flag":
42
+        Default value: false
43
+        values: [true, false]
44
+        Example: { "photon-build-param": { "rpm-check-flag" : false } }
45
+
46
+  "rpm-check-stop-on-error":
47
+        Default value: false
48
+        values: [true, false]
49
+        Example: { "photon-build-param": { "rpm-check-stop-on-error" : false } }
50
+
51
+  "publish-build-dependencies":
52
+        Default value: false
53
+        values: [true, false]
54
+        Example: { "photon-build-param": { "publish-build-dependencies" : false } }
55
+
56
+  "generate-pkg-list":
57
+        Default value: false
58
+        values: [true, false]
59
+        Example: { "photon-build-param": { "generate-pkg-list" : false } }
60
+
61
+  "kat-build":
62
+        Default value: null
63
+        Example: { "photon-build-param": { "kat-build" : null } }
64
+
65
+  "pkg-build-options":
66
+        Default value: "pkg_build_options.json"
67
+        Example: { "photon-build-param": { "pkg-build-options" : "pkg_build_options.json" } }
68
+
69
+  "base-commit":
70
+        Default value: null
71
+        Example: { "photon-build-param": { "base-commit" : [commit-id] } }
72
+
73
+  "target-arch":
74
+        Default value: null
75
+        values: ["aarch64", "x86_64"]
76
+        Example: { "photon-build-param": { "target-arch" : "aarch64" } }
77
+
78
+  "target":
79
+        Default value: [Makefile targets]
80
+        Example: { "photon-build-param": { "target" : "iso" } }
81
+
82
+"input-rpms-path":
83
+        Default: [src-root]/inputRPMS
84
+        Example: { "input-rpms-path": [input RPMS path] }
85
+
86
+"photon-path":
87
+        Default: [takes the config path as cloned repo path]
88
+        Example: { "photon-path": [cloned repo path containing SPECS dir] }
89
+
90
+
91
+"stage-path":
92
+        Default: [takes the parent directory of config path as parent for stage directory]
93
+        Example: { "stage-path": [path where binaries will be created] }
94
+
95
+
96
+"spec-path":
97
+        Default: [takes the photon path for spec path]
98
+        Example: { "spec-path": [path uptil parent directory of SPECS directory] }
99
+
100
+
101
+"additional-path":
102
+
103
+  "conf-file":
104
+        Default value: null
105
+        values: [path of config file for building images like ova, ami, gce, azure]
106
+        Example: { "additional-path" : { "conf-file" : [conf-file-path] } }
107
+
108
+  "pkg-to-be-copied-conf-file":
109
+        Default value: null
110
+        value: contains location of the file that contains packages to be copied for the image
111
+        Example: { "additional-path" : { "pkg-to-be-copied-conf-file" : null } }
112
+
113
+  "pkg-json-input":
114
+        Default value: null
115
+        Example: { "additional-path" : { "pkg-json-input" : null } }
116
+
117
+  "photon-cache-path":
118
+        Default value: null
119
+        Example: { "additional-path" : { "photon-cache-path" : null } }
120
+
121
+  "photon-sources-path":
122
+        Default value: null
123
+        Example: { "additional-path" : { "photon-sources-path" : null } }
124
+
125
+  "photon-publish-rpms-path":
126
+        Default value: null
127
+        Example: { "additional-path" : { "photon-publish-rpms-path" : null } }
128
+
129
+  "photon-publish-x-rpms-path":
130
+        Default value: null
131
+        Example: { "additional-path" : { "photon-publish-x-rpms-path" : null } }
132
+
133
+  "pkg-black-list-file":
134
+        Default value: null
135
+        Example: { "additional-path" : { "pkg-black-list-file" : null } }
136
+
137
+
138
+"utility":
139
+
140
+  "pkg":
141
+        Default value: null
142
+        Example: { "utility" : { "pkg" : null } }
143
+
144
+  "input-type":
145
+        Default value: "json"
146
+        values: ["json", "pkg", "remove-upward-deps", "print-upward-deps", "who-needs"]
147
+        Example: { "utility" : { "input-type" : "json" } }
148
+
149
+  "file":
150
+        Default value: "packages_*.json"
151
+        values: ["packages_*.json", "packages_$(img).json"]
152
+        Example: { "utility" : { "file" : "packages_*.json" } }
153
+
154
+  "display-option":
155
+        Default value: "json"
156
+        values: ["json", "list", "tree"]
157
+        Example: { "utility" : { "display-option" : "json" } }
158
+
159
+  "img":
160
+        Default value: null
161
+        values: ["ova", "gce", "ami", "azure"]
162
+        Example: { "utility" : { "img" : null } }
... ...
@@ -13,9 +13,9 @@ for file in ${SPEC_DIR}/kubernetes/kubernetes-*.spec; do
13 13
     K8S_VER=`cat ${file} | grep "^Version:" | cut -d: -f2 | tr -d ' '`
14 14
     K8S_VER_REL=${K8S_VER}-`cat ${file} | grep "^Release:" | cut -d: -f2 | tr -d ' ' | cut -d% -f1`
15 15
     K8S_RPM=kubernetes-${K8S_VER_REL}${DIST_TAG}.${ARCH}.rpm
16
-    K8S_RPM_FILE=../../../stage/RPMS/x86_64/${K8S_RPM}
16
+    K8S_RPM_FILE=${STAGE_DIR}/RPMS/x86_64/${K8S_RPM}
17 17
     K8S_PAUSE_RPM=kubernetes-pause-${K8S_VER_REL}${DIST_TAG}.${ARCH}.rpm
18
-    K8S_PAUSE_RPM_FILE=../../../stage/RPMS/x86_64/${K8S_PAUSE_RPM}
18
+    K8S_PAUSE_RPM_FILE=${STAGE_DIR}/RPMS/x86_64/${K8S_PAUSE_RPM}
19 19
 
20 20
     if [ ! -f ${K8S_RPM_FILE} ]
21 21
     then
... ...
@@ -10,6 +10,7 @@ fi
10 10
 
11 11
 PROGRAM=$0
12 12
 SRCROOT=$1
13
+STAGE_DIR=$2
13 14
 DOCK_ARCH=`uname -m`
14 15
 
15 16
 cat > ${SRCROOT}/support/image-builder/ostree-tools/mk-ostree-server.sh << EOF
... ...
@@ -27,20 +28,20 @@ chmod +x ${SRCROOT}/support/image-builder/ostree-tools/mk-ostree-server.sh
27 27
 cp ${SRCROOT}/support/image-builder/ostree-tools/photon-ostree.repo ${SRCROOT}/support/image-builder/ostree-tools/photon-ostree.repo.bak
28 28
 echo "baseurl=file:///RPMS" >> ${SRCROOT}/support/image-builder/ostree-tools/photon-ostree.repo
29 29
 
30
-rm -rf stage/ostree-repo
31
-mkdir -p stage/ostree-repo
30
+rm -rf ${STAGE_DIR}/ostree-repo
31
+mkdir -p ${STAGE_DIR}/ostree-repo
32 32
 
33 33
 if [ $DOCK_ARCH == "x86_64" ]
34 34
 then
35
-  sudo docker run --privileged -v ${SRCROOT}:/photon -v $(pwd)/stage/RPMS:/RPMS -v $(pwd)/stage/ostree-repo:/srv/rpm-ostree -w="/photon/support/image-builder/ostree-tools/" vmware/photon-build:rpm-ostree-3.0 ./mk-ostree-server.sh /
35
+ sudo docker run --privileged -v ${SRCROOT}:/photon -v ${STAGE_DIR}/RPMS:/RPMS -v ${STAGE_DIR}/ostree-repo:/srv/rpm-ostree -w="/photon/support/image-builder/ostree-tools/" vmware/photon-build:rpm-ostree-3.0 ./mk-ostree-server.sh /
36 36
 elif [ $DOCK_ARCH == "aarch64" ]
37 37
 then
38
-  sudo docker run --privileged -v ${SRCROOT}:/photon -v $(pwd)/stage/RPMS:/RPMS -v $(pwd)/stage/ostree-repo:/srv/rpm-ostree -w="/photon/support/image-builder/ostree-tools/" vmware/photon-build:rpm-ostree-aarch64-3.0 ./mk-ostree-server.sh /
38
+  sudo docker run --privileged -v ${SRCROOT}:/photon -v ${STAGE_DIR}/RPMS:/RPMS -v ${STAGE_DIR}/ostree-repo:/srv/rpm-ostree -w="/photon/support/image-builder/ostree-tools/" vmware/photon-build:rpm-ostree-aarch64-3.0 ./mk-ostree-server.sh /
39 39
 fi
40 40
 
41
-(cd stage/ostree-repo/repo/; tar -zcf ../../ostree-repo.tar.gz .; )
41
+(cd ${STAGE_DIR}/ostree-repo/repo/; tar -zcf ../../ostree-repo.tar.gz .; )
42 42
 
43 43
 # Restore file
44 44
 mv -f ${SRCROOT}/support/image-builder/ostree-tools/photon-ostree.repo.bak ${SRCROOT}/support/image-builder/ostree-tools/photon-ostree.repo
45 45
 sudo rm ${SRCROOT}/support/image-builder/ostree-tools/mk-ostree-server.sh
46
-sudo rm -rf ${SRCROOT}/stage/ostree-repo
46
+sudo rm -rf ${STAGE_DIR}/ostree-repo
... ...
@@ -14,260 +14,59 @@ from PackageManager import PackageManager
14 14
 from SpecData import SPECS
15 15
 from PackageInfo import PackageInfo
16 16
 
17
-def main():
18
-    parser = ArgumentParser()
19
-    parser.add_argument("-s", "--spec-path", dest="specPath", default="../../SPECS")
20
-    parser.add_argument("-x", "--source-path", dest="sourcePath",
21
-                        default="../../stage/SOURCES")
22
-    parser.add_argument("-r", "--rpm-path", dest="rpmPath",
23
-                        default="../../stage/RPMS")
24
-    parser.add_argument("-i", "--install-package", dest="installPackage",
25
-                        default=False, action="store_true")
26
-    parser.add_argument("-p", "--publish-RPMS-path", dest="publishRPMSPath",
27
-                        default="../../stage/PUBLISHRPMS")
28
-    parser.add_argument("-e", "--publish-XRPMS-path", dest="publishXRPMSPath",
29
-                        default="../../stage/PUBLISHXRPMS")
30
-    parser.add_argument("-l", "--log-path", dest="logPath", default="../../stage/LOGS")
31
-    parser.add_argument("-y", "--log-level", dest="logLevel", default="error")
32
-    parser.add_argument("-z", "--top-dir-path", dest="topDirPath", default="/usr/src/photon")
33
-    parser.add_argument("-b", "--build-root-path", dest="buildRootPath", default="/mnt")
34
-    parser.add_argument("-t", "--threads", dest="buildThreads",
35
-                        default=1, type=int, help="Number of working threads")
36
-    parser.add_argument("-m", "--tool-chain-stage", dest="toolChainStage", default="None")
37
-    parser.add_argument("-c", "--pullsources-config", dest="pullsourcesConfig",
38
-                        default="pullsources.conf")
39
-    parser.add_argument("-d", "--dist-tag", dest="dist", default="")
40
-    parser.add_argument("-k", "--input-RPMS-path", dest="inputRPMSPath", default=None)
41
-    parser.add_argument("-n", "--build-number", dest="buildNumber", default="0000000")
42
-    parser.add_argument("-v", "--release-version", dest="releaseVersion", default="NNNnNNN")
43
-    parser.add_argument("-u", "--enable-rpmcheck", dest="rpmCheck",
44
-                        default=False, action="store_true")
45
-    parser.add_argument("-ss", "--start-scheduler-server", dest="startSchedulerServer",
46
-                        default=False, action="store_true")
47
-    parser.add_argument("-a", "--source-rpm-path", dest="sourceRpmPath",
48
-                        default="../../stage/SRPMS")
49
-    parser.add_argument("-w", "--pkginfo-file", dest="pkgInfoFile",
50
-                        default="../../stage/pkg_info.json")
51
-    parser.add_argument("-g", "--pkg-build-option-file", dest="pkgBuildOptionFile",
52
-                        default="../../common/data/pkg_build_options.json")
53
-    parser.add_argument("-q", "--rpmcheck-stop-on-error", dest="rpmCheckStopOnError",
54
-                        default=False, action="store_true")
55
-    parser.add_argument("-bd", "--publish-build-dependencies", dest="publishBuildDependencies",
56
-                        default=False)
57
-    parser.add_argument("-pw", "--package-weights-path", dest="packageWeightsPath",
58
-                        default="../../common/data/packageWeights.json")
59
-    parser.add_argument("-bt", "--build-type", dest="pkgBuildType", choices=['chroot', 'container'], default="chroot")
60
-    parser.add_argument("-F", "--enable-katbuild", dest="katBuild", default=False, action="store_true")
61
-    parser.add_argument("-ct", "--cross-target", dest="targetArch", choices=['x86_64', 'aarch64'], default=None)
62
-    parser.add_argument("-pj", "--packages-json-input", dest="pkgJsonInput", default=None)
63
-    parser.add_argument("PackageName", nargs='?')
64
-    options = parser.parse_args()
65
-    cmdUtils = CommandUtils()
66
-    if not os.path.isdir(options.logPath):
67
-        cmdUtils.runCommandInShell("mkdir -p " + options.logPath)
68
-
69
-    logger = Logger.getLogger("Main", options.logPath, options.logLevel)
70
-    errorFlag = False
71
-    package = None
72
-    pkgInfoJsonFile = options.pkgInfoFile
73
-    if not os.path.isdir(options.sourcePath):
74
-        logger.error("Given Sources Path is not a directory:" + options.sourcePath)
75
-        errorFlag = True
76
-    if not os.path.isdir(options.specPath):
77
-        logger.error("Given Specs Path is not a directory:" + options.specPath)
78
-        errorFlag = True
79
-    if not os.path.isdir(options.publishRPMSPath):
80
-        logger.error("Given RPMS Path is not a directory:" + options.publishRPMSPath)
81
-        errorFlag = True
82
-    if not os.path.isdir(options.publishXRPMSPath):
83
-        logger.error("Given X RPMS Path is not a directory:" + options.publishXRPMSPath)
84
-        errorFlag = True
85
-    if not os.path.isdir(options.publishRPMSPath + "/" + constants.buildArch):
86
-        logger.error("Given RPMS Path is missing " + constants.buildArch +
87
-                     " sub-directory:"+options.publishRPMSPath)
88
-        errorFlag = True
89
-    if not os.path.isdir(options.publishXRPMSPath+"/" + constants.buildArch):
90
-        logger.error("Given X RPMS Path is missing "+ constants.buildArch +
91
-                     " sub-directory:"+options.publishXRPMSPath)
92
-        errorFlag = True
93
-    if not os.path.isdir(options.publishRPMSPath+"/noarch"):
94
-        logger.error("Given RPMS Path is missing noarch sub-directory:"+
95
-                     options.publishRPMSPath)
96
-        errorFlag = True
97
-    if not os.path.isdir(options.publishXRPMSPath+"/noarch"):
98
-        logger.error("Given X RPMS Path is missing noarch sub-directory:"+
99
-                     options.publishXRPMSPath)
100
-        errorFlag = True
101
-
102
-
103
-    if options.inputRPMSPath is not None and not os.path.isdir(options.inputRPMSPath):
104
-        logger.error("Given input RPMS Path is not a directory:"+options.inputRPMSPath)
105
-        errorFlag = True
106
-
107
-    if options.packageWeightsPath is not None and not os.path.isfile(options.packageWeightsPath):
108
-        logger.error("Given input Weights file is not a file:"+options.packageWeightsPath)
109
-        errorFlag = True
110
-
111
-    if options.pkgJsonInput is not None and not os.path.isfile(options.pkgJsonInput):
112
-        logger.error("Given input packages file is not a file:"+options.pkgJsonInput)
113
-        errorFlag = True
114
-
115
-    if options.installPackage:
116
-        if not options.PackageName:
117
-            logger.error("Please provide package name")
118
-            errorFlag = True
119
-        else:
120
-            package = options.PackageName
121
-
122
-    if errorFlag:
123
-        logger.error("Found some errors. Please fix input options and re-run it.")
124
-        return False
125
-
126
-    if options.targetArch:
127
-        constants.targetArch = options.targetArch
128
-
129
-    cmdUtils.runCommandInShell("mkdir -p "+options.rpmPath+"/"+constants.buildArch)
130
-    cmdUtils.runCommandInShell("mkdir -p "+options.rpmPath+"/noarch")
131
-    if constants.buildArch != constants.targetArch:
132
-        cmdUtils.runCommandInShell("mkdir -p "+options.rpmPath+"/"+constants.targetArch)
133
-
134
-
135
-    if not os.path.isdir(options.sourceRpmPath):
136
-        cmdUtils.runCommandInShell("mkdir -p "+options.sourceRpmPath)
137
-
138
-    if not os.path.isdir(options.buildRootPath):
139
-        cmdUtils.runCommandInShell("mkdir -p " + options.buildRootPath)
140
-
141
-    logger.debug("Source Path :"+options.sourcePath)
142
-    logger.debug("Spec Path :" + options.specPath)
143
-    logger.debug("Rpm Path :" + options.rpmPath)
144
-    logger.debug("Log Path :" + options.logPath)
145
-    logger.debug("Log Level :" + options.logLevel)
146
-    logger.debug("Top Dir Path :" + options.topDirPath)
147
-    logger.debug("Publish RPMS Path :" + options.publishRPMSPath)
148
-    logger.debug("Publish X RPMS Path :" + options.publishXRPMSPath)
149
-
150
-    if options.installPackage:
151
-        logger.debug("Package to build:" + package)
152
-
153
-    get_packages_with_build_options(options.pkgBuildOptionFile)
154
-
155
-    try:
156
-
157
-        constants.setSpecPath(options.specPath)
158
-        constants.setSourcePath(options.sourcePath)
159
-        constants.setRpmPath(options.rpmPath)
160
-        constants.setSourceRpmPath(options.sourceRpmPath)
161
-        constants.setTopDirPath(options.topDirPath)
162
-        constants.setLogPath(options.logPath)
163
-        constants.setLogLevel(options.logLevel)
164
-        constants.setDist(options.dist)
165
-        constants.setBuildNumber(options.buildNumber)
166
-        constants.setReleaseVersion(options.releaseVersion)
167
-        constants.setPrevPublishRPMRepo(options.publishRPMSPath)
168
-        constants.setPrevPublishXRPMRepo(options.publishXRPMSPath)
169
-        constants.setBuildRootPath(options.buildRootPath)
170
-        constants.setPullSourcesURL(get_baseurl(options.pullsourcesConfig))
171
-        constants.setInputRPMSPath(options.inputRPMSPath)
172
-        constants.setRPMCheck(options.rpmCheck)
173
-        constants.setStartSchedulerServer(options.startSchedulerServer)
174
-        constants.setRpmCheckStopOnError(options.rpmCheckStopOnError)
175
-        constants.setPublishBuildDependencies(options.publishBuildDependencies)
176
-        constants.setPackageWeightsPath(options.packageWeightsPath)
177
-        constants.setKatBuild(options.katBuild)
178
-
179
-        constants.initialize()
180
-        # parse SPECS folder
181
-        SPECS()
182
-        if options.toolChainStage == "stage1":
183
-            pkgManager = PackageManager()
184
-            pkgManager.buildToolChain()
185
-        elif options.toolChainStage == "stage2":
186
-            pkgManager = PackageManager()
187
-            pkgManager.buildToolChainPackages(options.buildThreads)
188
-        else:
189
-            if constants.buildArch != constants.targetArch:
190
-                # It is cross compilation.
191
-                # first build all native packages
192
-                buildPackagesForAllSpecs(options.buildThreads,
193
-                                         options.pkgBuildType,
194
-                                         pkgInfoJsonFile, logger)
195
-                # Then do the build to the target
196
-                constants.currentArch = constants.targetArch
197
-                constants.crossCompiling = True
198
-
199
-            if options.installPackage:
200
-                buildSpecifiedPackages([package], options.buildThreads, options.pkgBuildType)
201
-            elif options.pkgJsonInput:
202
-                buildPackagesInJson(options.pkgJsonInput, options.buildThreads,
203
-                                    options.pkgBuildType, pkgInfoJsonFile, logger)
204
-            else:
205
-                buildPackagesForAllSpecs(options.buildThreads, options.pkgBuildType,
206
-                                         pkgInfoJsonFile, logger)
207
-    except Exception as e:
208
-        logger.error("Caught an exception")
209
-        logger.error(str(e))
210
-        # print stacktrace
211
-        traceback.print_exc()
212
-        sys.exit(1)
213
-    sys.exit(0)
214
-
215
-
216
-def buildSpecifiedPackages(listPackages, buildThreads, pkgBuildType, pkgInfoJsonFile=None, logger=None):
217
-    if constants.rpmCheck:
218
-        constants.setTestForceRPMS(copy.copy(listPackages))
219
-    pkgManager = PackageManager(pkgBuildType=pkgBuildType)
220
-    pkgManager.buildPackages(listPackages, buildThreads)
221
-
222
-    if pkgInfoJsonFile is not None:
223
-        # Generating package info file which is required by installer
224
-        if logger is not None:
225
-            logger.debug("Writing Package info to the file:" + pkgInfoJsonFile)
226
-        pkgInfo = PackageInfo()
227
-        pkgInfo.loadPackagesData()
228
-        pkgInfo.writePkgListToFile(pkgInfoJsonFile)
229
-
230
-
231
-def buildPackagesInJson(pkgJsonInput, buildThreads, pkgBuildType, pkgInfoJsonFile, logger):
232
-    listPackages = []
233
-    with open(pkgJsonInput) as jsonData:
234
-        pkg_list_json = json.load(jsonData)
235
-        listPackages = pkg_list_json["packages"]
236
-    buildSpecifiedPackages(listPackages, buildThreads, pkgBuildType, pkgInfoJsonFile, logger)
237
-
238
-
239
-def buildPackagesForAllSpecs(buildThreads, pkgBuildType, pkgInfoJsonFile, logger):
240
-    listPackages = SPECS.getData().getListPackages()
241
-    buildSpecifiedPackages(listPackages, buildThreads, pkgBuildType, pkgInfoJsonFile, logger)
242
-
243
-
244
-def get_packages_with_build_options(pkg_build_options_file):
245
-    if os.path.exists(pkg_build_options_file):
246
-        with open(pkg_build_options_file) as jsonData:
247
-            pkg_build_option_json = json.load(jsonData, object_pairs_hook=collections.OrderedDict)
248
-            constants.setBuildOptions(pkg_build_option_json)
249
-
250
-def get_baseurl(conf_file):
251
-    with open(conf_file) as jsonFile:
252
-        config = json.load(jsonFile)
253
-    return config['baseurl']
254
-
255
-def get_all_package_names(build_install_option):
256
-    base_path = os.path.dirname(build_install_option)
257
-    packages = []
258
-
259
-    with open(build_install_option) as jsonData:
260
-        option_list_json = json.load(jsonData, object_pairs_hook=collections.OrderedDict)
261
-        options_sorted = option_list_json.items()
262
-
263
-        for install_option in options_sorted:
264
-            filename = os.path.join(base_path, install_option[1]["file"])
265
-            with open(filename) as pkgJsonData:
266
-                package_list_json = json.load(pkgJsonData)
267
-            packages = packages + package_list_json["packages"]
268
-
269
-    return packages
270
-
271
-
272
-if __name__ == "__main__":
273
-    main()
17
+class Builder:
18
+
19
+    def buildSpecifiedPackages(listPackages, buildThreads, pkgBuildType, pkgInfoJsonFile=None, logger=None):
20
+        if constants.rpmCheck:
21
+            constants.setTestForceRPMS(copy.copy(listPackages))
22
+        pkgManager = PackageManager(pkgBuildType=pkgBuildType)
23
+        pkgManager.buildPackages(listPackages, buildThreads)
24
+
25
+        if pkgInfoJsonFile is not None:
26
+            # Generating package info file which is required by installer
27
+            if logger is not None:
28
+                logger.debug("Writing Package info to the file:" + pkgInfoJsonFile)
29
+            pkgInfo = PackageInfo()
30
+            pkgInfo.loadPackagesData()
31
+            pkgInfo.writePkgListToFile(pkgInfoJsonFile)
32
+
33
+
34
+    def buildPackagesInJson(pkgJsonInput, buildThreads, pkgBuildType, pkgInfoJsonFile, logger):
35
+        listPackages = []
36
+        with open(pkgJsonInput) as jsonData:
37
+            pkg_list_json = json.load(jsonData)
38
+            listPackages = pkg_list_json["packages"]
39
+        Builder.buildSpecifiedPackages(listPackages, buildThreads, pkgBuildType, pkgInfoJsonFile, logger)
40
+
41
+
42
+    def buildPackagesForAllSpecs(buildThreads, pkgBuildType, pkgInfoJsonFile, logger):
43
+        listPackages = SPECS.getData().getListPackages()
44
+        Builder.buildSpecifiedPackages(listPackages, buildThreads, pkgBuildType, pkgInfoJsonFile, logger)
45
+
46
+
47
+    def get_packages_with_build_options(pkg_build_options_file):
48
+        if os.path.exists(pkg_build_options_file):
49
+            with open(pkg_build_options_file) as jsonData:
50
+                pkg_build_option_json = json.load(jsonData, object_pairs_hook=collections.OrderedDict)
51
+                constants.setBuildOptions(pkg_build_option_json)
52
+
53
+    def get_baseurl(conf_file):
54
+        with open(conf_file) as jsonFile:
55
+            config = json.load(jsonFile)
56
+        return config['baseurl']
57
+
58
+    def get_all_package_names(build_install_option):
59
+        base_path = os.path.dirname(build_install_option)
60
+        packages = []
61
+
62
+        with open(build_install_option) as jsonData:
63
+            option_list_json = json.load(jsonData, object_pairs_hook=collections.OrderedDict)
64
+            options_sorted = option_list_json.items()
65
+
66
+            for install_option in options_sorted:
67
+                filename = os.path.join(base_path, install_option[1]["file"])
68
+                with open(filename) as pkgJsonData:
69
+                    package_list_json = json.load(pkgJsonData)
70
+                packages = packages + package_list_json["packages"]
71
+
72
+        return packages