...
1BASE:=base.tar.gz
2DEV_BUILD:=0
3
4GO:=go
5GO_FLAGS:=-ldflags "-s -w" # strip Go binaries
6CGO_ENABLED:=0
7GOMODVENDOR:=
8
9CFLAGS:=-O2 -Wall
10LDFLAGS:=-static -s # strip C binaries
11
12GO_FLAGS_EXTRA:=
13ifeq "$(GOMODVENDOR)" "1"
14GO_FLAGS_EXTRA += -mod=vendor
15endif
16GO_BUILD_TAGS:=
17ifneq ($(strip $(GO_BUILD_TAGS)),)
18GO_FLAGS_EXTRA += -tags="$(GO_BUILD_TAGS)"
19endif
20GO_BUILD:=CGO_ENABLED=$(CGO_ENABLED) $(GO) build $(GO_FLAGS) $(GO_FLAGS_EXTRA)
21
22SRCROOT=$(dir $(abspath $(firstword $(MAKEFILE_LIST))))
23# additional directories to search for rule prerequisites and targets
24VPATH=$(SRCROOT)
25
26DELTA_TARGET=out/delta.tar.gz
27
28ifeq "$(DEV_BUILD)" "1"
29DELTA_TARGET=out/delta-dev.tar.gz
30endif
31
32# The link aliases for gcstools
33GCS_TOOLS=\
34 generichook \
35 install-drivers
36
37.PHONY: all always rootfs test
38
39.DEFAULT_GOAL := all
40
41all: out/initrd.img out/rootfs.tar.gz
42
43clean:
44 find -name '*.o' -print0 | xargs -0 -r rm
45 rm -rf bin deps rootfs out
46
47test:
48 cd $(SRCROOT) && $(GO) test -v ./internal/guest/...
49
50rootfs: out/rootfs.vhd
51
52out/rootfs.vhd: out/rootfs.tar.gz bin/cmd/tar2ext4
53 gzip -f -d ./out/rootfs.tar.gz
54 bin/cmd/tar2ext4 -vhd -i ./out/rootfs.tar -o $@
55
56out/rootfs.tar.gz: out/initrd.img
57 rm -rf rootfs-conv
58 mkdir rootfs-conv
59 gunzip -c out/initrd.img | (cd rootfs-conv && cpio -imd)
60 tar -zcf $@ -C rootfs-conv .
61 rm -rf rootfs-conv
62
63out/initrd.img: $(BASE) $(DELTA_TARGET) $(SRCROOT)/hack/catcpio.sh
64 $(SRCROOT)/hack/catcpio.sh "$(BASE)" $(DELTA_TARGET) > out/initrd.img.uncompressed
65 gzip -c out/initrd.img.uncompressed > $@
66 rm out/initrd.img.uncompressed
67
68# This target includes utilities which may be useful for testing purposes.
69out/delta-dev.tar.gz: out/delta.tar.gz bin/internal/tools/snp-report
70 rm -rf rootfs-dev
71 mkdir rootfs-dev
72 tar -xzf out/delta.tar.gz -C rootfs-dev
73 cp bin/internal/tools/snp-report rootfs-dev/bin/
74 tar -zcf $@ -C rootfs-dev .
75 rm -rf rootfs-dev
76
77out/delta.tar.gz: bin/init bin/vsockexec bin/cmd/gcs bin/cmd/gcstools bin/cmd/hooks/wait-paths Makefile
78 @mkdir -p out
79 rm -rf rootfs
80 mkdir -p rootfs/bin/
81 mkdir -p rootfs/info/
82 cp bin/init rootfs/
83 cp bin/vsockexec rootfs/bin/
84 cp bin/cmd/gcs rootfs/bin/
85 cp bin/cmd/gcstools rootfs/bin/
86 cp bin/cmd/hooks/wait-paths rootfs/bin/
87 for tool in $(GCS_TOOLS); do ln -s gcstools rootfs/bin/$$tool; done
88 git -C $(SRCROOT) rev-parse HEAD > rootfs/info/gcs.commit && \
89 git -C $(SRCROOT) rev-parse --abbrev-ref HEAD > rootfs/info/gcs.branch && \
90 date --iso-8601=minute --utc > rootfs/info/tar.date
91 $(if $(and $(realpath $(subst .tar,.testdata.json,$(BASE))), $(shell which jq)), \
92 jq -r '.IMAGE_NAME' $(subst .tar,.testdata.json,$(BASE)) 2>/dev/null > rootfs/info/image.name && \
93 jq -r '.DATETIME' $(subst .tar,.testdata.json,$(BASE)) 2>/dev/null > rootfs/info/build.date)
94 tar -zcf $@ -C rootfs .
95 rm -rf rootfs
96
97bin/cmd/gcs bin/cmd/gcstools bin/cmd/hooks/wait-paths bin/cmd/tar2ext4 bin/internal/tools/snp-report:
98 @mkdir -p $(dir $@)
99 GOOS=linux $(GO_BUILD) -o $@ $(SRCROOT)/$(@:bin/%=%)
100
101bin/vsockexec: vsockexec/vsockexec.o vsockexec/vsock.o
102 @mkdir -p bin
103 $(CC) $(LDFLAGS) -o $@ $^
104
105bin/init: init/init.o vsockexec/vsock.o
106 @mkdir -p bin
107 $(CC) $(LDFLAGS) -o $@ $^
108
109%.o: %.c
110 @mkdir -p $(dir $@)
111 $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
View as plain text