gitee.com/leisunstar/runtime@v0.0.0-20200521203717-5cef3e7b53f9/Makefile (about)

     1  #
     2  # Copyright (c) 2018-2019 Intel Corporation
     3  #
     4  # SPDX-License-Identifier: Apache-2.0
     5  #
     6  
     7  distro := $(shell \
     8  for file in /etc/os-release /usr/lib/os-release; do \
     9      if [ -e $$file ]; then \
    10          grep ^ID= $$file|cut -d= -f2-|tr -d '"'; \
    11          break; \
    12      fi \
    13  done)
    14  
    15  SKIP_GO_VERSION_CHECK=
    16  include golang.mk
    17  
    18  #Get ARCH.
    19  ifneq (,$(golang_version_raw))
    20      GOARCH=$(shell go env GOARCH)
    21      ifeq ($(ARCH),)
    22          ARCH = $(GOARCH)
    23      endif
    24  else
    25      ARCH = $(shell uname -m)
    26      ifeq ($(ARCH),x86_64)
    27          ARCH = amd64
    28      endif
    29      ifeq ($(ARCH),aarch64)
    30          ARCH = arm64
    31      endif
    32  endif
    33  
    34  ARCH_DIR = arch
    35  ARCH_FILE_SUFFIX = -options.mk
    36  ARCH_FILE = $(ARCH_DIR)/$(ARCH)$(ARCH_FILE_SUFFIX)
    37  ARCH_FILES = $(wildcard arch/*$(ARCH_FILE_SUFFIX))
    38  ALL_ARCHES = $(patsubst $(ARCH_DIR)/%$(ARCH_FILE_SUFFIX),%,$(ARCH_FILES))
    39  
    40  # Load architecture-dependent settings
    41  include $(ARCH_FILE)
    42  
    43  PROJECT_TYPE = kata
    44  PROJECT_NAME = Kata Containers
    45  PROJECT_TAG = kata-containers
    46  PROJECT_URL = https://github.com/kata-containers
    47  PROJECT_BUG_URL = $(PROJECT_URL)/kata-containers/issues/new
    48  
    49  # list of scripts to install
    50  SCRIPTS :=
    51  
    52  # list of binaries to install
    53  BINLIST :=
    54  BINLIBEXECLIST :=
    55  
    56  BIN_PREFIX = $(PROJECT_TYPE)
    57  PROJECT_DIR = $(PROJECT_TAG)
    58  IMAGENAME = $(PROJECT_TAG).img
    59  INITRDNAME = $(PROJECT_TAG)-initrd.img
    60  
    61  TARGET = $(BIN_PREFIX)-runtime
    62  TARGET_OUTPUT = $(CURDIR)/$(TARGET)
    63  BINLIST += $(TARGET)
    64  
    65  NETMON_DIR = netmon
    66  NETMON_TARGET = $(PROJECT_TYPE)-netmon
    67  NETMON_TARGET_OUTPUT = $(CURDIR)/$(NETMON_TARGET)
    68  BINLIBEXECLIST += $(NETMON_TARGET)
    69  
    70  DESTDIR := /
    71  
    72  ifeq ($(PREFIX),)
    73  PREFIX        := /usr
    74  EXEC_PREFIX   := $(PREFIX)/local
    75  else
    76  EXEC_PREFIX   := $(PREFIX)
    77  endif
    78  # Prefix where depedencies are installed
    79  PREFIXDEPS    := $(PREFIX)
    80  BINDIR        := $(EXEC_PREFIX)/bin
    81  QEMUBINDIR    := $(PREFIXDEPS)/bin
    82  CLHBINDIR    := $(PREFIXDEPS)/bin
    83  FCBINDIR      := $(PREFIXDEPS)/bin
    84  ACRNBINDIR    := $(PREFIXDEPS)/bin
    85  VIRTIOFSDBINDIR := $(PREFIXDEPS)/bin
    86  SYSCONFDIR    := /etc
    87  LOCALSTATEDIR := /var
    88  
    89  LIBEXECDIR := $(PREFIXDEPS)/libexec
    90  SHAREDIR := $(PREFIX)/share
    91  DEFAULTSDIR := $(SHAREDIR)/defaults
    92  
    93  COLLECT_SCRIPT = data/kata-collect-data.sh
    94  COLLECT_SCRIPT_SRC = $(COLLECT_SCRIPT).in
    95  
    96  GENERATED_FILES += $(COLLECT_SCRIPT)
    97  SCRIPTS += $(COLLECT_SCRIPT)
    98  SCRIPTS_DIR := $(BINDIR)
    99  
   100  BASH_COMPLETIONS := data/completions/bash/kata-runtime
   101  BASH_COMPLETIONSDIR := $(SHAREDIR)/bash-completion/completions
   102  
   103  PKGDATADIR := $(PREFIXDEPS)/share/$(PROJECT_DIR)
   104  PKGLIBDIR := $(LOCALSTATEDIR)/lib/$(PROJECT_DIR)
   105  PKGRUNDIR := $(LOCALSTATEDIR)/run/$(PROJECT_DIR)
   106  PKGLIBEXECDIR := $(LIBEXECDIR)/$(PROJECT_DIR)
   107  
   108  KERNELDIR := $(PKGDATADIR)
   109  
   110  INITRDPATH := $(PKGDATADIR)/$(INITRDNAME)
   111  IMAGEPATH := $(PKGDATADIR)/$(IMAGENAME)
   112  FIRMWAREPATH :=
   113  
   114  # Name of default configuration file the runtime will use.
   115  CONFIG_FILE = configuration.toml
   116  
   117  HYPERVISOR_ACRN = acrn
   118  HYPERVISOR_FC = firecracker
   119  JAILER_FC = jailer
   120  HYPERVISOR_QEMU = qemu
   121  HYPERVISOR_CLH = cloud-hypervisor
   122  HYPERVISOR_QEMU_VIRTIOFS = qemu-virtiofs
   123  
   124  # Determines which hypervisor is specified in $(CONFIG_FILE).
   125  DEFAULT_HYPERVISOR ?= $(HYPERVISOR_QEMU)
   126  
   127  # List of hypervisors this build system can generate configuration for.
   128  HYPERVISORS := $(HYPERVISOR_ACRN) $(HYPERVISOR_FC) $(HYPERVISOR_QEMU) $(HYPERVISOR_QEMU_VIRTIOFS) $(HYPERVISOR_CLH)
   129  
   130  QEMUPATH := $(QEMUBINDIR)/$(QEMUCMD)
   131  
   132  QEMUVIRTIOFSPATH := $(QEMUBINDIR)/$(QEMUVIRTIOFSCMD)
   133  
   134  CLHPATH := $(CLHBINDIR)/$(CLHCMD)
   135  
   136  FCPATH = $(FCBINDIR)/$(FCCMD)
   137  FCJAILERPATH = $(FCBINDIR)/$(FCJAILERCMD)
   138  
   139  ACRNPATH := $(ACRNBINDIR)/$(ACRNCMD)
   140  ACRNCTLPATH := $(ACRNBINDIR)/$(ACRNCTLCMD)
   141  
   142  SHIMCMD := $(BIN_PREFIX)-shim
   143  SHIMPATH := $(PKGLIBEXECDIR)/$(SHIMCMD)
   144  
   145  PROXYCMD := $(BIN_PREFIX)-proxy
   146  PROXYPATH := $(PKGLIBEXECDIR)/$(PROXYCMD)
   147  
   148  NETMONCMD := $(BIN_PREFIX)-netmon
   149  NETMONPATH := $(PKGLIBEXECDIR)/$(NETMONCMD)
   150  
   151  # Default number of vCPUs
   152  DEFVCPUS := 1
   153  # Default maximum number of vCPUs
   154  DEFMAXVCPUS := 0
   155  # Default memory size in MiB
   156  DEFMEMSZ := 2048
   157  # Default memory slots
   158  # Cases to consider :
   159  # - nvdimm rootfs image
   160  # - preallocated memory
   161  # - vm template memory
   162  # - hugepage memory
   163  DEFMEMSLOTS := 10
   164  #Default number of bridges
   165  DEFBRIDGES := 1
   166  DEFDISABLEGUESTSECCOMP := true
   167  #Default experimental features enabled
   168  DEFAULTEXPFEATURES := []
   169  
   170  #Default entropy source
   171  DEFENTROPYSOURCE := /dev/urandom
   172  
   173  DEFDISABLEBLOCK := false
   174  DEFSHAREDFS := virtio-9p
   175  DEFSHAREDFS_QEMU_VIRTIOFS := virtio-fs
   176  DEFVIRTIOFSDAEMON := $(VIRTIOFSDBINDIR)/virtiofsd
   177  # Default DAX mapping cache size in MiB
   178  DEFVIRTIOFSCACHESIZE := 1024
   179  DEFVIRTIOFSCACHE := always
   180  DEFVIRTIOFSEXTRAARGS := []
   181  DEFENABLEIOTHREADS := false
   182  DEFENABLEMEMPREALLOC := false
   183  DEFENABLEHUGEPAGES := false
   184  DEFENABLEVHOSTUSERSTORE := false
   185  DEFVHOSTUSERSTOREPATH := $(PKGRUNDIR)/vhost-user
   186  DEFENABLESWAP := false
   187  DEFENABLEDEBUG := false
   188  DEFDISABLENESTINGCHECKS := false
   189  DEFMSIZE9P := 8192
   190  DEFHOTPLUGVFIOONROOTBUS := false
   191  DEFPCIEROOTPORT := 0
   192  
   193  # Default cgroup model
   194  DEFSANDBOXCGROUPONLY ?= false
   195  
   196  # Features
   197  FEATURE_SELINUX ?= check
   198  
   199  SED = sed
   200  
   201  CLI_DIR = cli
   202  SHIMV2 = containerd-shim-kata-v2
   203  SHIMV2_OUTPUT = $(CURDIR)/$(SHIMV2)
   204  SHIMV2_DIR = $(CLI_DIR)/$(SHIMV2)
   205  
   206  SOURCES := $(shell find . 2>&1 | grep -E '.*\.(c|h|go)$$')
   207  VERSION := ${shell cat ./VERSION}
   208  
   209  # List of configuration files to build and install
   210  CONFIGS =
   211  CONFIG_PATHS =
   212  SYSCONFIG_PATHS =
   213  
   214  # List of hypervisors known for the current architecture
   215  KNOWN_HYPERVISORS =
   216  
   217  ifneq (,$(QEMUCMD))
   218      KNOWN_HYPERVISORS += $(HYPERVISOR_QEMU)
   219  
   220      CONFIG_FILE_QEMU = configuration-qemu.toml
   221      CONFIG_QEMU = $(CLI_DIR)/config/$(CONFIG_FILE_QEMU)
   222      CONFIG_QEMU_IN = $(CONFIG_QEMU).in
   223  
   224      CONFIG_PATH_QEMU = $(abspath $(CONFDIR)/$(CONFIG_FILE_QEMU))
   225      CONFIG_PATHS += $(CONFIG_PATH_QEMU)
   226  
   227      SYSCONFIG_QEMU = $(abspath $(SYSCONFDIR)/$(CONFIG_FILE_QEMU))
   228      SYSCONFIG_PATHS += $(SYSCONFIG_QEMU)
   229  
   230      CONFIGS += $(CONFIG_QEMU)
   231  
   232      # qemu-specific options (all should be suffixed by "_QEMU")
   233      DEFBLOCKSTORAGEDRIVER_QEMU := virtio-scsi
   234      DEFNETWORKMODEL_QEMU := tcfilter
   235      KERNELNAME = $(call MAKE_KERNEL_NAME,$(KERNELTYPE))
   236      KERNELPATH = $(KERNELDIR)/$(KERNELNAME)
   237  endif
   238  
   239  ifneq (,$(QEMUVIRTIOFSCMD))
   240      KNOWN_HYPERVISORS += $(HYPERVISOR_QEMU_VIRTIOFS)
   241  
   242      CONFIG_FILE_QEMU_VIRTIOFS = configuration-qemu-virtiofs.toml
   243      CONFIG_QEMU_VIRTIOFS = $(CLI_DIR)/config/$(CONFIG_FILE_QEMU_VIRTIOFS)
   244      CONFIG_QEMU_VIRTIOFS_IN = $(CONFIG_QEMU_VIRTIOFS).in
   245  
   246      CONFIG_PATH_QEMU_VIRTIOFS = $(abspath $(CONFDIR)/$(CONFIG_FILE_QEMU_VIRTIOFS))
   247      CONFIG_PATHS += $(CONFIG_PATH_QEMU_VIRTIOFS)
   248  
   249      SYSCONFIG_QEMU_VIRTIOFS = $(abspath $(SYSCONFDIR)/$(CONFIG_FILE_QEMU_VIRTIOFS))
   250      SYSCONFIG_PATHS += $(SYSCONFIG_QEMU_VIRTIOFS)
   251  
   252      CONFIGS += $(CONFIG_QEMU_VIRTIOFS)
   253  
   254      # qemu-specific options (all should be suffixed by "_QEMU")
   255      DEFBLOCKSTORAGEDRIVER_QEMU_VIRTIOFS := virtio-fs
   256      DEFNETWORKMODEL_QEMU := tcfilter
   257      KERNELNAMEVIRTIOFS = $(call MAKE_KERNEL_VIRTIOFS_NAME,$(KERNELTYPE))
   258      KERNELVIRTIOFSPATH = $(KERNELDIR)/$(KERNELNAMEVIRTIOFS)
   259  endif
   260  
   261  ifneq (,$(CLHCMD))
   262      KNOWN_HYPERVISORS += $(HYPERVISOR_CLH)
   263  
   264      CONFIG_FILE_CLH = configuration-clh.toml
   265      CONFIG_CLH = $(CLI_DIR)/config/$(CONFIG_FILE_CLH)
   266      CONFIG_CLH_IN = $(CONFIG_CLH).in
   267  
   268      CONFIG_PATH_CLH = $(abspath $(CONFDIR)/$(CONFIG_FILE_CLH))
   269      CONFIG_PATHS += $(CONFIG_PATH_CLH)
   270  
   271      SYSCONFIG_CLH = $(abspath $(SYSCONFDIR)/$(CONFIG_FILE_CLH))
   272      SYSCONFIG_PATHS += $(SYSCONFIG_CLH)
   273  
   274      CONFIGS += $(CONFIG_CLH)
   275  
   276      # CLH-specific options (all should be suffixed by "_CLH")
   277      # currently, huge pages are required for virtiofsd support
   278      DEFENABLEHUGEPAGES_CLH := true
   279      DEFNETWORKMODEL_CLH := tcfilter
   280      KERNELTYPE_CLH = uncompressed
   281      KERNEL_NAME_CLH = $(call MAKE_KERNEL_VIRTIOFS_NAME,$(KERNELTYPE_CLH))
   282      KERNELPATH_CLH = $(KERNELDIR)/$(KERNEL_NAME_CLH)
   283  endif
   284  
   285  ifneq (,$(FCCMD))
   286      KNOWN_HYPERVISORS += $(HYPERVISOR_FC)
   287  
   288      CONFIG_FILE_FC = configuration-fc.toml
   289      CONFIG_FC = $(CLI_DIR)/config/$(CONFIG_FILE_FC)
   290      CONFIG_FC_IN = $(CONFIG_FC).in
   291  
   292      CONFIG_PATH_FC = $(abspath $(CONFDIR)/$(CONFIG_FILE_FC))
   293      CONFIG_PATHS += $(CONFIG_PATH_FC)
   294  
   295      SYSCONFIG_FC = $(abspath $(SYSCONFDIR)/$(CONFIG_FILE_FC))
   296      SYSCONFIG_PATHS += $(SYSCONFIG_FC)
   297  
   298      CONFIGS += $(CONFIG_FC)
   299  
   300      # firecracker-specific options (all should be suffixed by "_FC")
   301      DEFBLOCKSTORAGEDRIVER_FC := virtio-mmio
   302      DEFNETWORKMODEL_FC := tcfilter
   303      KERNELTYPE_FC = uncompressed
   304      KERNEL_NAME_FC = $(call MAKE_KERNEL_NAME,$(KERNELTYPE_FC))
   305      KERNELPATH_FC = $(KERNELDIR)/$(KERNEL_NAME_FC)
   306  endif
   307  
   308  ifneq (,$(ACRNCMD))
   309      KNOWN_HYPERVISORS += $(HYPERVISOR_ACRN)
   310  
   311      CONFIG_FILE_ACRN = configuration-acrn.toml
   312      CONFIG_ACRN = $(CLI_DIR)/config/$(CONFIG_FILE_ACRN)
   313      CONFIG_ACRN_IN = $(CONFIG_ACRN).in
   314  
   315      CONFIG_PATH_ACRN = $(abspath $(CONFDIR)/$(CONFIG_FILE_ACRN))
   316      CONFIG_PATHS += $(CONFIG_PATH_ACRN)
   317  
   318      SYSCONFIG_ACRN = $(abspath $(SYSCONFDIR)/$(CONFIG_FILE_ACRN))
   319      SYSCONFIG_PATHS += $(SYSCONFIG_ACRN)
   320  
   321      CONFIGS += $(CONFIG_ACRN)
   322  
   323      # acrn-specific options (all should be suffixed by "_ACRN")
   324      DEFMAXVCPUS_ACRN := 1
   325      DEFBLOCKSTORAGEDRIVER_ACRN := virtio-blk
   326      DEFNETWORKMODEL_ACRN := macvtap
   327      KERNEL_NAME_ACRN = $(call MAKE_KERNEL_NAME,$(KERNELTYPE))
   328      KERNELPATH_ACRN = $(KERNELDIR)/$(KERNEL_NAME_ACRN)
   329  endif
   330  
   331  ifeq (,$(KNOWN_HYPERVISORS))
   332      $(error "ERROR: No hypervisors known for architecture $(ARCH) (looked for: $(HYPERVISORS))")
   333  endif
   334  
   335  ifeq (,$(findstring $(DEFAULT_HYPERVISOR),$(HYPERVISORS)))
   336      $(error "ERROR: Invalid default hypervisor: '$(DEFAULT_HYPERVISOR)'")
   337  endif
   338  
   339  ifeq (,$(findstring $(DEFAULT_HYPERVISOR),$(KNOWN_HYPERVISORS)))
   340      $(error "ERROR: Default hypervisor '$(DEFAULT_HYPERVISOR)' not known for architecture $(ARCH)")
   341  endif
   342  
   343  ifeq ($(DEFAULT_HYPERVISOR),$(HYPERVISOR_QEMU))
   344      DEFAULT_HYPERVISOR_CONFIG = $(CONFIG_FILE_QEMU)
   345  endif
   346  
   347  ifeq ($(DEFAULT_HYPERVISOR),$(HYPERVISOR_QEMU_VIRTIOFS))
   348      DEFAULT_HYPERVISOR_CONFIG = $(CONFIG_FILE_QEMU_VIRTIOFS)
   349  endif
   350  
   351  ifeq ($(DEFAULT_HYPERVISOR),$(HYPERVISOR_FC))
   352      DEFAULT_HYPERVISOR_CONFIG = $(CONFIG_FILE_FC)
   353  endif
   354  
   355  ifeq ($(DEFAULT_HYPERVISOR),$(HYPERVISOR_ACRN))
   356      DEFAULT_HYPERVISOR_CONFIG = $(CONFIG_FILE_ACRN)
   357  endif
   358  
   359  ifeq ($(DEFAULT_HYPERVISOR),$(HYPERVISOR_CLH))
   360      DEFAULT_HYPERVISOR_CONFIG = $(CONFIG_FILE_CLH)
   361  endif
   362  
   363  CONFDIR := $(DEFAULTSDIR)/$(PROJECT_DIR)
   364  SYSCONFDIR := $(SYSCONFDIR)/$(PROJECT_DIR)
   365  
   366  # Main configuration file location for stateless systems
   367  CONFIG_PATH := $(abspath $(CONFDIR)/$(CONFIG_FILE))
   368  
   369  # Secondary configuration file location. Note that this takes precedence
   370  # over CONFIG_PATH.
   371  SYSCONFIG := $(abspath $(SYSCONFDIR)/$(CONFIG_FILE))
   372  
   373  SHAREDIR := $(SHAREDIR)
   374  
   375  # list of variables the user may wish to override
   376  USER_VARS += ARCH
   377  USER_VARS += BINDIR
   378  USER_VARS += CONFIG_PATH
   379  USER_VARS += DESTDIR
   380  USER_VARS += DEFAULT_HYPERVISOR
   381  USER_VARS += ACRNCMD
   382  USER_VARS += ACRNCTLCMD
   383  USER_VARS += ACRNPATH
   384  USER_VARS += ACRNCTLPATH
   385  USER_VARS += FCCMD
   386  USER_VARS += FCPATH
   387  USER_VARS += FCJAILERPATH
   388  USER_VARS += SYSCONFIG
   389  USER_VARS += IMAGENAME
   390  USER_VARS += IMAGEPATH
   391  USER_VARS += INITRDNAME
   392  USER_VARS += INITRDPATH
   393  USER_VARS += MACHINETYPE
   394  USER_VARS += KERNELDIR
   395  USER_VARS += KERNELTYPE
   396  USER_VARS += KERNELTYPE_FC
   397  USER_VARS += KERNELTYPE_ACRN
   398  USER_VARS += KERNELTYPE_CLH
   399  USER_VARS += FIRMWAREPATH
   400  USER_VARS += MACHINEACCELERATORS
   401  USER_VARS += CPUFEATURES
   402  USER_VARS += DEFMACHINETYPE_CLH
   403  USER_VARS += KERNELPARAMS
   404  USER_VARS += LIBEXECDIR
   405  USER_VARS += LOCALSTATEDIR
   406  USER_VARS += PKGDATADIR
   407  USER_VARS += PKGLIBDIR
   408  USER_VARS += PKGLIBEXECDIR
   409  USER_VARS += PKGRUNDIR
   410  USER_VARS += PREFIX
   411  USER_VARS += PROJECT_NAME
   412  USER_VARS += PROJECT_PREFIX
   413  USER_VARS += PROJECT_TYPE
   414  USER_VARS += PROXYPATH
   415  USER_VARS += NETMONPATH
   416  USER_VARS += QEMUBINDIR
   417  USER_VARS += QEMUCMD
   418  USER_VARS += QEMUPATH
   419  USER_VARS += QEMUVIRTIOFSCMD
   420  USER_VARS += QEMUVIRTIOFSPATH
   421  USER_VARS += SHAREDIR
   422  USER_VARS += SHIMPATH
   423  USER_VARS += SYSCONFDIR
   424  USER_VARS += DEFVCPUS
   425  USER_VARS += DEFMAXVCPUS
   426  USER_VARS += DEFMAXVCPUS_ACRN
   427  USER_VARS += DEFMEMSZ
   428  USER_VARS += DEFMEMSLOTS
   429  USER_VARS += DEFBRIDGES
   430  USER_VARS += DEFNETWORKMODEL_ACRN
   431  USER_VARS += DEFNETWORKMODEL_FC
   432  USER_VARS += DEFNETWORKMODEL_QEMU
   433  USER_VARS += DEFDISABLEGUESTSECCOMP
   434  USER_VARS += DEFAULTEXPFEATURES
   435  USER_VARS += DEFDISABLEBLOCK
   436  USER_VARS += DEFBLOCKSTORAGEDRIVER_ACRN
   437  USER_VARS += DEFBLOCKSTORAGEDRIVER_FC
   438  USER_VARS += DEFBLOCKSTORAGEDRIVER_QEMU
   439  USER_VARS += DEFBLOCKSTORAGEDRIVER_QEMU_VIRTIOFS
   440  USER_VARS += DEFSHAREDFS
   441  USER_VARS += DEFSHAREDFS_QEMU_VIRTIOFS
   442  USER_VARS += DEFVIRTIOFSDAEMON
   443  USER_VARS += DEFVIRTIOFSCACHESIZE
   444  USER_VARS += DEFVIRTIOFSCACHE
   445  USER_VARS += DEFVIRTIOFSEXTRAARGS
   446  USER_VARS += DEFENABLEIOTHREADS
   447  USER_VARS += DEFENABLEMEMPREALLOC
   448  USER_VARS += DEFENABLEHUGEPAGES
   449  USER_VARS += DEFENABLEVHOSTUSERSTORE
   450  USER_VARS += DEFVHOSTUSERSTOREPATH
   451  USER_VARS += DEFENABLESWAP
   452  USER_VARS += DEFENABLEDEBUG
   453  USER_VARS += DEFDISABLENESTINGCHECKS
   454  USER_VARS += DEFMSIZE9P
   455  USER_VARS += DEFHOTPLUGVFIOONROOTBUS
   456  USER_VARS += DEFPCIEROOTPORT
   457  USER_VARS += DEFENTROPYSOURCE
   458  USER_VARS += DEFSANDBOXCGROUPONLY
   459  USER_VARS += FEATURE_SELINUX
   460  USER_VARS += BUILDFLAGS
   461  
   462  
   463  V              = @
   464  Q              = $(V:1=)
   465  QUIET_BUILD    = $(Q:@=@echo    '     BUILD    '$@;)
   466  QUIET_CHECK    = $(Q:@=@echo    '     CHECK    '$@;)
   467  QUIET_CLEAN    = $(Q:@=@echo    '     CLEAN    '$@;)
   468  QUIET_GENERATE = $(Q:@=@echo    '     GENERATE '$@;)
   469  QUIET_INST     = $(Q:@=@echo    '     INSTALL  '$@;)
   470  QUIET_TEST     = $(Q:@=@echo    '     TEST     '$@;)
   471  
   472  BUILDTAGS :=
   473  
   474  ifneq ($(FEATURE_SELINUX),no)
   475      SELINUXTAG := $(shell ./hack/selinux_tag.sh)
   476  
   477      ifneq ($(SELINUXTAG),)
   478          override FEATURE_SELINUX = yes
   479          BUILDTAGS += --tags "$(SELINUXTAG)"
   480      else
   481          ifeq ($(FEATURE_SELINUX),yes)
   482              $(error "ERROR: SELinux support requested, but libselinux is not available")
   483          endif
   484  
   485          override FEATURE_SELINUX = no
   486      endif
   487  endif
   488  
   489  # go build common flags
   490  BUILDFLAGS := -buildmode=pie ${BUILDTAGS}
   491  
   492  # whether stipping the binary
   493  ifeq ($(STRIP),yes)
   494         KATA_LDFLAGS := -ldflags "-w -s"
   495  endif
   496  
   497  # Return non-empty string if specified directory exists
   498  define DIR_EXISTS
   499  $(shell test -d $(1) && echo "$(1)")
   500  endef
   501  
   502  # $1: name of architecture to display
   503  define SHOW_ARCH
   504    $(shell printf "\\t%s%s\\\n" "$(1)" $(if $(filter $(ARCH),$(1))," (default)",""))
   505  endef
   506  
   507  all: runtime containerd-shim-v2 netmon
   508  
   509  # Targets that depend on .git-commit can use $(shell cat .git-commit) to get a
   510  # git revision string.  They will only be rebuilt if the revision string
   511  # actually changes.
   512  .PHONY: .git-commit.tmp
   513  .git-commit: .git-commit.tmp
   514  	@cmp $< $@ >/dev/null 2>&1 || cp $< $@
   515  .git-commit.tmp:
   516  	@echo -n "$$(git rev-parse HEAD 2>/dev/null)" >$@
   517  	@test -n "$$(git status --porcelain --untracked-files=no)" && echo -n "-dirty" >>$@ || true
   518  
   519  containerd-shim-v2: $(SHIMV2_OUTPUT)
   520  
   521  netmon: $(NETMON_TARGET_OUTPUT)
   522  
   523  $(NETMON_TARGET_OUTPUT): $(SOURCES) VERSION
   524  	$(QUIET_BUILD)(cd $(NETMON_DIR) && go build $(BUILDFLAGS) -o $@ -ldflags "-X main.version=$(VERSION)" $(KATA_LDFLAGS))
   525  
   526  runtime: $(TARGET_OUTPUT) $(CONFIGS)
   527  .DEFAULT: default
   528  
   529  build: default
   530  
   531  #Install an executable file
   532  # params:
   533  # $1 : file to install
   534  # $2 : directory path where file will be installed
   535  define INSTALL_EXEC
   536  	install -D $1 $(DESTDIR)$2/$(notdir $1);
   537  endef
   538  
   539  # Install a configuration file
   540  # params:
   541  # $1 : file to install
   542  # $2 : directory path where file will be installed
   543  define INSTALL_CONFIG
   544  	install --mode 0644 -D $1 $(DESTDIR)$2/$(notdir $1);
   545  endef
   546  
   547  # Returns the name of the kernel file to use based on the provided KERNELTYPE.
   548  # $1 : KERNELTYPE (compressed or uncompressed)
   549  define MAKE_KERNEL_NAME
   550  $(if $(findstring uncompressed,$1),vmlinux.container,vmlinuz.container)
   551  endef
   552  
   553  define MAKE_KERNEL_VIRTIOFS_NAME
   554  $(if $(findstring uncompressed,$1),vmlinux-virtiofs.container,vmlinuz-virtiofs.container)
   555  endef
   556  
   557  
   558  GENERATED_FILES += $(CLI_DIR)/config-generated.go
   559  GENERATED_FILES += pkg/katautils/config-settings.go
   560  
   561  $(TARGET_OUTPUT): $(SOURCES) $(GENERATED_FILES) $(MAKEFILE_LIST) | show-summary
   562  	$(QUIET_BUILD)(cd $(CLI_DIR) && go build $(KATA_LDFLAGS) $(BUILDFLAGS) -o $@ .)
   563  
   564  $(SHIMV2_OUTPUT): $(SOURCES) $(GENERATED_FILES) $(MAKEFILE_LIST)
   565  	$(QUIET_BUILD)(cd $(SHIMV2_DIR)/ && go build $(KATA_LDFLAGS) -i -o $@ .)
   566  
   567  .PHONY: \
   568  	check \
   569  	check-go-static \
   570  	check-go-test \
   571  	coverage \
   572  	default \
   573  	install \
   574  	show-header \
   575  	show-summary \
   576  	show-variables
   577  
   578  $(TARGET).coverage: $(SOURCES) $(GENERATED_FILES) $(MAKEFILE_LIST)
   579  	$(QUIET_TEST)go test -o $@ -covermode count
   580  
   581  GENERATED_FILES += $(CONFIGS)
   582  
   583  $(GENERATED_FILES): %: %.in $(MAKEFILE_LIST) VERSION .git-commit
   584  	$(QUIET_GENERATE)$(SED) \
   585  		-e "s|@COMMIT@|$(shell cat .git-commit)|g" \
   586  		-e "s|@VERSION@|$(VERSION)|g" \
   587  		-e "s|@CONFIG_ACRN_IN@|$(CONFIG_ACRN_IN)|g" \
   588  		-e "s|@CONFIG_QEMU_IN@|$(CONFIG_QEMU_IN)|g" \
   589  		-e "s|@CONFIG_QEMU_VIRTIOFS_IN@|$(CONFIG_QEMU_VIRTIOFS_IN)|g" \
   590  		-e "s|@CONFIG_CLH_IN@|$(CONFIG_CLH_IN)|g" \
   591  		-e "s|@CONFIG_FC_IN@|$(CONFIG_FC_IN)|g" \
   592  		-e "s|@CONFIG_PATH@|$(CONFIG_PATH)|g" \
   593  		-e "s|@FCPATH@|$(FCPATH)|g" \
   594  		-e "s|@FCJAILERPATH@|$(FCJAILERPATH)|g" \
   595  		-e "s|@ACRNPATH@|$(ACRNPATH)|g" \
   596  		-e "s|@ACRNCTLPATH@|$(ACRNCTLPATH)|g" \
   597  		-e "s|@CLHPATH@|$(CLHPATH)|g" \
   598  		-e "s|@SYSCONFIG@|$(SYSCONFIG)|g" \
   599  		-e "s|@IMAGEPATH@|$(IMAGEPATH)|g" \
   600  		-e "s|@KERNELPATH_ACRN@|$(KERNELPATH_ACRN)|g" \
   601  		-e "s|@KERNELPATH_FC@|$(KERNELPATH_FC)|g" \
   602  		-e "s|@KERNELPATH_CLH@|$(KERNELPATH_CLH)|g" \
   603  		-e "s|@KERNELPATH@|$(KERNELPATH)|g" \
   604  		-e "s|@KERNELVIRTIOFSPATH@|$(KERNELVIRTIOFSPATH)|g" \
   605  		-e "s|@INITRDPATH@|$(INITRDPATH)|g" \
   606  		-e "s|@FIRMWAREPATH@|$(FIRMWAREPATH)|g" \
   607  		-e "s|@MACHINEACCELERATORS@|$(MACHINEACCELERATORS)|g" \
   608  		-e "s|@CPUFEATURES@|$(CPUFEATURES)|g" \
   609  		-e "s|@FIRMWAREPATH_CLH@|$(FIRMWAREPATH_CLH)|g" \
   610  		-e "s|@DEFMACHINETYPE_CLH@|$(DEFMACHINETYPE_CLH)|g" \
   611  		-e "s|@KERNELPARAMS@|$(KERNELPARAMS)|g" \
   612  		-e "s|@LOCALSTATEDIR@|$(LOCALSTATEDIR)|g" \
   613  		-e "s|@PKGLIBEXECDIR@|$(PKGLIBEXECDIR)|g" \
   614  		-e "s|@PKGRUNDIR@|$(PKGRUNDIR)|g" \
   615  		-e "s|@PROXYPATH@|$(PROXYPATH)|g" \
   616  		-e "s|@NETMONPATH@|$(NETMONPATH)|g" \
   617  		-e "s|@PROJECT_BUG_URL@|$(PROJECT_BUG_URL)|g" \
   618  		-e "s|@PROJECT_URL@|$(PROJECT_URL)|g" \
   619  		-e "s|@PROJECT_NAME@|$(PROJECT_NAME)|g" \
   620  		-e "s|@PROJECT_TAG@|$(PROJECT_TAG)|g" \
   621  		-e "s|@PROJECT_TYPE@|$(PROJECT_TYPE)|g" \
   622  		-e "s|@QEMUPATH@|$(QEMUPATH)|g" \
   623  		-e "s|@QEMUVIRTIOFSPATH@|$(QEMUVIRTIOFSPATH)|g" \
   624  		-e "s|@RUNTIME_NAME@|$(TARGET)|g" \
   625  		-e "s|@MACHINETYPE@|$(MACHINETYPE)|g" \
   626  		-e "s|@SHIMPATH@|$(SHIMPATH)|g" \
   627  		-e "s|@DEFVCPUS@|$(DEFVCPUS)|g" \
   628  		-e "s|@DEFMAXVCPUS@|$(DEFMAXVCPUS)|g" \
   629  		-e "s|@DEFMAXVCPUS_ACRN@|$(DEFMAXVCPUS_ACRN)|g" \
   630  		-e "s|@DEFMEMSZ@|$(DEFMEMSZ)|g" \
   631  		-e "s|@DEFMEMSLOTS@|$(DEFMEMSLOTS)|g" \
   632  		-e "s|@DEFBRIDGES@|$(DEFBRIDGES)|g" \
   633  		-e "s|@DEFNETWORKMODEL_ACRN@|$(DEFNETWORKMODEL_ACRN)|g" \
   634  		-e "s|@DEFNETWORKMODEL_CLH@|$(DEFNETWORKMODEL_CLH)|g" \
   635  		-e "s|@DEFNETWORKMODEL_FC@|$(DEFNETWORKMODEL_FC)|g" \
   636  		-e "s|@DEFNETWORKMODEL_QEMU@|$(DEFNETWORKMODEL_QEMU)|g" \
   637  		-e "s|@DEFDISABLEGUESTSECCOMP@|$(DEFDISABLEGUESTSECCOMP)|g" \
   638  		-e "s|@DEFAULTEXPFEATURES@|$(DEFAULTEXPFEATURES)|g" \
   639  		-e "s|@DEFDISABLEBLOCK@|$(DEFDISABLEBLOCK)|g" \
   640  		-e "s|@DEFBLOCKSTORAGEDRIVER_ACRN@|$(DEFBLOCKSTORAGEDRIVER_ACRN)|g" \
   641  		-e "s|@DEFBLOCKSTORAGEDRIVER_FC@|$(DEFBLOCKSTORAGEDRIVER_FC)|g" \
   642  		-e "s|@DEFBLOCKSTORAGEDRIVER_QEMU@|$(DEFBLOCKSTORAGEDRIVER_QEMU)|g" \
   643  		-e "s|@DEFBLOCKSTORAGEDRIVER_QEMU_VIRTIOFS@|$(DEFBLOCKSTORAGEDRIVER_QEMU_VIRTIOFS)|g" \
   644  		-e "s|@DEFSHAREDFS@|$(DEFSHAREDFS)|g" \
   645  		-e "s|@DEFSHAREDFS_QEMU_VIRTIOFS@|$(DEFSHAREDFS_QEMU_VIRTIOFS)|g" \
   646  		-e "s|@DEFVIRTIOFSDAEMON@|$(DEFVIRTIOFSDAEMON)|g" \
   647  		-e "s|@DEFVIRTIOFSCACHESIZE@|$(DEFVIRTIOFSCACHESIZE)|g" \
   648  		-e "s|@DEFVIRTIOFSCACHE@|$(DEFVIRTIOFSCACHE)|g" \
   649  		-e "s|@DEFVIRTIOFSEXTRAARGS@|$(DEFVIRTIOFSEXTRAARGS)|g" \
   650  		-e "s|@DEFENABLEIOTHREADS@|$(DEFENABLEIOTHREADS)|g" \
   651  		-e "s|@DEFENABLEMEMPREALLOC@|$(DEFENABLEMEMPREALLOC)|g" \
   652  		-e "s|@DEFENABLEHUGEPAGES@|$(DEFENABLEHUGEPAGES)|g" \
   653  		-e "s|@DEFENABLEVHOSTUSERSTORE@|$(DEFENABLEVHOSTUSERSTORE)|g" \
   654  		-e "s|@DEFVHOSTUSERSTOREPATH@|$(DEFVHOSTUSERSTOREPATH)|g" \
   655  		-e "s|@DEFENABLEMSWAP@|$(DEFENABLESWAP)|g" \
   656  		-e "s|@DEFENABLEDEBUG@|$(DEFENABLEDEBUG)|g" \
   657  		-e "s|@DEFDISABLENESTINGCHECKS@|$(DEFDISABLENESTINGCHECKS)|g" \
   658  		-e "s|@DEFMSIZE9P@|$(DEFMSIZE9P)|g" \
   659  		-e "s|@DEFHOTPLUGVFIOONROOTBUS@|$(DEFHOTPLUGVFIOONROOTBUS)|g" \
   660  		-e "s|@DEFPCIEROOTPORT@|$(DEFPCIEROOTPORT)|g" \
   661  		-e "s|@DEFENTROPYSOURCE@|$(DEFENTROPYSOURCE)|g" \
   662  		-e "s|@DEFSANDBOXCGROUPONLY@|$(DEFSANDBOXCGROUPONLY)|g" \
   663  		-e "s|@FEATURE_SELINUX@|$(FEATURE_SELINUX)|g" \
   664  		$< > $@
   665  
   666  generate-config: $(CONFIGS)
   667  
   668  check: check-go-static
   669  
   670  test: go-test
   671  
   672  go-test: $(GENERATED_FILES)
   673  	$(QUIET_TEST).ci/go-test.sh
   674  
   675  check-go-static:
   676  	$(QUIET_CHECK).ci/static-checks.sh
   677  	$(QUIET_CHECK).ci/go-no-os-exit.sh ./cli
   678  	$(QUIET_CHECK).ci/go-no-os-exit.sh ./virtcontainers
   679  
   680  coverage:
   681  	$(QUIET_TEST).ci/go-test.sh html-coverage
   682  
   683  install: default install-runtime install-containerd-shim-v2 install-netmon
   684  
   685  install-bin: $(BINLIST)
   686  	$(QUIET_INST)$(foreach f,$(BINLIST),$(call INSTALL_EXEC,$f,$(BINDIR)))
   687  
   688  install-runtime: runtime install-scripts install-completions install-configs install-bin
   689  
   690  install-netmon: install-bin-libexec
   691  
   692  install-containerd-shim-v2: $(SHIMV2)
   693  	$(QUIET_INST)$(call INSTALL_EXEC,$<,$(BINDIR))
   694  
   695  install-bin-libexec: $(BINLIBEXECLIST)
   696  	$(QUIET_INST)$(foreach f,$(BINLIBEXECLIST),$(call INSTALL_EXEC,$f,$(PKGLIBEXECDIR)))
   697  
   698  install-configs: $(CONFIGS)
   699  	$(QUIET_INST)$(foreach f,$(CONFIGS),$(call INSTALL_CONFIG,$f,$(dir $(CONFIG_PATH))))
   700  	$(QUIET_INST)ln -sf $(DEFAULT_HYPERVISOR_CONFIG) $(DESTDIR)/$(CONFIG_PATH)
   701  
   702  install-scripts: $(SCRIPTS)
   703  	$(QUIET_INST)$(foreach f,$(SCRIPTS),$(call INSTALL_EXEC,$f,$(SCRIPTS_DIR)))
   704  
   705  install-completions:
   706  	$(QUIET_INST)install --mode 0644 -D  $(BASH_COMPLETIONS) $(DESTDIR)/$(BASH_COMPLETIONSDIR)/$(notdir $(BASH_COMPLETIONS));
   707  
   708  clean:
   709  	$(QUIET_CLEAN)rm -f $(TARGET) $(SHIMV2) $(NETMON_TARGET) $(CONFIGS) $(GENERATED_FILES) .git-commit .git-commit.tmp
   710  
   711  show-usage: show-header
   712  	@printf "• Overview:\n"
   713  	@printf "\n"
   714  	@printf "\tTo build $(TARGET), just run, \"make\".\n"
   715  	@printf "\n"
   716  	@printf "\tFor a verbose build, run \"make V=1\".\n"
   717  	@printf "\n"
   718  	@printf "• Additional targets:\n"
   719  	@printf "\n"
   720  	@printf "\tbuild                      : standard build (build everything).\n"
   721  	@printf "\tcheck                      : run tests.\n"
   722  	@printf "\tclean                      : remove built files.\n"
   723  	@printf "\tcontainerd-shim-v2         : only build containerd shim v2.\n"
   724  	@printf "\tcoverage                   : run coverage tests.\n"
   725  	@printf "\tdefault                    : same as 'make build' (or just 'make').\n"
   726  	@printf "\tgenerate-config            : create configuration file.\n"
   727  	@printf "\tinstall                    : install everything.\n"
   728  	@printf "\tinstall-containerd-shim-v2 : only install containerd shim v2 files.\n"
   729  	@printf "\tinstall-netmon             : only install netmon files.\n"
   730  	@printf "\tinstall-runtime            : only install runtime files.\n"
   731  	@printf "\tnetmon                     : only build netmon.\n"
   732  	@printf "\truntime                    : only build runtime.\n"
   733  	@printf "\tshow-arches                : show supported architectures (ARCH variable values).\n"
   734  	@printf "\tshow-summary               : show install locations.\n"
   735  	@printf "\n"
   736  
   737  handle_help: show-usage show-summary show-variables show-footer
   738  
   739  usage: handle_help
   740  help: handle_help
   741  
   742  show-variables:
   743  	@printf "• Variables affecting the build:\n\n"
   744  	@printf \
   745            "$(foreach v,$(sort $(USER_VARS)),$(shell printf "\\t$(v)='$($(v))'\\\n"))"
   746  	@printf "\n"
   747  
   748  show-header: .git-commit
   749  	@printf "%s - version %s (commit %s)\n\n" $(TARGET) $(VERSION) $(shell cat .git-commit)
   750  
   751  show-arches: show-header
   752  	@printf "Supported architectures (possible values for ARCH variable):\n\n"
   753  	@printf \
   754  		"$(foreach v,$(ALL_ARCHES),$(call SHOW_ARCH,$(v)))\n"
   755  
   756  show-footer:
   757  	@printf "• Project:\n"
   758  	@printf "\tHome: $(PROJECT_URL)\n"
   759  	@printf "\tBugs: $(PROJECT_BUG_URL)\n\n"
   760  
   761  show-summary: show-header
   762  ifneq (,$(golang_version_raw))
   763  	@printf "• architecture:\n"
   764  	@printf "\tHost: $(HOST_ARCH)\n"
   765  	@printf "\tgolang: $(GOARCH)\n"
   766  	@printf "\tBuild: $(ARCH)\n"
   767  	@printf "\n"
   768  	@printf "• golang:\n"
   769  	@printf "\t"
   770  	@go version
   771  else
   772  	@printf "• No GO command or GOPATH not set:\n"
   773  	@printf "\tCan only install prebuilt binaries\n"
   774  endif
   775  	@printf "\n"
   776  	@printf "• hypervisors:\n"
   777  	@printf "\tDefault: $(DEFAULT_HYPERVISOR)\n"
   778  	@printf "\tKnown: $(sort $(HYPERVISORS))\n"
   779  	@printf "\tAvailable for this architecture: $(sort $(KNOWN_HYPERVISORS))\n"
   780  	@printf "\n"
   781  	@printf "• Features:\n"
   782  	@printf "\tSELinux (FEATURE_SELINUX): $(FEATURE_SELINUX)\n"
   783  	@printf "\n"
   784  	@printf "• Summary:\n"
   785  	@printf "\n"
   786  	@printf "\tdestination install path (DESTDIR) : %s\n" $(abspath $(DESTDIR))
   787  	@printf "\tbinary installation path (BINDIR) : %s\n" $(abspath $(BINDIR))
   788  	@printf "\tbinaries to install :\n"
   789  	@printf \
   790            "$(foreach b,$(sort $(BINLIST)),$(shell printf "\\t - $(shell readlink -m $(DESTDIR)/$(BINDIR)/$(b))\\\n"))"
   791  	@printf \
   792            "$(foreach b,$(sort $(SHIMV2)),$(shell printf "\\t - $(shell readlink -m $(DESTDIR)/$(BINDIR)/$(b))\\\n"))"
   793  	@printf \
   794            "$(foreach b,$(sort $(BINLIBEXECLIST)),$(shell printf "\\t - $(shell readlink -m $(DESTDIR)/$(PKGLIBEXECDIR)/$(b))\\\n"))"
   795  	@printf \
   796            "$(foreach s,$(sort $(SCRIPTS)),$(shell printf "\\t - $(shell readlink -m $(DESTDIR)/$(BINDIR)/$(s))\\\n"))"
   797  	@printf "\tconfigs to install (CONFIGS) :\n"
   798  	@printf \
   799  	  "$(foreach c,$(sort $(CONFIGS)),$(shell printf "\\t - $(c)\\\n"))"
   800  	@printf "\tinstall paths (CONFIG_PATHS) :\n"
   801  	@printf \
   802  	  "$(foreach c,$(sort $(CONFIG_PATHS)),$(shell printf "\\t - $(c)\\\n"))"
   803  	@printf "\talternate config paths (SYSCONFIG_PATHS) : %s\n"
   804  	@printf \
   805  	  "$(foreach c,$(sort $(SYSCONFIG_PATHS)),$(shell printf "\\t - $(c)\\\n"))"
   806  
   807  	@printf "\tdefault install path for $(DEFAULT_HYPERVISOR) (CONFIG_PATH) : %s\n" $(abspath $(CONFIG_PATH))
   808  	@printf "\tdefault alternate config path (SYSCONFIG) : %s\n" $(abspath $(SYSCONFIG))
   809  ifneq (,$(findstring $(HYPERVISOR_QEMU),$(KNOWN_HYPERVISORS)))
   810  	@printf "\t$(HYPERVISOR_QEMU) hypervisor path (QEMUPATH) : %s\n" $(abspath $(QEMUPATH))
   811  endif
   812  ifneq (,$(findstring $(HYPERVISOR_QEMU_VIRTIOFS),$(KNOWN_HYPERVISORS)))
   813  	@printf "\t$(HYPERVISOR_QEMU_VIRTIOFS) hypervisor path (QEMUVIRTIOFSPATH) : %s\n" $(abspath $(QEMUVIRTIOFSPATH))
   814  endif
   815  ifneq (,$(findstring $(HYPERVISOR_CLH),$(KNOWN_HYPERVISORS)))
   816  	@printf "\t$(HYPERVISOR_CLH) hypervisor path (CLHPATH) : %s\n" $(abspath $(CLHPATH))
   817  endif
   818  ifneq (,$(findstring $(HYPERVISOR_FC),$(KNOWN_HYPERVISORS)))
   819  	@printf "\t$(HYPERVISOR_FC) hypervisor path (FCPATH) : %s\n" $(abspath $(FCPATH))
   820  endif
   821  ifneq (,$(findstring $(HYPERVISOR_ACRN),$(KNOWN_HYPERVISORS)))
   822  	@printf "\t$(HYPERVISOR_ACRN) hypervisor path (ACRNPATH) : %s\n" $(abspath $(ACRNPATH))
   823  endif
   824  	@printf "\tassets path (PKGDATADIR) : %s\n" $(abspath $(PKGDATADIR))
   825  	@printf "\tproxy+shim path (PKGLIBEXECDIR) : %s\n" $(abspath $(PKGLIBEXECDIR))
   826  	@printf "\n"