mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2026-01-13 19:44:06 +00:00
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>
398 lines
16 KiB
Makefile
Executable File
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
|