acrn-hypervisor/debian/rules

412 lines
17 KiB
Makefile
Executable File

#!/usr/bin/make -f
include /usr/share/dpkg/pkg-info.mk
include /usr/share/dpkg/vendor.mk
# See debhelper(7) (uncomment to enable)
# output every command that modifies files on the build system.
#export DH_VERBOSE = 1
# python packages do not contain any tests
export PYBUILD_DISABLE=test
export MAKEFLAGS = --no-print-directory
# helper to compare strings
strequ=$(if $(subst x$1,,x$2)$(subst x$2,,x$1),,1)
bold := $(shell which tput >/dev/null 2>&1 && tput bold 2>/dev/null)
sgr0 := $(shell which tput >/dev/null 2>&1 && tput sgr0 2>/dev/null)
# special characters
empty :=
space := $(empty) $(empty)
comma := ,
# helper to create comma separated list from space separated list
commasep = $(subst $(space),$(comma)$(space),$1)
# recursive wildcard
rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d))
# remove double quotes
unquote = $(subst $\",,$1)
# set these variables to define build of certain boards/scenarios, e.g.
ACRN_BOARDLIST ?=
ACRN_SCENARIOLIST ?=
# for now build the debug versions
# set to y for RELEASE build
export RELEASE ?= n
# eventually add-in locally contributed configurations
-include debian/configs/configurations.mk
debian/configs/configurations.mk:
@:
# misc/config_tools/data: contains ACRN supported configuration
# debian/configs: add additional, unsupported configurations here!
CONFIGDIRS ?= misc/config_tools/data debian/configs
CONFIGXMLS := $(call rwildcard,$(CONFIGDIRS),*.xml)
# get relevant data from acrn-config attributes of an XML
#
# This evaluates the attributes of acn-config tag got from xmllint (after unquoting).
# It create the following variables:
# * boardlist: accumulated list of all board configurations detected
# * scenariolist_<board>: accumulated list of sceanrios for the given <board>
# * config_<board>: respective board configuration file
# * config_<board>_<scenario>: respective scenario configuration file
define get-xml-data
$(eval $(call unquote,$(shell xmllint --xpath '/acrn-config/@board' $1 2>/dev/null)))
$(eval $(if $(board), \
$(eval config_$(board) := $1) \
$(eval boardlist := $(sort $(boardlist) $(board))) \
$(foreach f,$(wildcard $(addprefix $(dir $1),*.xml)), \
$(if $(strip $(shell xmllint --xpath '/acrn-config/@board' $f 2>/dev/null)),, \
$(if $(subst scenario.xml,,$(notdir $f)), \
$(eval scenario = $(basename $(notdir $f))), \
$(eval scenario = $(notdir $(abspath $(dir $f))))) \
$(eval config_$(board)_$(scenario) := $f) \
$(eval scenariolist_$(board) := $(sort $(scenariolist_$(board)) $(scenario))) \
) \
) \
))
$(eval undefine scenario)
$(eval undefine board)
endef
# get all XML data
$(foreach xml,$(CONFIGXMLS),$(call get-xml-data,$(xml)))
# honor variable ACRN_BOARDLIST by filtering the discovered board configurations accordingly
ifneq ($(ACRN_BOARDLIST),)
boardlist := $(sort $(filter $(boardlist),$(ACRN_BOARDLIST)))
endif
# honor variable ACRN_SCENARIOLIST by filtering the discovered scenario configurations
ifneq ($(ACRN_SCENARIOLIST),)
$(foreach b,$(boardlist),$(eval scenariolist_$(b) := $(filter $(scenariolist_$(b)),$(ACRN_SCENARIOLIST))))
endif
# only keep boards with at least one valid scenario configuration
boardlist := $(foreach b,$(boardlist),$(if $(scenariolist_$(b)),$b))
# assert nonempty boardlist
ifeq ($(boardlist),)
$(error No valid board/scenario configurations specified/found)
endif
# board config name -> board config file
bfile = $(abspath $(config_$1))
# board/scenario config name -> scenario config file
sfile = $(abspath $(config_$1_$2))
# uncomment for debugging purposes
# $(info boardlist: $(boardlist))
# $(foreach b,$(boardlist),$(info scenariolist_$(b): $(scenariolist_$(b))))
# $(foreach b,$(boardlist),$(info config_$(b): $(config_$(b))))
# $(foreach b,$(boardlist),$(foreach s,$(scenariolist_$(b)),$(info config_$(b)_$(s): $(config_$(b)_$(s)))))
# get version data for ACRN
include VERSION
export ACRNVERSION := $(MAJOR_VERSION).$(MINOR_VERSION)
# set paths (see also paths.make)
export prefix = /usr
export bindir = $(prefix)/bin
export libdir = $(prefix)/lib/$(DEB_HOST_MULTIARCH)
export nonarchlibdir = $(prefix)/lib
export datadir = $(prefix)/share
export includedir = $(prefix)/include
export systemd_unitdir = /lib/systemd
export docdir = $(datadir)/doc
export sysconfdir = /etc
export BUILD_VERSION = "$(DEB_VERSION_UPSTREAM)"
export BUILD_TAG = "$(DEB_VENDOR)/$(DEB_VERSION)"
# set iASL compiler
ifeq ($(ASL_COMPILER),)
export ASL_COMPILER:=$(shell which iasl)
ifeq ($(ASL_COMPILER),)
$(error ASL_COMPILER missing)
endif
endif
# let make verbosity be controlled by DH_VERBOSE
ifeq ($(DH_VERBOSE),1)
Q=
echo-verbose = echo " $@$(if $1,: $(bold)$1$(sgr0))"
echo-silent = true
devnull =
else
Q=@
echo-verbose = true
echo-silent = echo " $@$(if $1,: $(bold)$1$(sgr0))"
devnull = >/dev/null
endif
### dh_installdeb ############################################################
# create acrntools.install for debug build
ifeq ($(RELEASE),n)
debian/acrn-tools.install: debian/acrn-tools.install.debug
@$(call echo-verbose)
@$(call echo-silent,CREATE $@)
$(Q)cp $< $@
override_dh_install: debian/acrn-tools.install
$(Q)dh_install
endif
### dh_installdeb ############################################################
debian/acrn-hypervisor.postinst: debian/acrn-hypervisor.postinst.in
@$(call echo-verbose)
@$(call echo-silent,CREATE $@)
$(Q)sed -e 's/@acrnversion@/$(ACRNVERSION)/g' \
-e 's%@acrndir@%$(libdir)/acrn%g' $< > $@
debian/acrn-hypervisor.postrm: debian/acrn-hypervisor.postrm.in
@$(call echo-verbose)
@$(call echo-silent,CREATE $@)
$(Q)sed -e 's/@acrnversion@/$(ACRNVERSION)/g' $< > $@
debian/acrn-hypervisor.prerm: debian/acrn-hypervisor.prerm.in
@$(call echo-verbose)
@$(call echo-silent,CREATE $@)
$(Q)sed -e 's/@acrnversion@/$(ACRNVERSION)/g' $< > $@
override_dh_installdeb: debian/acrn-hypervisor.postinst debian/acrn-hypervisor.postrm debian/acrn-hypervisor.prerm
$(Q)dh_installdeb
### dh_installdebconf-arch ###################################################
debian/acrn-hypervisor.templates: debian/acrn-hypervisor.templates.in
@$(call echo-verbose)
@$(call echo-silent,CREATE $@)
$(Q)sed -e 's/@boardlist@/$(call commasep,$(boardlist))/g' $< > $@
debian/acrn-hypervisor.config: debian/acrn-hypervisor.config.in
@$(call echo-verbose)
@$(call echo-silent,CREATE $@)
@# create scenarios as bash associative array
$(Q)sed -e 's%@acrndir@%$(libdir)/acrn%g' \
-e 's%@scenarios@%($(foreach b,$(boardlist),[$b]="$(call commasep,$(scenariolist_$b))"))%g' $< > $@
override_dh_installdebconf-arch: debian/acrn-hypervisor.templates debian/acrn-hypervisor.config
$(Q)dh_installdebconf -a
### build-arch ###############################################################
override_dh_auto_build-arch: O=build
override_dh_auto_build-arch:
@$(call echo-verbose)
@# Only build lifemngr here, since other parts are built during
@# dh_auto_install (even if built here). This is deficiency
@# of ACRN's makefile structure, e.g. make hypervisor-install
@# always rebuilds the hypervisor, even if built with
@# make hypervisor in a previous step.
$(Q)set -e; $(call echo-silent,BUILD life_mngr)
$(Q)mkdir -p $(O)/common/misc
$(Q)$(MAKE) -C misc \
OUT_DIR=$(abspath $(O)/common/misc) \
life_mngr $(devnull)
### build-indep ##############################################################
ifeq ($(EXTRA_VERSION),)
ACRN_DOC_VERSION := $(DEB_VERSION_UPSTREAM)
else
ACRN_DOC_VERSION := latest
endif
build/documentation/html/index.html: debian/acrn-doc-index-html.in
@$(call echo-verbose)
@$(call echo-silent,BUILD documentation)
$(Q)mkdir -p $(@D)
$(Q)sed -e 's/@acrnversion@/$(ACRN_DOC_VERSION)/g' $< > $@
override_dh_auto_build-indep: build/documentation/html/index.html
@$(call echo-verbose)
@$(call echo-silent,BUILD acrn-board-inspector)
$(Q)export PYBUILD_NAME=acrn_board_inspector; \
dh_auto_build \
--buildsystem=pybuild \
--package=python3-acrn-board-inspector \
--sourcedirectory=debian/acrn-board-inspector $(devnull)
### binary-arch ##############################################################
# check_post_launched <configfile>
# Checks if there is a POST_LAUNCHED_VM configured in the given config file
# returns empty string (i.e. false) if there is no POST_LAUNCHED_VM detected
check_post_launched=$(strip $(shell xmllint --xpath '//vm[load_order="POST_LAUNCHED_VM"]/@id' $1 2>/dev/null || true))
# helper to determine if there are any POST_LAUNCHED VMs in any configuration
check_any_post_launched=$(strip $(foreach b,$(boardlist),$(foreach s,$(scenariolist_$b),$(call check_post_launched,$(call sfile,$b,$s)))))
# dynamically generate acrn-hypervisor.install to conditionally add launch script directory
debian/acrn-hypervisor.install:
@$(call echo-verbose)
@$(call echo-silent,CREATE $@)
$(Q)echo "usr/lib/x86_64-linux-gnu/acrn/*" >$@
$(Q)if [ -n "$(call check_any_post_launched)" ]; then echo "usr/share/acrn/launch-scripts/" >>$@; fi
.PHONY: debian/acrn-hypervisor.install
override_dh_auto_install-arch: O=build
override_dh_auto_install-arch: DESTDIR=$(abspath debian/tmp)
override_dh_auto_install-arch: debian/acrn-hypervisor.install
@$(call echo-verbose)
$(Q)set -e;$(foreach b,$(boardlist),$(foreach s,$(scenariolist_$b), \
$(call echo-silent,BUILD & INSTALL hypervisor for $b:$s); \
$(MAKE) O=$(O)/$b/$s \
BOARD=$(call bfile,$b) \
SCENARIO=$(call sfile,$b,$s) \
DESTDIR=$(DESTDIR) \
hypervisor-install $(devnull); \
install -d $(DESTDIR)$(libdir)/acrn/$b/$s; \
rm -f $(DESTDIR)$(libdir)/acrn/*.out; \
mv $(DESTDIR)$(libdir)/acrn/*.bin \
$(DESTDIR)$(libdir)/acrn/$b/$s; \
if [ -d $(DESTDIR)$(sysconfdir) ]; then \
mv $(DESTDIR)$(sysconfdir) \
$(DESTDIR)$(libdir)/acrn/$b/$s; \
fi; \
if [ -d $(DESTDIR)$(libdir)/acrn/acpi ]; then \
mv $(DESTDIR)$(libdir)/acrn/acpi \
$(DESTDIR)$(libdir)/acrn/$b/$s; \
fi; \
cp $(O)/$b/$s/hypervisor/configs/config.mk \
$(DESTDIR)$(libdir)/acrn/$b/$s/acrn.$b.$s.config; \
cp $(O)/$b/$s/hypervisor/acrn.map \
$(DESTDIR)$(libdir)/acrn/$b/$s/acrn.$b.$s.map; \
chmod 644 $(DESTDIR)$(libdir)/acrn/$b/$s/*.bin; \
if [ -d $(DESTDIR)$(libdir)/acrn/$b/$s/acpi ]; then \
chmod 644 $(DESTDIR)$(libdir)/acrn/$b/$s/acpi/*; \
fi; \
cp $(call sfile,$b,$s) $(DESTDIR)$(libdir)/acrn/$b/$s/scenario.xml; \
if [ -n "$(call check_post_launched,$(call sfile,$b,$s))" ]; then \
$(call echo-silent,CREATE launch scripts in $(datadir)/acrn/launch-scripts/$b/$s/); \
mkdir -p $(DESTDIR)$(datadir)/acrn/launch-scripts/$b/$s/; \
misc/config_tools/launch_config/launch_cfg_gen.py \
--board $(call bfile,$b) --scenario $(call sfile,$b,$s) \
--out $(DESTDIR)$(datadir)/acrn/launch-scripts/$b/$s \
$(devnull) 2>&1; \
chmod a+x $(DESTDIR)$(datadir)/acrn/launch-scripts/$b/$s/*; \
fi; \
) cp $(call bfile,$b) $(DESTDIR)$(libdir)/acrn/$b/board.xml;)
@:
@# install devicemodel & tools
@$(call echo-silent,BUILD & INSTALL devicemodel & tools)
$(Q)$(MAKE) O=$(O)/common DESTDIR=$(DESTDIR) devicemodel-install $(devnull)
$(Q)$(MAKE) O=$(O)/common DESTDIR=$(DESTDIR) tools-install $(devnull)
@:
@# install life_mngr
@$(call echo-silent,INSTALL life_mngr)
$(Q)mkdir -p $(O)/common/misc
$(Q)$(MAKE) -C misc \
DESTDIR=$(DESTDIR) \
OUT_DIR=$(abspath $(O)/common/misc) \
acrn-life-mngr-install $(devnull)
@# rename to acrn-lifemngr
$(Q)mv $(DESTDIR)$(bindir)/life_mngr $(DESTDIR)$(bindir)/acrn-lifemngr
@# install config file templates
$(Q)install -d $(DESTDIR)$(datadir)/acrn-lifemngr
$(Q)mv $(DESTDIR)$(sysconfdir)/life_mngr/life_mngr.conf \
$(DESTDIR)$(datadir)/acrn-lifemngr/life_mngr.conf.service_vm
$(Q)install -m 0644 debian/lifemngr/life_mngr.conf.user_vm $(DESTDIR)$(datadir)/acrn-lifemngr
@# install invocation helper
$(Q)install -m 0755 debian/lifemngr/start-acrn-lifemngr.sh $(DESTDIR)$(datadir)/acrn-lifemngr
@# adapt life_mngr.service
$(Q)mv $(DESTDIR)$(systemd_unitdir)/system/life_mngr.service \
$(DESTDIR)$(systemd_unitdir)/system/acrn-lifemngr.service
$(Q)sed -i -e 's#^ExecStart=.*#ExecStart=$(datadir)/acrn-lifemngr/start-acrn-lifemngr.sh#' \
$(DESTDIR)$(systemd_unitdir)/system/acrn-lifemngr.service
@:
@# move/adapt network configs as examples only
$(Q)mkdir -p $(DESTDIR)$(docdir)/acrnd/examples
$(Q)cp $(DESTDIR)$(systemd_unitdir)/network/* \
$(DESTDIR)$(docdir)/acrnd/examples
$(Q)sed -i 's/acrn_tap\* //g' \
$(DESTDIR)$(docdir)/acrnd/examples/50-acrn.network
@:
@# adapt systemd services for tools (available in DEBUG build only)
$(if $(call strequ,${RELEASE},n), \
$(Q)sed -i -e '/telemd.socket/d' -e '/prepare.service/d' \
$(DESTDIR)$(systemd_unitdir)/system/acrnprobe.service; \
sed -i '/telemd/d' \
$(DESTDIR)$(systemd_unitdir)/system/usercrash.service; \
install -d $(DESTDIR)$(datadir)/defaults/telemetrics; \
install -m 0644 -t $(DESTDIR)$(datadir)/defaults/telemetrics \
misc/debug_tools/acrn_crashlog/data/acrnprobe.xml; \
install -d $(DESTDIR)$(datadir)/acrn/scripts; \
cp -a misc/debug_tools/acrn_trace/scripts/* \
$(DESTDIR)$(datadir)/acrn/scripts; \
install -d $(DESTDIR)$(sysconfdir)/default; \
cp debian/acrnlog/acrnlog.default \
$(DESTDIR)$(sysconfdir)/default/acrnlog; \
sed -i -e 's#ExecStart=.*#EnvironmentFile=$(sysconfdir)/default/acrnlog\nExecStart=$(bindir)/acrnlog $${ACRNLOG_ARGS}#' \
$(DESTDIR)$(systemd_unitdir)/system/acrnlog.service \
)
### binary-indep #############################################################
override_dh_auto_install-indep: O=build
override_dh_auto_install-indep: DESTDIR=$(abspath debian/tmp)
override_dh_auto_install-indep:
@$(call echo-verbose)
@$(call echo-silent,INSTALL acrn-board-inspector)
$(Q)export PYBUILD_NAME=acrn_board_inspector; \
dh_auto_install \
--buildsystem=pybuild \
--package=python3-acrn-board-inspector \
--sourcedirectory=debian/acrn-board-inspector $(devnull)
@:
@$(call echo-silent,INSTALL documentation)
$(Q)mkdir -p ${DESTDIR}$(docdir)/acrn/
$(Q)cp -a $(O)/documentation/html ${DESTDIR}$(docdir)/acrn/
### dh_missing ###############################################################
override_dh_missing:
$(Q)dh_missing --fail-missing
### dh_installsystemd ########################################################
# do not start services at install, since they are most likely installed on a
# non-ACRN system
override_dh_installsystemd:
$(Q)dh_installsystemd --no-start
### dh_strip #################################################################
# only strip release variant binaries
override_dh_strip: DESTDIR=$(abspath debian/tmp)
override_dh_strip:
$(Q)dh_strip -X.out -X.bin
$(Q)strip --strip-debug \
--remove-section=.comment \
--remove-section=.note \
--enable-deterministic-archives \
$(DESTDIR)$(libdir)/libacrn-mngr.a;
### clean ####################################################################
override_dh_auto_clean:
@echo "Building ACRN $(ACRNVERSION) for boards: $(bold)$(call commasep,$(boardlist))$(sgr0)"
@echo "The scenarios used are:"
@$(foreach b,$(boardlist),echo " $b: $(bold)$(call commasep,$(scenariolist_$b))$(sgr0)";)
@$(call echo-verbose)
@$(call echo-silent,CLEAN)
$(Q)rm -rf .pybuild/
$(Q)find . -type d -name __pycache__ | xargs rm -rf
$(Q)rm -f debian/acrn-hypervisor.install
$(Q)rm -f debian/acrn-hypervisor.config
$(Q)rm -f debian/acrn-hypervisor.postinst
$(Q)rm -f debian/acrn-hypervisor.postrm
$(Q)rm -f debian/acrn-hypervisor.prerm
$(Q)rm -f debian/acrn-tools.install
$(Q)rm -f debian/acrn-hypervisor.templates
$(Q)rm -rf debian/acrn-board-inspector/build
$(Q)rm -rf debian/acrn-board-inspector/acrn_board_inspector.egg-info
$(Q)dh_auto_clean $(devnull)
### others ###################################################################
%:
$(Q)dh $@ --with python3