meson: subprojects: replace submodules with wrap files

Compared to submodules, .wrap files have several advantages:

* option parsing and downloading is delegated to meson

* the commit is stored in a text file instead of a magic entry in the
  git tree object

* we could stop shipping external dependencies that are only used as a
  fallback, but not break compilation on platforms that lack them.
  For example it may make sense to download dtc at build time, controlled
  by --enable-download, even when building from a tarball.  Right now,
  this patch does the opposite: make-release treats dtc like libvfio-user
  (which is not stable API and therefore hasn't found its way into any
  distros) and keycodemap (which is a copylib, for better or worse).

dependency() can fall back to a wrap automatically.  However, this
is only possible for libraries that come with a .pc file, and this
is not very common for libfdt even though the upstream project in
principle provides it; it also removes the control that we provide with
--enable-fdt={system,internal}.  Therefore, the logic to pick system
vs. internal libfdt is left untouched.

--enable-fdt=git is removed; it was already a synonym for
--enable-fdt=internal.

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2023-05-18 16:50:00 +02:00
parent d120116b5d
commit 2019cabfee
13 changed files with 63 additions and 73 deletions

View File

@ -44,6 +44,7 @@
script: script:
- scripts/git-submodule.sh update - scripts/git-submodule.sh update
$(sed -n '/GIT_SUBMODULES=/ s/.*=// p' build/config-host.mak) $(sed -n '/GIT_SUBMODULES=/ s/.*=// p' build/config-host.mak)
- meson subprojects download $(cd build/subprojects && echo *)
- cd build - cd build
- find . -type f -exec touch {} + - find . -type f -exec touch {} +
# Avoid recompiling by hiding ninja with NINJA=":" # Avoid recompiling by hiding ninja with NINJA=":"

9
.gitmodules vendored
View File

@ -13,9 +13,6 @@
[submodule "roms/qemu-palcode"] [submodule "roms/qemu-palcode"]
path = roms/qemu-palcode path = roms/qemu-palcode
url = https://gitlab.com/qemu-project/qemu-palcode.git url = https://gitlab.com/qemu-project/qemu-palcode.git
[submodule "subprojects/dtc"]
path = subprojects/dtc
url = https://gitlab.com/qemu-project/dtc.git
[submodule "roms/u-boot"] [submodule "roms/u-boot"]
path = roms/u-boot path = roms/u-boot
url = https://gitlab.com/qemu-project/u-boot.git url = https://gitlab.com/qemu-project/u-boot.git
@ -25,9 +22,6 @@
[submodule "roms/QemuMacDrivers"] [submodule "roms/QemuMacDrivers"]
path = roms/QemuMacDrivers path = roms/QemuMacDrivers
url = https://gitlab.com/qemu-project/QemuMacDrivers.git url = https://gitlab.com/qemu-project/QemuMacDrivers.git
[submodule "subprojects/keycodemapdb"]
path = subprojects/keycodemapdb
url = https://gitlab.com/qemu-project/keycodemapdb.git
[submodule "roms/seabios-hppa"] [submodule "roms/seabios-hppa"]
path = roms/seabios-hppa path = roms/seabios-hppa
url = https://gitlab.com/qemu-project/seabios-hppa.git url = https://gitlab.com/qemu-project/seabios-hppa.git
@ -55,6 +49,3 @@
[submodule "tests/lcitool/libvirt-ci"] [submodule "tests/lcitool/libvirt-ci"]
path = tests/lcitool/libvirt-ci path = tests/lcitool/libvirt-ci
url = https://gitlab.com/libvirt/libvirt-ci.git url = https://gitlab.com/libvirt/libvirt-ci.git
[submodule "subprojects/libvfio-user"]
path = subprojects/libvfio-user
url = https://gitlab.com/qemu-project/libvfio-user.git

77
configure vendored
View File

@ -253,7 +253,7 @@ else
git_submodules_action="ignore" git_submodules_action="ignore"
fi fi
git_submodules="subprojects/keycodemapdb" git_submodules=""
git="git" git="git"
debug_tcg="no" debug_tcg="no"
docs="auto" docs="auto"
@ -269,7 +269,6 @@ python=
download="enabled" download="enabled"
bindir="bin" bindir="bin"
skip_meson=no skip_meson=no
vfio_user_server="disabled"
use_containers="yes" use_containers="yes"
gdb_bin=$(command -v "gdb-multiarch" || command -v "gdb") gdb_bin=$(command -v "gdb-multiarch" || command -v "gdb")
gdb_arches="" gdb_arches=""
@ -281,16 +280,13 @@ unset target_list_exclude
# The following Meson options are handled manually (still they # The following Meson options are handled manually (still they
# are included in the automatically generated help message) # are included in the automatically generated help message)
# because they automatically enable/disable other options
# 1. Track which submodules are needed
fdt="auto"
# 2. Automatically enable/disable other options
tcg="auto" tcg="auto"
cfi="false" cfi="false"
# 3. Need to check for -static-pie before Meson runs. Also, # Meson has PIE as a boolean rather than enabled/disabled/auto,
# Meson has PIE as a boolean rather than enabled/disabled/auto. # and we also need to check for -static-pie before Meson runs
# which requires knowing whether --static is enabled.
pie="" pie=""
static="no" static="no"
@ -743,14 +739,6 @@ for opt do
;; ;;
--disable-cfi) cfi="false" --disable-cfi) cfi="false"
;; ;;
--disable-fdt) fdt="disabled"
;;
--enable-fdt) fdt="enabled"
;;
--enable-fdt=git) fdt="internal"
;;
--enable-fdt=*) fdt="$optarg"
;;
--with-git-submodules=*) --with-git-submodules=*)
git_submodules_action="$optarg" git_submodules_action="$optarg"
;; ;;
@ -772,10 +760,6 @@ for opt do
;; ;;
--gdb=*) gdb_bin="$optarg" --gdb=*) gdb_bin="$optarg"
;; ;;
--enable-vfio-user-server) vfio_user_server="enabled"
;;
--disable-vfio-user-server) vfio_user_server="disabled"
;;
# everything else has the same name in configure and meson # everything else has the same name in configure and meson
--*) meson_option_parse "$opt" "$optarg" --*) meson_option_parse "$opt" "$optarg"
;; ;;
@ -787,6 +771,32 @@ if test "$plugins" = "yes" -a "$tcg" = "disabled"; then
error_exit "Can't enable plugins on non-TCG builds" error_exit "Can't enable plugins on non-TCG builds"
fi fi
if ! test -f "$source_path/subprojects/keycodemapdb/README" \
&& test -f "$download" = disabled
then
echo
echo "ERROR: missing subprojects"
echo
if test -e "$source_path/.git"; then
echo "--disable-download specified but subprojects were not"
echo 'checked out. Please invoke "meson subprojects download"'
echo "before configuring QEMU, or remove --disable-download"
echo "from the command line."
else
echo "This is not a GIT checkout but subproject content appears to"
echo "be missing. Do not use 'git archive' or GitHub download links"
echo "to acquire QEMU source archives. Non-GIT builds are only"
echo "supported with source archives linked from:"
echo
echo " https://www.qemu.org/download/#source"
echo
echo "Developers working with GIT can use scripts/archive-source.sh"
echo "if they need to create valid source archives."
fi
echo
exit 1
fi
case $git_submodules_action in case $git_submodules_action in
update|validate) update|validate)
if test ! -e "$source_path/.git" || ! has git; then if test ! -e "$source_path/.git" || ! has git; then
@ -795,7 +805,7 @@ case $git_submodules_action in
fi fi
;; ;;
ignore) ignore)
if ! test -f "$source_path/subprojects/keycodemapdb/README" if ! test -f "$source_path/tests/fp/berkeley-testfloat-3/README.md"
then then
echo echo
echo "ERROR: missing GIT submodules" echo "ERROR: missing GIT submodules"
@ -1164,16 +1174,6 @@ EOF
fi fi
fi fi
##########################################
# fdt probe
case "$fdt" in
auto | enabled | internal)
# Simpler to always update submodule, even if not needed.
git_submodules="${git_submodules} subprojects/dtc"
;;
esac
######################################## ########################################
# check if ccache is interfering with # check if ccache is interfering with
# semantic analysis of macros # semantic analysis of macros
@ -1609,17 +1609,6 @@ write_target_makefile() {
fi fi
} }
##########################################
# check for vfio_user_server
case "$vfio_user_server" in
enabled )
if test "$git_submodules_action" != "ignore"; then
git_submodules="${git_submodules} subprojects/libvfio-user"
fi
;;
esac
####################################### #######################################
# cross-compiled firmware targets # cross-compiled firmware targets
@ -1951,12 +1940,10 @@ if test "$skip_meson" = no; then
# QEMU options # QEMU options
test "$cfi" != false && meson_option_add "-Dcfi=$cfi" test "$cfi" != false && meson_option_add "-Dcfi=$cfi"
test "$docs" != auto && meson_option_add "-Ddocs=$docs" test "$docs" != auto && meson_option_add "-Ddocs=$docs"
test "$fdt" != auto && meson_option_add "-Dfdt=$fdt"
test -n "${LIB_FUZZING_ENGINE+xxx}" && meson_option_add "-Dfuzzing_engine=$LIB_FUZZING_ENGINE" test -n "${LIB_FUZZING_ENGINE+xxx}" && meson_option_add "-Dfuzzing_engine=$LIB_FUZZING_ENGINE"
test "$qemu_suffix" != qemu && meson_option_add "-Dqemu_suffix=$qemu_suffix" test "$qemu_suffix" != qemu && meson_option_add "-Dqemu_suffix=$qemu_suffix"
test "$smbd" != '' && meson_option_add "-Dsmbd=$smbd" test "$smbd" != '' && meson_option_add "-Dsmbd=$smbd"
test "$tcg" != enabled && meson_option_add "-Dtcg=$tcg" test "$tcg" != enabled && meson_option_add "-Dtcg=$tcg"
test "$vfio_user_server" != auto && meson_option_add "-Dvfio_user_server=$vfio_user_server"
run_meson() { run_meson() {
NINJA=$ninja $meson setup --prefix "$prefix" "$@" $cross_arg "$PWD" "$source_path" NINJA=$ninja $meson setup --prefix "$prefix" "$@" $cross_arg "$PWD" "$source_path"
} }

View File

@ -3031,14 +3031,7 @@ endif
libvfio_user_dep = not_found libvfio_user_dep = not_found
if have_system and vfio_user_server_allowed if have_system and vfio_user_server_allowed
have_internal = fs.exists(meson.current_source_dir() / 'subprojects/libvfio-user/meson.build') libvfio_user_proj = subproject('libvfio-user', required: true)
if not have_internal
error('libvfio-user source not found - please pull git submodule')
endif
libvfio_user_proj = subproject('libvfio-user')
libvfio_user_dep = libvfio_user_proj.get_variable('libvfio_user_dep') libvfio_user_dep = libvfio_user_proj.get_variable('libvfio_user_dep')
endif endif
@ -3066,12 +3059,6 @@ if fdt_required.length() > 0 or fdt_opt == 'enabled'
endif endif
if not fdt.found() if not fdt.found()
assert(fdt_opt == 'internal') assert(fdt_opt == 'internal')
have_internal = fs.exists(meson.current_source_dir() / 'subprojects/dtc/meson.build')
if not have_internal
error('libfdt source not found - please pull git submodule')
endif
libfdt_proj = subproject('dtc', required: true, libfdt_proj = subproject('dtc', required: true,
default_options: ['tools=false', 'yaml=disabled', default_options: ['tools=false', 'yaml=disabled',
'python=disabled', 'default_library=static']) 'python=disabled', 'default_library=static'])

View File

@ -26,8 +26,8 @@ sub_file="${sub_tdir}/submodule.tar"
# independent of what the developer currently has initialized # independent of what the developer currently has initialized
# in their checkout, because the build environment is completely # in their checkout, because the build environment is completely
# different to the host OS. # different to the host OS.
submodules="subprojects/dtc subprojects/keycodemapdb" subprojects="dtc keycodemapdb libvfio-user"
submodules="$submodules tests/fp/berkeley-softfloat-3 tests/fp/berkeley-testfloat-3" submodules="tests/fp/berkeley-softfloat-3 tests/fp/berkeley-testfloat-3"
sub_deinit="" sub_deinit=""
function cleanup() { function cleanup() {
@ -70,4 +70,11 @@ for sm in $submodules; do
tar --concatenate --file "$tar_file" "$sub_file" tar --concatenate --file "$tar_file" "$sub_file"
test $? -ne 0 && error "failed append submodule $sm to $tar_file" test $? -ne 0 && error "failed append submodule $sm to $tar_file"
done done
for sp in $subprojects; do
meson subprojects download $sp
test $? -ne 0 && error "failed to download subproject $sp"
tar --append --file "$tar_file" --exclude=.git subprojects/$sp
test $? -ne 0 && error "failed to append subproject $sp to $tar_file"
done
exit 0 exit 0

View File

@ -16,6 +16,9 @@ if [ $# -ne 2 ]; then
exit 0 exit 0
fi fi
# Only include wraps that are invoked with subproject()
SUBPROJECTS="dtc libvfio-user keycodemapdb"
src="$1" src="$1"
version="$2" version="$2"
destination=qemu-${version} destination=qemu-${version}
@ -26,6 +29,8 @@ git clone --single-branch -b "v${version}" -c advice.detachedHead=false \
pushd ${destination} pushd ${destination}
git submodule update --init --single-branch git submodule update --init --single-branch
meson subprojects download $SUBPROJECTS
(cd roms/seabios && git describe --tags --long --dirty > .version) (cd roms/seabios && git describe --tags --long --dirty > .version)
(cd roms/skiboot && ./make_version.sh > .version) (cd roms/skiboot && ./make_version.sh > .version)
# Fetch edk2 submodule's submodules, since it won't have access to them via # Fetch edk2 submodule's submodules, since it won't have access to them via

View File

@ -1,3 +1,6 @@
/packagecache /packagecache
/dtc
/keycodemapdb
/libvfio-user
/slirp /slirp

@ -1 +0,0 @@
Subproject commit b6910bec11614980a21e46fbccc35934b671bd81

4
subprojects/dtc.wrap Normal file
View File

@ -0,0 +1,4 @@
[wrap-git]
url = https://gitlab.com/qemu-project/dtc.git
revision = b6910bec11614980a21e46fbccc35934b671bd81
depth = 1

@ -1 +0,0 @@
Subproject commit f5772a62ec52591ff6870b7e8ef32482371f22c6

View File

@ -0,0 +1,4 @@
[wrap-git]
url = https://gitlab.com/qemu-project/keycodemapdb.git
revision = f5772a62ec52591ff6870b7e8ef32482371f22c6
depth = 1

@ -1 +0,0 @@
Subproject commit 0b28d205572c80b568a1003db2c8f37ca333e4d7

View File

@ -0,0 +1,4 @@
[wrap-git]
url = https://gitlab.com/qemu-project/libvfio-user.git
revision = 0b28d205572c80b568a1003db2c8f37ca333e4d7
depth = 1