fix meson location detection if run by wraptool

teach detect_meson_py_location() that meson.py is not the
only one meson executable (there's wraptool + legacy scripts)
that could be installed to the PATH folder

fixes #2810
pull/2840/head
Alexey Stukalov 7 years ago
parent de3feb9625
commit 8fc4244187
  1. 39
      mesonbuild/mesonlib.py

@ -25,25 +25,32 @@ from glob import glob
def detect_meson_py_location():
c = sys.argv[0]
c_fname = os.path.split(c)[1]
if c_fname == 'meson' or c_fname == 'meson.py':
# $ /foo/meson.py <args>
if os.path.isabs(c):
return c
# $ meson <args> (gets run from /usr/bin/meson)
c_dir, c_fname = os.path.split(c)
# get the absolute path to the <mesontool> folder
m_dir = None
if os.path.isabs(c):
# $ /foo/<mesontool>.py <args>
m_dir = c_dir
elif c_dir == '':
# $ <mesontool> <args> (gets run from /usr/bin/<mesontool>)
in_path_exe = shutil.which(c_fname)
if in_path_exe:
# Special case: when run like "./meson.py <opts>" and user has
# period in PATH, we need to expand it out, because, for example,
m_dir, c_fname = os.path.split(in_path_exe)
# Special case: when run like "./meson.py <opts>",
# we need to expand it out, because, for example,
# "ninja test" will be run from a different directory.
if '.' in os.environ['PATH'].split(':'):
p, f = os.path.split(in_path_exe)
if p == '' or p == '.':
return os.path.join(os.getcwd(), f)
return in_path_exe
# $ python3 ./meson.py <args>
if os.path.exists(c):
return os.path.join(os.getcwd(), c)
if m_dir == '.':
m_dir = os.getcwd()
else:
m_dir = os.path.abspath(c_dir)
# find meson in m_dir
if m_dir is not None:
for fname in ['meson', 'meson.py']:
m_path = os.path.join(m_dir, fname)
if os.path.exists(m_path):
return m_path
# The only thing remaining is to try to find the bundled executable and
# pray distro packagers have not moved it.

Loading…
Cancel
Save