[Buildroot] [PATCH 1/1] Integration of system emulation in host-qemu package

Simon Maes simonn.maes at gmail.com
Thu Jan 28 10:07:26 UTC 2016


Qemu package in Buildroot now supports system emulation for host.
Additional configurations in Buildroot are:
- Qemu version and where to download the software
- Enable system or linux user-land emulation
- Enable SDL frontend and FDT support
- Enable Qemu debug
- Disable stripped binary format
- Save Qemu commandline arguments to run Qemu directly using
 'make qemu-system-run'

Support for VDE2 as host package is also added.

Signed-off-by: Simon Maes <simonn.maes at gmail.com>
---
 package/Config.in.host      |   1 +
 package/qemu/Config.in      |   8 +++
 package/qemu/Config.in.host | 160 ++++++++++++++++++++++++++++++++++++++++++++
 package/qemu/qemu.mk        | 104 +++++++++++++++++++++++-----
 package/vde2/Config.in.host |  14 ++++
 package/vde2/vde2.mk        |   1 +
 6 files changed, 271 insertions(+), 17 deletions(-)
 create mode 100644 package/vde2/Config.in.host

diff --git a/package/Config.in.host b/package/Config.in.host
index 8e6b870..17ecbf6 100644
--- a/package/Config.in.host
+++ b/package/Config.in.host
@@ -31,5 +31,6 @@ menu "Host utilities"
 	source "package/uboot-tools/Config.in.host"
 	source "package/util-linux/Config.in.host"
 	source "package/vboot-utils/Config.in.host"
+	source "package/vde2/Config.in.host"
 
 endmenu
diff --git a/package/qemu/Config.in b/package/qemu/Config.in
index 082b5ee..599af1e 100644
--- a/package/qemu/Config.in
+++ b/package/qemu/Config.in
@@ -36,6 +36,14 @@ config BR2_PACKAGE_QEMU
 
 if BR2_PACKAGE_QEMU
 
+config BR2_PACKAGE_QEMU_VERSION
+	string "qemu version"
+	default "2.5.0"
+	help
+	  QEMU version to use
+	  Sometimes the latest version is broken for some specific
+	  architecture or target machine
+
 comment "Emulators selection"
 
 config BR2_PACKAGE_QEMU_CUSTOM_TARGETS
diff --git a/package/qemu/Config.in.host b/package/qemu/Config.in.host
index c5c3f05..9bf578b 100644
--- a/package/qemu/Config.in.host
+++ b/package/qemu/Config.in.host
@@ -15,3 +15,163 @@ config BR2_PACKAGE_HOST_QEMU
 	  This option builds a user emulator for your selected architecture.
 
 	  http://www.qemu.org
+
+
+if BR2_PACKAGE_HOST_QEMU
+
+#
+# Version selection. We provide the choice between:
+#
+#  1. A single fairly recent stable version available on the official Qemu webpage
+#  2. A custom tarball
+#  3. A custom stable version available using git
+#  4. A custom stable version available using mercurial
+#  5. A custom stable version available local on your machine
+#
+choice
+	prompt "Qemu version"
+	default BR2_PACKAGE_HOST_QEMU_OFFICIAL_WEBPAGE
+
+config BR2_PACKAGE_HOST_QEMU_OFFICIAL_WEBPAGE
+	bool "Tarball from the Qemu download webpage"
+	help
+	  This option allows Buildroot to get the Qemu source
+	  code from the Qemu download webpage in tarball format.
+
+config BR2_PACKAGE_HOST_QEMU_CUSTOM_TARBALL
+	bool "Custom tarball"
+	help
+	  This option allows to specify a URL pointing to a Qemu source
+	  tarball. This URL can use any protocol recognized by Buildroot,
+	  like http://, ftp://, file:// or scp://.
+
+	  When pointing to a local tarball using file://, you may want to
+	  use a make variable like $(TOPDIR) to reference the root of the
+	  Buildroot tree.
+
+config BR2_PACKAGE_HOST_QEMU_CUSTOM_GIT
+	bool "Custom Git repository"
+	help
+	  This option allows Buildroot to get the Qemu source
+	  code from a Git repository.
+
+config BR2_PACKAGE_HOST_QEMU_CUSTOM_HG
+	bool "Custom Mercurial repository"
+	help
+	  This option allows Buildroot to get the Qemu source
+	  code from a Mercurial repository.
+
+config BR2_PACKAGE_HOST_QEMU_CUSTOM_LOCAL
+	bool "Local directory"
+	help
+	  This option allows Buildroot to get the Qemu source
+	  code from a local directory.
+
+endchoice
+
+config BR2_PACKAGE_HOST_QEMU_OFFICIAL_WEBPAGE_VERSION
+	string "host qemu version"
+	default "2.5.0"
+	help
+	  QEMU version to use for host
+	  Sometimes the latest version is broken for some specific
+	  architecture or target machine
+	depends on BR2_PACKAGE_HOST_QEMU_OFFICIAL_WEBPAGE
+
+config BR2_PACKAGE_HOST_QEMU_CUSTOM_TARBALL_LOCATION
+	string "URL of custom Qemu tarball"
+	depends on BR2_PACKAGE_HOST_QEMU_CUSTOM_TARBALL
+
+config BR2_PACKAGE_HOST_QEMU_CUSTOM_REPO_URL
+	string "URL of custom repository"
+	depends on BR2_PACKAGE_HOST_QEMU_CUSTOM_GIT || BR2_PACKAGE_HOST_QEMU_CUSTOM_HG
+
+config BR2_PACKAGE_HOST_QEMU_CUSTOM_REPO_VERSION
+	string "Custom repository version"
+	help
+	  Revision to use in the typical format used by Git/Mercurial
+	  E.G. a sha id, a tag, branch, ..
+	depends on BR2_PACKAGE_HOST_QEMU_CUSTOM_GIT || BR2_PACKAGE_HOST_QEMU_CUSTOM_HG
+
+config BR2_PACKAGE_HOST_QEMU_CUSTOM_LOCAL_PATH
+	string "Path to the local directory"
+	depends on BR2_PACKAGE_HOST_QEMU_CUSTOM_LOCAL
+	help
+	  Path to the local directory with the Qemu source code.
+
+config BR2_PACKAGE_HOST_QEMU_VERSION
+	string
+	default BR2_PACKAGE_HOST_QEMU_OFFICIAL_WEBPAGE_VERSION if BR2_PACKAGE_HOST_QEMU_OFFICIAL_WEBPAGE
+	default "custom-tar" if BR2_LINUX_KERNEL_CUSTOM_TARBALL
+	default BR2_PACKAGE_HOST_QEMU_CUSTOM_REPO_VERSION \
+		if BR2_PACKAGE_HOST_QEMU_CUSTOM_GIT || BR2_PACKAGE_HOST_QEMU_CUSTOM_HG
+	default "custom-local" if BR2_PACKAGE_HOST_QEMU_CUSTOM_LOCAL
+
+#
+# Configuration selection
+#
+
+comment "Emulators selection"
+
+config BR2_PACKAGE_HOST_QEMU_SYSTEM_MODE
+	bool "Enable systems emulation"
+	depends on !BR2_STATIC_LIBS # dtc
+	select BR2_PACKAGE_HOST_QEMU_FDT
+	help
+	  Say 'y' to build system emulators/virtualisers.
+	  When building the host-qemu package for system emulation, qemu will be configured to support the Target Architecture, configured in Buildroot
+
+config BR2_PACKAGE_HOST_QEMU_LINUX_USER_MODE
+	bool "Enable Linux user-land emulation"
+	help
+	  Say 'y' to build Linux user-land emulators.
+
+config BR2_PACKAGE_HOST_QEMU_HAS_EMULS
+	def_bool y
+	depends on BR2_PACKAGE_HOST_QEMU_SYSTEM_MODE || BR2_PACKAGE_HOST_QEMU_LINUX_USER_MODE
+
+if BR2_PACKAGE_HOST_QEMU_HAS_EMULS
+
+comment "Frontends"
+
+config BR2_PACKAGE_HOST_QEMU_SDL
+	bool "Enable SDL frontend"
+	select BR2_PACKAGE_SDL
+	help
+	  Say 'y' to enable the SDL frontend, that is, a graphical window
+	  presenting the VM's display.
+
+comment "Misc. features"
+
+config BR2_PACKAGE_HOST_QEMU_FDT
+	bool "Enable FDT"
+	depends on !BR2_STATIC_LIBS # dtc
+	select BR2_PACKAGE_DTC
+	help
+	  Say 'y' here to have QEMU capable of constructing Device Trees,
+	  and passing them to the VMs.
+
+comment "FDT support needs a toolchain w/ dynamic library"
+	depends on BR2_STATIC_LIBS
+
+endif # BR2_PACKAGE_HOST_QEMU_HAS_EMULS
+
+config BR2_PACKAGE_HOST_QEMU_DEBUG
+	bool "Enable debug"
+	help
+	  Say 'y' here to enable common debug build options for QEMU.
+
+config BR2_PACKAGE_HOST_QEMU_STRIP_BINARY
+	bool "Enable stripped binary format"
+	help
+	  Say 'y' here to enable stripping QEMU binary.
+
+config BR2_PACKAGE_HOST_QEMU_SYSTEM_ARGS
+	string "qemu-system command arguments"
+	depends on BR2_PACKAGE_HOST_QEMU_SYSTEM_MODE
+	help
+	  Arguments to be used for your target host-qemu-system to run
+	  via "make qemu-system-run".
+
+
+endif # BR2_PACKAGE_HOST_QEMU
diff --git a/package/qemu/qemu.mk b/package/qemu/qemu.mk
index 1b08b42..82e34e7 100644
--- a/package/qemu/qemu.mk
+++ b/package/qemu/qemu.mk
@@ -4,17 +4,38 @@
 #
 ################################################################################
 
-QEMU_VERSION = 2.5.0
-QEMU_SOURCE = qemu-$(QEMU_VERSION).tar.bz2
-QEMU_SITE = http://wiki.qemu.org/download
-QEMU_LICENSE = GPLv2, LGPLv2.1, MIT, BSD-3c, BSD-2c, Others/BSD-1c
-QEMU_LICENSE_FILES = COPYING COPYING.LIB
-# NOTE: there is no top-level license file for non-(L)GPL licenses;
+#-------------------------------------------------------------
+# Host-qemu
+
+HOST_QEMU_VERSION = $(call qstrip,$(BR2_PACKAGE_HOST_QEMU_VERSION))
+HOST_QEMU_LICENSE = GPLv2, LGPLv2.1, MIT, BSD-3c, BSD-2c, Others/BSD-1c
+HOST_QEMU_LICENSE_FILES = COPYING COPYING.LIB
+# NOTE: there is no top-level license file for non-(L)GPL licenses;
 #       the non-(L)GPL license texts are specified in the affected
 #       individual source files.
 
-#-------------------------------------------------------------
-# Host-qemu
+# Compute HOST_QEMU_SOURCE and HOST_QEMU_SITE from the configuration
+ifeq ($(BR2_PACKAGE_HOST_QEMU_OFFICIAL_WEBPAGE),y)
+HOST_QEMU_SITE = http://wiki.qemu.org/download
+HOST_QEMU_SOURCE = qemu-$(HOST_QEMU_VERSION).tar.bz2
+else ifeq ($(BR2_PACKAGE_HOST_QEMU_CUSTOM_TARBALL),y)
+HOST_QEMU_TARBALL = $(call qstrip,$(BR2_PACKAGE_HOST_QEMU_CUSTOM_TARBALL_LOCATION))
+HOST_QEMU_SITE = $(patsubst %/,%,$(dir $(HOST_QEMU_TARBALL)))
+HOST_QEMU_SOURCE = $(notdir $(HOST_QEMU_TARBALL))
+BR_NO_CHECK_HASH_FOR += $(HOST_QEMU_SOURCE)
+# Overwrite HOST_QEMU_VERSION so that HOST_QEMU_DIR becomes unique, in which case a
+# change in the HOST_QEMU_TARBALL configuration automatically gets picked up.
+HOST_QEMU_VERSION = custom-$(HOST_QEMU_TARBALL)
+else ifeq ($(BR2_PACKAGE_HOST_QEMU_CUSTOM_GIT),y)
+HOST_QEMU_SITE = $(call qstrip,$(BR2_PACKAGE_HOST_QEMU_CUSTOM_REPO_URL))
+HOST_QEMU_SITE_METHOD = git
+else ifeq ($(BR2_PACKAGE_HOST_QEMU_CUSTOM_HG),y)
+HOST_QEMU_SITE = $(call qstrip,$(BR2_PACKAGE_HOST_QEMU_CUSTOM_REPO_URL))
+HOST_QEMU_SITE_METHOD = hg
+else ifeq ($(BR2_PACKAGE_HOST_QEMU_CUSTOM_LOCAL),y)
+HOST_QEMU_SITE = $(call qstrip,$(BR2_PACKAGE_HOST_QEMU_CUSTOM_LOCAL_PATH))
+HOST_QEMU_SITE_METHOD = local
+endif
 
 HOST_QEMU_DEPENDENCIES = host-pkgconf host-python host-zlib host-libglib2 host-pixman
 
@@ -62,7 +83,6 @@ endif
 ifeq ($(HOST_QEMU_ARCH),sh4aeb)
 HOST_QEMU_ARCH = sh4eb
 endif
-HOST_QEMU_TARGETS = $(HOST_QEMU_ARCH)-linux-user
 
 ifeq ($(BR2_PACKAGE_HOST_QEMU),y)
 HOST_QEMU_HOST_SYSTEM_TYPE = $(shell uname -s)
@@ -70,10 +90,12 @@ ifneq ($(HOST_QEMU_HOST_SYSTEM_TYPE),Linux)
 $(error "qemu-user can only be used on Linux hosts")
 endif
 
-# kernel version as major*256 + minor
-HOST_QEMU_HOST_SYSTEM_VERSION = $(shell uname -r | awk -F. '{ print $$1 * 256 + $$2 }')
-HOST_QEMU_TARGET_SYSTEM_VERSION = $(shell echo $(BR2_TOOLCHAIN_HEADERS_AT_LEAST) | awk -F. '{ print $$1 * 256 + $$2 }')
-HOST_QEMU_COMPARE_VERSION = $(shell test $(HOST_QEMU_HOST_SYSTEM_VERSION) -ge $(HOST_QEMU_TARGET_SYSTEM_VERSION) && echo OK)
+ifeq ($(BR2_PACKAGE_HOST_QEMU_SYSTEM_MODE),y)
+HOST_QEMU_TARGETS += $(HOST_QEMU_ARCH)-softmmu
+HOST_QEMU_OPTS += --enable-system
+else
+HOST_QEMU_OPTS += --disable-system
+endif
 
 #
 # The principle of qemu-user is that it emulates the instructions of
@@ -85,15 +107,42 @@ HOST_QEMU_COMPARE_VERSION = $(shell test $(HOST_QEMU_HOST_SYSTEM_VERSION) -ge $(
 # built with kernel headers that are older or the same as the kernel
 # version running on the host machine.
 #
+
+ifeq ($(BR2_PACKAGE_HOST_QEMU_LINUX_USER_MODE),y)
+HOST_QEMU_TARGETS += $(HOST_QEMU_ARCH)-linux-user
+HOST_QEMU_OPTS += --enable-linux-user
+
+# kernel version as major*256 + minor
+HOST_QEMU_HOST_SYSTEM_VERSION = $(shell uname -r | awk -F. '{ print $$1 * 256 + $$2 }')
+HOST_QEMU_TARGET_SYSTEM_VERSION = $(shell echo $(BR2_TOOLCHAIN_HEADERS_AT_LEAST) | awk -F. '{ print $$1 * 256 + $$2 }')
+HOST_QEMU_COMPARE_VERSION = $(shell test $(HOST_QEMU_HOST_SYSTEM_VERSION) -ge $(HOST_QEMU_TARGET_SYSTEM_VERSION) && echo OK)
+
 ifeq ($(BR_BUILDING),y)
 ifneq ($(HOST_QEMU_COMPARE_VERSION),OK)
 $(error "Refusing to build qemu-user: target Linux version newer than host's.")
 endif
 endif
+
+else
+HOST_QEMU_OPTS += --disable-linux-user
+endif
+endif
+
+ifeq ($(BR2_PACKAGE_HOST_QEMU_DEBUG),y)
+HOST_QEMU_OPTS += --enable-debug
+endif
+
+ifeq ($(BR2_PACKAGE_HOST_QEMU_STRIP_BINARY),n)
+HOST_QEMU_OPTS += --disable-strip
+endif
+
+ifeq ($(BR2_PACKAGE_HOST_VDE2),y)
+HOST_QEMU_OPTS += --enable-vde
+HOST_QEMU_DEPENDENCIES += host-vde2
 endif
 
 define HOST_QEMU_CONFIGURE_CMDS
-	cd $(@D); $(HOST_CONFIGURE_OPTS) ./configure    \
+	( cd $(@D); $(HOST_CONFIGURE_OPTS) ./configure    \
 		--target-list="$(HOST_QEMU_TARGETS)"    \
 		--prefix="$(HOST_DIR)/usr"              \
 		--interp-prefix=$(STAGING_DIR)          \
@@ -101,7 +150,9 @@ define HOST_QEMU_CONFIGURE_CMDS
 		--host-cc="$(HOSTCC)"                   \
 		--python=$(HOST_DIR)/usr/bin/python2    \
 		--extra-cflags="$(HOST_CFLAGS)"         \
-		--extra-ldflags="$(HOST_LDFLAGS)"
+		--extra-ldflags="$(HOST_LDFLAGS)"       \
+		$(HOST_QEMU_OPTS)                            \
+)
 endef
 
 define HOST_QEMU_BUILD_CMDS
@@ -115,11 +166,30 @@ endef
 $(eval $(host-generic-package))
 
 # variable used by other packages
-QEMU_USER = $(HOST_DIR)/usr/bin/qemu-$(HOST_QEMU_ARCH)
+HOST_QEMU_USER = $(HOST_DIR)/usr/bin/qemu-$(HOST_QEMU_ARCH)
 
-#-------------------------------------------------------------
+ifeq ($(BR2_PACKAGE_HOST_QEMU_SYSTEM_MODE),y)
+HOST_QEMU_SYSTEM = $(HOST_DIR)/usr/bin/qemu-system-$(HOST_QEMU_ARCH)
+
+.PHONY: qemu-system-run
+qemu-system-run:
+	$(HOST_QEMU_SYSTEM) $(call qstrip,$(BR2_PACKAGE_HOST_QEMU_SYSTEM_ARGS))
+endif
+
+#------------------------------------------------------------
 # Target-qemu
 
+QEMU_VERSION = 2.5.0
+QEMU_VERSION = $(call qstrip,$(BR2_PACKAGE_QEMU_VERSION))
+QEMU_SITE = http://wiki.qemu.org/download
+QEMU_SOURCE = qemu-$(QEMU_VERSION).tar.bz2
+QEMU_LICENSE = GPLv2, LGPLv2.1, MIT, BSD-3c, BSD-2c, Others/BSD-1c
+QEMU_LICENSE_FILES = COPYING COPYING.LIB
+# NOTE: there is no top-level license file for non-(L)GPL licenses;
+#       the non-(L)GPL license texts are specified in the affected
+#       individual source files.
+
+
 QEMU_DEPENDENCIES = host-pkgconf host-python libglib2 zlib pixman
 
 # Need the LIBS variable because librt and libm are
diff --git a/package/vde2/Config.in.host b/package/vde2/Config.in.host
new file mode 100644
index 0000000..c412e9f
--- /dev/null
+++ b/package/vde2/Config.in.host
@@ -0,0 +1,14 @@
+config BR2_PACKAGE_HOST_VDE2
+	bool "host vde2"
+	depends on BR2_USE_MMU # fork()
+	depends on !BR2_STATIC_LIBS # dlopen()
+	help
+	  VDE is an ethernet compliant virtual network that can be
+	  spawned over a set of physical computers over the Internet.
+	  VDE is part of the virtualsquare project.
+
+	  http://vde.sourceforge.net/
+
+comment "vde2 needs a toolchain w/ dynamic library"
+	depends on BR2_USE_MMU
+	depends on BR2_STATIC_LIBS
diff --git a/package/vde2/vde2.mk b/package/vde2/vde2.mk
index bad758d..13fecd3 100644
--- a/package/vde2/vde2.mk
+++ b/package/vde2/vde2.mk
@@ -38,3 +38,4 @@ VDE2_CONF_OPTS = \
 VDE2_MAKE = $(MAKE1)
 
 $(eval $(autotools-package))
+$(eval $(host-autotools-package))
-- 
1.8.3.1



More information about the buildroot mailing list