Skip to content

Commit

Permalink
interpreter: Fix builddir path logic for is_build_only
Browse files Browse the repository at this point in the history
  • Loading branch information
oleavr committed Mar 18, 2024
1 parent 6b1f73f commit 6a37aa5
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 11 deletions.
29 changes: 21 additions & 8 deletions mesonbuild/interpreter/interpreter.py
Original file line number Diff line number Diff line change
Expand Up @@ -836,7 +836,10 @@ def run_command_impl(self,
self.add_build_def_file(cmd.get_path())
for a in expanded_args:
if not os.path.isabs(a):
a = os.path.join(builddir if in_builddir else srcdir, self.subdir, a)
if in_builddir:
a = self.absolute_builddir_path_for(os.path.join(self.subdir, a))
else:
a = os.path.join(srcdir, self.subdir, a)
self.add_build_def_file(a)

return RunProcess(cmd, expanded_args, env, srcdir, builddir, self.subdir,
Expand Down Expand Up @@ -919,7 +922,10 @@ def do_subproject(self, subp_name: SubProject, kwargs: kwtypes.DoSubproject, for
return self.disabled_subproject(subp_name, exception=e)
raise e

os.makedirs(os.path.join(self.build.environment.get_build_dir(), subdir), exist_ok=True)
is_build_only = for_machine is MachineChoice.BUILD and self.environment.is_cross_build()
os.makedirs(os.path.join(self.build.environment.get_build_dir(),
build.compute_build_subdir(subdir, is_build_only)),
exist_ok=True)
self.global_args_frozen = True

stack = ':'.join(self.subproject_stack[for_machine] + [subp_name])
Expand Down Expand Up @@ -2445,7 +2451,7 @@ def func_subdir(self, node: mparser.BaseNode, args: T.Tuple[str], kwargs: 'kwtyp
raise InvalidArguments(f'Tried to enter directory "{subdir}", which has already been visited.')
self.processed_buildfiles.add(build_file)
self.subdir = subdir
os.makedirs(os.path.join(self.environment.build_dir, subdir), exist_ok=True)
os.makedirs(self.absolute_builddir_path_for(subdir), exist_ok=True)
buildfilename = os.path.join(self.subdir, environment.build_filename)
self.build_def_files.add(buildfilename)
absname = os.path.join(self.environment.get_source_dir(), buildfilename)
Expand Down Expand Up @@ -2673,15 +2679,15 @@ def func_configure_file(self, node: mparser.BaseNode, args: T.List[TYPE_var],
output = outputs[0]
if depfile:
depfile = mesonlib.substitute_values([depfile], values)[0]
ofile_rpath = os.path.join(self.subdir, output)
ofile_rpath = self.relative_builddir_path_for(os.path.join(self.subdir, output))
if ofile_rpath in self.configure_file_outputs:
mesonbuildfile = os.path.join(self.subdir, 'meson.build')
current_call = f"{mesonbuildfile}:{self.current_lineno}"
first_call = "{}:{}".format(mesonbuildfile, self.configure_file_outputs[ofile_rpath])
mlog.warning('Output file', mlog.bold(ofile_rpath, True), 'for configure_file() at', current_call, 'overwrites configure_file() output at', first_call)
else:
self.configure_file_outputs[ofile_rpath] = self.current_lineno
(ofile_path, ofile_fname) = os.path.split(os.path.join(self.subdir, output))
(ofile_path, ofile_fname) = os.path.split(ofile_rpath)
ofile_abs = os.path.join(self.environment.build_dir, ofile_path, ofile_fname)

# Perform the appropriate action
Expand All @@ -2698,7 +2704,7 @@ def func_configure_file(self, node: mparser.BaseNode, args: T.List[TYPE_var],
if len(inputs) > 1:
raise InterpreterException('At most one input file can given in configuration mode')
if inputs:
os.makedirs(os.path.join(self.environment.build_dir, self.subdir), exist_ok=True)
os.makedirs(self.absolute_builddir_path_for(self.subdir), exist_ok=True)
file_encoding = kwargs['encoding']
missing_variables, confdata_useless = \
mesonlib.do_conf_file(inputs_abs[0], ofile_abs, conf,
Expand Down Expand Up @@ -2756,7 +2762,7 @@ def func_configure_file(self, node: mparser.BaseNode, args: T.List[TYPE_var],
elif kwargs['copy']:
if len(inputs_abs) != 1:
raise InterpreterException('Exactly one input file must be given in copy mode')
os.makedirs(os.path.join(self.environment.build_dir, self.subdir), exist_ok=True)
os.makedirs(self.absolute_builddir_path_for(self.subdir), exist_ok=True)
shutil.copy2(inputs_abs[0], ofile_abs)

# Install file if requested, we check for the empty string
Expand Down Expand Up @@ -2812,7 +2818,7 @@ def build_incdir_object(self, incdir_strings: T.List[str], is_system: bool = Fal
src_root = self.environment.get_source_dir()
build_root = self.environment.get_build_dir()
absbase_src = os.path.join(src_root, self.subdir)
absbase_build = os.path.join(build_root, self.subdir)
absbase_build = self.absolute_builddir_path_for(self.subdir)

for a in incdir_strings:
if path_is_in_root(Path(a), Path(src_root)):
Expand Down Expand Up @@ -3492,6 +3498,13 @@ def check_sources_exist(self, subdir, sources):
if not os.path.isfile(fname):
raise InterpreterException(f'Tried to add non-existing source file {s}.')

def absolute_builddir_path_for(self, subdir: str) -> str:
return os.path.join(self.environment.build_dir,
self.relative_builddir_path_for(subdir))

def relative_builddir_path_for(self, subdir: str) -> str:
return build.compute_build_subdir(subdir, self.coredata.is_build_only)

# Only permit object extraction from the same subproject
def validate_extraction(self, buildtarget: mesonlib.HoldableObject) -> None:
if self.subproject != buildtarget.subproject:
Expand Down
5 changes: 2 additions & 3 deletions mesonbuild/interpreter/mesonmain.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,11 +216,10 @@ def current_source_dir_method(self, args: T.List['TYPE_var'], kwargs: 'TYPE_kwar
@noPosargs
@noKwargs
def current_build_dir_method(self, args: T.List['TYPE_var'], kwargs: 'TYPE_kwargs') -> str:
src = self.interpreter.environment.build_dir
sub = self.interpreter.subdir
if sub == '':
return src
return os.path.join(src, sub)
return self.interpreter.environment.build_dir
return self.interpreter.absolute_builddir_path_for(sub)

@noPosargs
@noKwargs
Expand Down

0 comments on commit 6a37aa5

Please sign in to comment.