Files
acrn-hypervisor/debian/rules
Helmut Buchsbaum 9941c44bee debian/rules: Dynamically generate acrn-hypervisor.install
To be able to to conditionally add a launch script directory for
acrn-hypervisor package, the debian/acrn-hypervisor.install file must be
created dynamically. If there are only configurations (e.g. partitioned
scenarios) that do not need any launch scripts, we have to omit the
launch script directory entry in debian/acrn-hypervisor.install.

Tracked-On: #8263
Signed-off-by: Helmut Buchsbaum <helmut.buchsbaum@opensource.tttech-industrial.com>
2022-11-02 14:24:49 +08:00

398 lines
16 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 ?= whl-ipc-i5 nuc11tnbi5 cfl-k700-i7 tgl-vecow-spc-7100-Corei7
ACRN_SCENARIOLIST ?= partitioned shared hybrid hybrid_rt
# 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),*)), \
$(if $(strip $(shell xmllint --xpath '/acrn-config/@board' $f 2>/dev/null)),, \
$(eval scenario = $(basename $(notdir $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 ############################################################
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
@:
@# move devicemodel samples
$(Q)mkdir -p $(DESTDIR)$(docdir)/acrn-devicemodel
$(Q)mv $(DESTDIR)$(datadir)/acrn/samples \
$(DESTDIR)$(docdir)/acrn-devicemodel
@:
@# 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-hypervisor.templates
$(Q)rm -rf debian/acrn-board-inspector/build
$(Q)dh_auto_clean $(devnull)
### others ###################################################################
%:
$(Q)dh $@ --with python3