aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/syntax-highlighting/vim/ftdetect/meson.vim1
-rw-r--r--docs/markdown/Reference-tables.md3
-rw-r--r--docs/markdown/Users.md12
-rw-r--r--mesonbuild/dependencies/__init__.py4
-rw-r--r--mesonbuild/dependencies/base.py5
-rw-r--r--mesonbuild/dependencies/misc.py23
-rw-r--r--mesonbuild/envconfig.py2
-rw-r--r--mesonbuild/interpreter.py2
-rw-r--r--mesonbuild/wrap/wrap.py4
-rwxr-xr-xrun_tests.py38
-rwxr-xr-xrun_unittests.py42
-rwxr-xr-xtest cases/common/52 custom target/depfile/dep.py2
-rwxr-xr-xtest cases/common/53 custom target chain/my_compiler.py2
-rwxr-xr-xtest cases/common/53 custom target chain/my_compiler2.py2
-rwxr-xr-xtest cases/common/53 custom target chain/usetarget/subcomp.py2
-rwxr-xr-xtest cases/common/99 manygen/subdir/manygen.py2
-rw-r--r--test cases/frameworks/31 curses/main.c7
-rw-r--r--test cases/frameworks/31 curses/meson.build9
-rwxr-xr-xtest cases/linuxlike/14 static dynamic linkage/verify_static.py2
-rwxr-xr-xtest cases/unit/11 cross prog/some_cross_tool.py2
-rwxr-xr-xtest cases/unit/11 cross prog/sometool.py2
-rwxr-xr-xtest cases/unit/39 python extmodule/blaster.py2
-rwxr-xr-xtest cases/unit/61 identity cross/build_wrapper.py2
-rwxr-xr-xtest cases/unit/61 identity cross/host_wrapper.py2
-rw-r--r--test cases/unit/73 wrap file url/meson.build4
-rw-r--r--test cases/unit/73 wrap file url/subprojects/foo-patch.tar.xzbin0 -> 228 bytes
-rw-r--r--test cases/unit/73 wrap file url/subprojects/foo.tar.xzbin0 -> 216 bytes
-rw-r--r--test cases/windows/8 find program/test-script2
28 files changed, 140 insertions, 40 deletions
diff --git a/data/syntax-highlighting/vim/ftdetect/meson.vim b/data/syntax-highlighting/vim/ftdetect/meson.vim
index 84db70c..3233c58 100644
--- a/data/syntax-highlighting/vim/ftdetect/meson.vim
+++ b/data/syntax-highlighting/vim/ftdetect/meson.vim
@@ -1,2 +1,3 @@
au BufNewFile,BufRead meson.build set filetype=meson
au BufNewFile,BufRead meson_options.txt set filetype=meson
+au BufNewFile,BufRead *.wrap set filetype=dosini
diff --git a/docs/markdown/Reference-tables.md b/docs/markdown/Reference-tables.md
index 61f4803..4fc28dc 100644
--- a/docs/markdown/Reference-tables.md
+++ b/docs/markdown/Reference-tables.md
@@ -78,6 +78,7 @@ set in the cross file.
| riscv64 | 64 bit RISC-V Open ISA|
| rl78 | Renesas RL78 |
| rx | Renesas RX 32 bit MCU |
+| s390 | IBM zSystem s390 |
| s390x | IBM zSystem s390x |
| sparc | 32 bit SPARC |
| sparc64 | SPARC v9 processor |
@@ -141,7 +142,7 @@ linker flags.
It is recommended that you **do not use these**. They are provided purely to
for backwards compatibility with other build systems. There are many caveats to
their use, especially when rebuilding the project. It is **highly** recommended
-that you use [the command line arguments](#language-arguments-parameters-names)
+that you use [the command line arguments](#language-arguments-parameter-names)
instead.
| Name | Comment |
diff --git a/docs/markdown/Users.md b/docs/markdown/Users.md
index 7290a5b..f271397 100644
--- a/docs/markdown/Users.md
+++ b/docs/markdown/Users.md
@@ -31,7 +31,7 @@ listed in the [`meson` GitHub topic](https://github.com/topics/meson).
- [fwupd](https://github.com/hughsie/fwupd), a simple daemon to allow session software to update firmware
- [GameMode](https://github.com/FeralInteractive/gamemode), a daemon/lib combo for Linux that allows games to request a set of optimisations be temporarily applied to the host OS
- [Geary](https://wiki.gnome.org/Apps/Geary), an email application built around conversations, for the GNOME 3 desktop.
- - [GLib](https://gitlab.gnome.org/GNOME/glib), cross-platform C library used by GTK+ and GStreamer (not the default yet)
+ - [GLib](https://gitlab.gnome.org/GNOME/glib), cross-platform C library used by GTK+ and GStreamer
- [GNOME Boxes](https://gitlab.gnome.org/GNOME/gnome-boxes), a GNOME hypervisor
- [GNOME Builder](https://gitlab.gnome.org/GNOME/gnome-builder), an IDE for the GNOME platform
- [GNOME MPV](https://github.com/gnome-mpv/gnome-mpv), GNOME frontend to the mpv video player
@@ -42,7 +42,7 @@ listed in the [`meson` GitHub topic](https://github.com/topics/meson).
- [GNU FriBidi](https://github.com/fribidi/fribidi), the open source implementation of the Unicode Bidirectional Algorithm
- [Graphene](https://ebassi.github.io/graphene/), a thin type library for graphics
- [Grilo](https://git.gnome.org/browse/grilo) and [Grilo plugins](https://git.gnome.org/browse/grilo-plugins), the Grilo multimedia framework
- - [GStreamer](https://cgit.freedesktop.org/gstreamer/gstreamer/), multimedia framework (not the default yet)
+ - [GStreamer](https://cgit.freedesktop.org/gstreamer/gstreamer/), multimedia framework
- [GTK+](https://gitlab.gnome.org/GNOME/gtk), the multi-platform toolkit used by GNOME
- [GtkDApp](https://gitlab.com/csoriano/GtkDApp), an application template for developing Flatpak apps with Gtk+ and D
- [GVfs](https://git.gnome.org/browse/gvfs/), a userspace virtual filesystem designed to work with the I/O abstraction of GIO
@@ -84,11 +84,11 @@ format files
- [oomd](https://github.com/facebookincubator/oomd), a userspace Out-Of-Memory (OOM) killer for Linux systems
- [OpenH264](https://github.com/cisco/openh264), open source H.264 codec
- [OpenHMD](https://github.com/OpenHMD/OpenHMD), a free and open source API and drivers for immersive technology, such as head mounted displays with built in head tracking
- - [Orc](http://cgit.freedesktop.org/gstreamer/orc/), the Optimized Inner Loop Runtime Compiler (not the default yet)
+ - [Orc](http://cgit.freedesktop.org/gstreamer/orc/), the Optimized Inner Loop Runtime Compiler
- [OTS](https://github.com/khaledhosny/ots), the OpenType Sanitizer, parses and serializes OpenType files (OTF, TTF) and WOFF and WOFF2 font files, validating and sanitizing them as it goes. Used by Chromium and Firefox
- [Outlier](https://github.com/kerolasa/outlier), a small Hello World style meson example project
- [Pacman](https://git.archlinux.org/pacman.git/tree/), a package manager for Arch Linux
- - [Pango](https://git.gnome.org/browse/pango/), an Internationalized text layout and rendering library (not the default yet)
+ - [Pango](https://git.gnome.org/browse/pango/), an Internationalized text layout and rendering library
- [Parzip](https://github.com/jpakkane/parzip), a multithreaded reimplementation of Zip
- [Peek](https://github.com/phw/peek), simple animated GIF screen recorder with an easy to use interface
- [PicoLibc](https://github.com/keith-packard/picolibc), a standard C library for small embedded systems with limited RAM
@@ -97,6 +97,7 @@ format files
- [Pitivi](https://github.com/pitivi/pitivi/), a nonlinear video editor
- [Playerctl](https://github.com/acrisci/playerctl), mpris command-line controller and library for spotify, vlc, audacious, bmp, cmus, and others
- [Polari](https://gitlab.gnome.org/GNOME/polari), an IRC client
+ - [qboot](https://github.com/bonzini/qboot), a minimal x86 firmware for booting Linux kernels
- [radare2](https://github.com/radare/radare2), unix-like reverse engineering framework and commandline tools (not the default)
- [RxDock](https://gitlab.com/rxdock/rxdock), a protein-ligand docking software designed for high throughput virtual screening (fork of rDock)
- [SSHFS](https://github.com/libfuse/sshfs), allows you to mount a remote filesystem using SFTP
@@ -108,13 +109,14 @@ format files
- [Terminology](https://github.com/billiob/terminology), a terminal emulator based on the Enlightenment Foundation Libraries
- [Tilix](https://github.com/gnunn1/tilix), a tiling terminal emulator for Linux using GTK+ 3
- [Valum](https://github.com/valum-framework/valum), a micro web framework written in Vala
- - [Wayland and Weston](https://lists.freedesktop.org/archives/wayland-devel/2016-November/031984.html), a next generation display server (not merged yet)
+ - [Wayland](https://github.com/wayland-project/wayland) and [Weston](https://github.com/wayland-project/weston), a next generation display server
- [wlroots](https://github.com/swaywm/wlroots), a modular Wayland compositor library
- [wxFormBuilder](https://github.com/wxFormBuilder/wxFormBuilder), RAD tool for wxWidgets GUI design
- [xi-gtk](https://github.com/eyelash/xi-gtk), a GTK+ front-end for the Xi editor
- [Xorg](https://cgit.freedesktop.org/xorg/xserver/), the X.org display server (not the default yet)
- [zathura](https://github.com/pwmt/zathura), a highly customizable and functional document viewer based on the
girara user interface library and several document libraries
+ - [Zrythm](https://git.zrythm.org/cgit/zrythm), a cross-platform digital audio workstation using GTK+ 3
- [ZStandard](https://github.com/facebook/zstd/commit/4dca56ed832c6a88108a2484a8f8ff63d8d76d91), a compression algorithm developed at Facebook (not used by default)
Note that a more up-to-date list of GNOME projects that use Meson can be found [here](https://wiki.gnome.org/Initiatives/GnomeGoals/MesonPorting).
diff --git a/mesonbuild/dependencies/__init__.py b/mesonbuild/dependencies/__init__.py
index 889a610..cc8817d 100644
--- a/mesonbuild/dependencies/__init__.py
+++ b/mesonbuild/dependencies/__init__.py
@@ -23,7 +23,8 @@ from .dev import GMockDependency, GTestDependency, LLVMDependency, ValgrindDepen
from .coarrays import CoarrayDependency
from .mpi import MPIDependency
from .scalapack import ScalapackDependency
-from .misc import (BlocksDependency, NetCDFDependency, OpenMPDependency, Python3Dependency, ThreadDependency, PcapDependency, CupsDependency, LibWmfDependency, LibGCryptDependency, GpgmeDependency, ShadercDependency)
+from .misc import (BlocksDependency, CursesDependency, NetCDFDependency, OpenMPDependency, Python3Dependency, ThreadDependency,
+ PcapDependency, CupsDependency, LibWmfDependency, LibGCryptDependency, GpgmeDependency, ShadercDependency)
from .platform import AppleFrameworks
from .ui import GLDependency, GnuStepDependency, Qt4Dependency, Qt5Dependency, SDL2Dependency, WxDependency, VulkanDependency
@@ -46,6 +47,7 @@ packages.update({
# From misc:
'blocks': BlocksDependency,
+ 'curses': CursesDependency,
'netcdf': NetCDFDependency,
'openmp': OpenMPDependency,
'python3': Python3Dependency,
diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py
index d7fa532..d2d115e 100644
--- a/mesonbuild/dependencies/base.py
+++ b/mesonbuild/dependencies/base.py
@@ -1817,10 +1817,13 @@ class ExternalProgram:
@staticmethod
@functools.lru_cache(maxsize=None)
def _windows_sanitize_path(path: str) -> str:
+ # Ensure that we use USERPROFILE even when inside MSYS, MSYS2, Cygwin, etc.
+ if 'USERPROFILE' not in os.environ:
+ return path
# Ignore executables in the WindowsApps directory which are
# zero-sized wrappers that magically open the Windows Store to
# install the application.
- appstore_dir = Path.home() / 'AppData' / 'Local' / 'Microsoft' / 'WindowsApps'
+ appstore_dir = Path(os.environ['USERPROFILE']) / 'AppData' / 'Local' / 'Microsoft' / 'WindowsApps'
paths = []
for each in path.split(os.pathsep):
if Path(each) != appstore_dir:
diff --git a/mesonbuild/dependencies/misc.py b/mesonbuild/dependencies/misc.py
index 88f64e0..9077222 100644
--- a/mesonbuild/dependencies/misc.py
+++ b/mesonbuild/dependencies/misc.py
@@ -557,3 +557,26 @@ class ShadercDependency(ExternalDependency):
@staticmethod
def get_methods():
return [DependencyMethods.SYSTEM, DependencyMethods.PKGCONFIG]
+
+class CursesDependency(ExternalDependency):
+ def __init__(self, environment, kwargs):
+ super().__init__('curses', environment, None, kwargs)
+ self.name = 'curses'
+ self.is_found = False
+ methods = listify(self.methods)
+
+ if set([DependencyMethods.AUTO, DependencyMethods.PKGCONFIG]).intersection(methods):
+ pkgconfig_files = ['ncurses', 'ncursesw']
+ for pkg in pkgconfig_files:
+ pkgdep = PkgConfigDependency(pkg, environment, kwargs)
+ if pkgdep.found():
+ self.compile_args = pkgdep.get_compile_args()
+ self.link_args = pkgdep.get_link_args()
+ self.version = pkgdep.get_version()
+ self.is_found = True
+ self.pcdep = pkgdep
+ return
+
+ @staticmethod
+ def get_methods():
+ return [DependencyMethods.AUTO, DependencyMethods.PKGCONFIG]
diff --git a/mesonbuild/envconfig.py b/mesonbuild/envconfig.py
index 98644c0..9b88b66 100644
--- a/mesonbuild/envconfig.py
+++ b/mesonbuild/envconfig.py
@@ -52,6 +52,7 @@ known_cpu_families = (
'riscv64',
'rl78',
'rx',
+ 's390',
's390x',
'sparc',
'sparc64',
@@ -70,6 +71,7 @@ CPU_FAMILES_64_BIT = [
'mips64',
'ppc64',
'riscv64',
+ 's390x',
'sparc64',
'wasm64',
'x86_64',
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 4dfb8b3..d936455 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -3328,7 +3328,7 @@ external dependencies (including libraries) must go to "dependencies".''')
def dependency_fallback(self, display_name, kwargs):
if self.coredata.get_builtin_option('wrap_mode') == WrapMode.nofallback:
mlog.log('Not looking for a fallback subproject for the dependency',
- mlog.bold(display_name), 'because:\nUse of fallback'
+ mlog.bold(display_name), 'because:\nUse of fallback '
'dependencies is disabled.')
return self.notfound_dependency()
elif self.coredata.get_builtin_option('wrap_mode') == WrapMode.forcefallback:
diff --git a/mesonbuild/wrap/wrap.py b/mesonbuild/wrap/wrap.py
index abbeb9e..0ebc2bc 100644
--- a/mesonbuild/wrap/wrap.py
+++ b/mesonbuild/wrap/wrap.py
@@ -335,9 +335,7 @@ class Resolver:
h = hashlib.sha256()
tmpfile = tempfile.NamedTemporaryFile(mode='wb', dir=self.cachedir, delete=False)
url = urllib.parse.urlparse(urlstring)
- if not url.hostname:
- raise WrapException('{} is not a valid URL'.format(urlstring))
- if url.hostname.endswith(whitelist_subdomain):
+ if url.hostname and url.hostname.endswith(whitelist_subdomain):
resp = open_wrapdburl(urlstring)
elif whitelist_subdomain in urlstring:
raise WrapException('{} may be a WrapDB-impersonating URL'.format(urlstring))
diff --git a/run_tests.py b/run_tests.py
index c811705..4a1d271 100755
--- a/run_tests.py
+++ b/run_tests.py
@@ -36,6 +36,26 @@ from mesonbuild.environment import Environment, detect_ninja
from mesonbuild.coredata import backendlist
NINJA_1_9_OR_NEWER = False
+NINJA_CMD = None
+# If we're on CI, just assume we have ninja in PATH and it's new enough because
+# we provide that. This avoids having to detect ninja for every subprocess unit
+# test that we run.
+if 'CI' in os.environ:
+ NINJA_1_9_OR_NEWER = True
+ NINJA_CMD = 'ninja'
+else:
+ # Look for 1.9 to see if https://github.com/ninja-build/ninja/issues/1219
+ # is fixed, else require 1.6 for -w dupbuild=err
+ for v in ('1.9', '1.6'):
+ NINJA_CMD = detect_ninja(v)
+ if NINJA_CMD is not None:
+ if mesonlib.version_compare(v, '>=1.9'):
+ NINJA_1_9_OR_NEWER = True
+ else:
+ mlog.warning('Found ninja <1.9, tests will run slower', once=True)
+ break
+if NINJA_CMD is None:
+ raise RuntimeError('Could not find Ninja v1.6 or newer')
def guess_backend(backend, msbuild_exe: str):
# Auto-detect backend if unspecified
@@ -202,22 +222,8 @@ def get_backend_commands(backend, debug=False):
clean_cmd = cmd + ['-alltargets', 'clean', '-UseNewBuildSystem=FALSE']
test_cmd = cmd + ['-target', 'RUN_TESTS']
elif backend is Backend.ninja:
- global NINJA_1_9_OR_NEWER
- # Look for 1.9 to see if https://github.com/ninja-build/ninja/issues/1219
- # is fixed, else require 1.6 for -w dupbuild=err
- for v in ('1.9', '1.6'):
- ninja_cmd = detect_ninja(v)
- if ninja_cmd is not None:
- if v == '1.9':
- NINJA_1_9_OR_NEWER = True
- else:
- mlog.warning('Found ninja <1.9, tests will run slower', once=True)
- if 'CI' in os.environ:
- raise RuntimeError('Require ninja >= 1.9 when running on Meson CI')
- break
- cmd = [ninja_cmd, '-w', 'dupbuild=err', '-d', 'explain']
- if cmd[0] is None:
- raise RuntimeError('Could not find Ninja v1.6 or newer')
+ global NINJA_CMD
+ cmd = [NINJA_CMD, '-w', 'dupbuild=err', '-d', 'explain']
if debug:
cmd += ['-v']
clean_cmd = cmd + ['clean']
diff --git a/run_unittests.py b/run_unittests.py
index 898f05e..b2b2557 100755
--- a/run_unittests.py
+++ b/run_unittests.py
@@ -32,6 +32,7 @@ import threading
import urllib.error
import urllib.request
import zipfile
+import hashlib
from itertools import chain
from unittest import mock
from configparser import ConfigParser
@@ -4542,6 +4543,14 @@ class WindowsTests(BasePlatformTests):
self.assertTrue(prog.found(), msg='test-script-ext.py not found in PATH')
self.assertPathEqual(prog.get_command()[0], python_command[0])
self.assertPathBasenameEqual(prog.get_path(), 'test-script-ext.py')
+ # Ensure that WindowsApps gets removed from PATH
+ path = os.environ['PATH']
+ if 'WindowsApps' not in path:
+ username = os.environ['USERNAME']
+ appstore_dir = r'C:\Users\{}\AppData\Local\Microsoft\WindowsApps'.format(username)
+ path = os.pathsep + appstore_dir
+ path = ExternalProgram._windows_sanitize_path(path)
+ self.assertNotIn('WindowsApps', path)
def test_ignore_libs(self):
'''
@@ -5910,6 +5919,39 @@ c = ['{0}']
def test_ld_environment_variable_fortran(self):
self._check_ld('ld.gold', 'gold', 'fortran', 'GNU ld.gold')
+ def compute_sha256(self, filename):
+ with open(filename,"rb") as f:
+ return hashlib.sha256(f.read()).hexdigest();
+
+ def test_wrap_with_file_url(self):
+ testdir = os.path.join(self.unit_test_dir, '73 wrap file url')
+ source_filename = os.path.join(testdir, 'subprojects', 'foo.tar.xz')
+ patch_filename = os.path.join(testdir, 'subprojects', 'foo-patch.tar.xz')
+ wrap_filename = os.path.join(testdir, 'subprojects', 'foo.wrap')
+ source_hash = self.compute_sha256(source_filename)
+ patch_hash = self.compute_sha256(patch_filename)
+ wrap = textwrap.dedent("""\
+ [wrap-file]
+ directory = foo
+
+ source_url = file://{}
+ source_filename = foo.tar.xz
+ source_hash = {}
+
+ patch_url = file://{}
+ patch_filename = foo-patch.tar.xz
+ patch_hash = {}
+ """.format(source_filename, source_hash, patch_filename, patch_hash))
+ with open(wrap_filename, 'w') as f:
+ f.write(wrap)
+ self.init(testdir)
+ self.build()
+ self.run_tests()
+
+ windows_proof_rmtree(os.path.join(testdir, 'subprojects', 'packagecache'))
+ windows_proof_rmtree(os.path.join(testdir, 'subprojects', 'foo'))
+ os.unlink(wrap_filename)
+
def should_run_cross_arm_tests():
return shutil.which('arm-linux-gnueabihf-gcc') and not platform.machine().lower().startswith('arm')
diff --git a/test cases/common/52 custom target/depfile/dep.py b/test cases/common/52 custom target/depfile/dep.py
index 476e88b..dc6e6b6 100755
--- a/test cases/common/52 custom target/depfile/dep.py
+++ b/test cases/common/52 custom target/depfile/dep.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
import sys, os
from glob import glob
diff --git a/test cases/common/53 custom target chain/my_compiler.py b/test cases/common/53 custom target chain/my_compiler.py
index 9cf4425..d99029b 100755
--- a/test cases/common/53 custom target chain/my_compiler.py
+++ b/test cases/common/53 custom target chain/my_compiler.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
import sys
diff --git a/test cases/common/53 custom target chain/my_compiler2.py b/test cases/common/53 custom target chain/my_compiler2.py
index 0191f3f..22ec789 100755
--- a/test cases/common/53 custom target chain/my_compiler2.py
+++ b/test cases/common/53 custom target chain/my_compiler2.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
import sys
diff --git a/test cases/common/53 custom target chain/usetarget/subcomp.py b/test cases/common/53 custom target chain/usetarget/subcomp.py
index b5f6eb0..52dc0bb 100755
--- a/test cases/common/53 custom target chain/usetarget/subcomp.py
+++ b/test cases/common/53 custom target chain/usetarget/subcomp.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
import sys
diff --git a/test cases/common/99 manygen/subdir/manygen.py b/test cases/common/99 manygen/subdir/manygen.py
index d46b2a8..32ea63c 100755
--- a/test cases/common/99 manygen/subdir/manygen.py
+++ b/test cases/common/99 manygen/subdir/manygen.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
from __future__ import print_function
diff --git a/test cases/frameworks/31 curses/main.c b/test cases/frameworks/31 curses/main.c
new file mode 100644
index 0000000..07d73f5
--- /dev/null
+++ b/test cases/frameworks/31 curses/main.c
@@ -0,0 +1,7 @@
+#include "curses.h"
+
+int main(void) {
+initscr();
+endwin();
+return 0;
+} \ No newline at end of file
diff --git a/test cases/frameworks/31 curses/meson.build b/test cases/frameworks/31 curses/meson.build
new file mode 100644
index 0000000..21483fb
--- /dev/null
+++ b/test cases/frameworks/31 curses/meson.build
@@ -0,0 +1,9 @@
+project('curses', 'c')
+
+curses = dependency('curses', required: false)
+if not curses.found()
+ error('MESON_SKIP_TEST: Curses library not found')
+endif
+
+exec = executable('basic', 'main.c', dependencies: curses)
+# didn't run the test because in general graphics fail on CI
diff --git a/test cases/linuxlike/14 static dynamic linkage/verify_static.py b/test cases/linuxlike/14 static dynamic linkage/verify_static.py
index 66bf08b..594f194 100755
--- a/test cases/linuxlike/14 static dynamic linkage/verify_static.py
+++ b/test cases/linuxlike/14 static dynamic linkage/verify_static.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
"""Test script that checks if zlib was statically linked to executable"""
import subprocess
import sys
diff --git a/test cases/unit/11 cross prog/some_cross_tool.py b/test cases/unit/11 cross prog/some_cross_tool.py
index 1edd10f..4a473e2 100755
--- a/test cases/unit/11 cross prog/some_cross_tool.py
+++ b/test cases/unit/11 cross prog/some_cross_tool.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
from __future__ import print_function
diff --git a/test cases/unit/11 cross prog/sometool.py b/test cases/unit/11 cross prog/sometool.py
index 4c0e3b1..2ac5680 100755
--- a/test cases/unit/11 cross prog/sometool.py
+++ b/test cases/unit/11 cross prog/sometool.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
from __future__ import print_function
diff --git a/test cases/unit/39 python extmodule/blaster.py b/test cases/unit/39 python extmodule/blaster.py
index 163b6d4..8bfe9cf 100755
--- a/test cases/unit/39 python extmodule/blaster.py
+++ b/test cases/unit/39 python extmodule/blaster.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
import sys
import tachyon
diff --git a/test cases/unit/61 identity cross/build_wrapper.py b/test cases/unit/61 identity cross/build_wrapper.py
index 22e8b5d..b5fe7bb 100755
--- a/test cases/unit/61 identity cross/build_wrapper.py
+++ b/test cases/unit/61 identity cross/build_wrapper.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
import subprocess, sys
diff --git a/test cases/unit/61 identity cross/host_wrapper.py b/test cases/unit/61 identity cross/host_wrapper.py
index 5b4eed8..e88577c 100755
--- a/test cases/unit/61 identity cross/host_wrapper.py
+++ b/test cases/unit/61 identity cross/host_wrapper.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
import subprocess, sys
diff --git a/test cases/unit/73 wrap file url/meson.build b/test cases/unit/73 wrap file url/meson.build
new file mode 100644
index 0000000..3bd3b25
--- /dev/null
+++ b/test cases/unit/73 wrap file url/meson.build
@@ -0,0 +1,4 @@
+project('test wrap with file url')
+
+exe = subproject('foo').get_variable('foo_exe')
+test('test1', exe)
diff --git a/test cases/unit/73 wrap file url/subprojects/foo-patch.tar.xz b/test cases/unit/73 wrap file url/subprojects/foo-patch.tar.xz
new file mode 100644
index 0000000..fdb026c
--- /dev/null
+++ b/test cases/unit/73 wrap file url/subprojects/foo-patch.tar.xz
Binary files differ
diff --git a/test cases/unit/73 wrap file url/subprojects/foo.tar.xz b/test cases/unit/73 wrap file url/subprojects/foo.tar.xz
new file mode 100644
index 0000000..2ed6ab4
--- /dev/null
+++ b/test cases/unit/73 wrap file url/subprojects/foo.tar.xz
Binary files differ
diff --git a/test cases/windows/8 find program/test-script b/test cases/windows/8 find program/test-script
index d105a81..e764165 100644
--- a/test cases/windows/8 find program/test-script
+++ b/test cases/windows/8 find program/test-script
@@ -1,3 +1,3 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
print('1')