Makefile 3.1 KB

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