buildman: Support an in-tree build in the current dir

Allow -w to be used with -i to do a build without a separate output
directory.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass
2025-05-27 05:19:21 -06:00
committed by Tom Rini
parent 9002ab0986
commit 919ba46d72
4 changed files with 33 additions and 21 deletions

View File

@@ -631,10 +631,13 @@ class Builder:
Args:
commit_upto: Commit number to use (0..self.count-1)
target: Target name
Return:
str: Output directory to use, or '' if None
"""
output_dir = self.get_output_dir(commit_upto)
if self.work_in_output:
return output_dir
return output_dir or ''
return os.path.join(output_dir, target)
def get_done_file(self, commit_upto, target):
@@ -1683,7 +1686,7 @@ class Builder:
"""
thread_dir = self.get_thread_dir(thread_num)
builderthread.mkdir(thread_dir)
git_dir = os.path.join(thread_dir, '.git')
git_dir = os.path.join(thread_dir, '.git') if thread_dir else None
# Create a worktree or a git repo clone for this thread if it
# doesn't already exist

View File

@@ -31,13 +31,13 @@ def mkdir(dirname, parents=False):
"""Make a directory if it doesn't already exist.
Args:
dirname (str): Directory to create
dirname (str): Directory to create, or None to do nothing
parents (bool): True to also make parent directories
Raises:
OSError: File already exists
"""
if os.path.exists(dirname):
if not dirname or os.path.exists(dirname):
return
try:
if parents:
@@ -57,7 +57,7 @@ def _remove_old_outputs(out_dir):
"""Remove any old output-target files
Args:
out_dir (str): Output directory for the build
out_dir (str): Output directory for the build, or None for current dir
Since we use a build directory that was previously used by another
board, it may have produced an SPL image. If we don't remove it (i.e.
@@ -65,7 +65,7 @@ def _remove_old_outputs(out_dir):
output of this build, even if it does not produce SPL images.
"""
for elf in BASE_ELF_FILENAMES:
fname = os.path.join(out_dir, elf)
fname = os.path.join(out_dir or '', elf)
if os.path.exists(fname):
os.remove(fname)
@@ -193,9 +193,11 @@ class BuilderThread(threading.Thread):
Args:
brd (Board): Board to create arguments for
out_dir (str): Path to output directory containing the files
out_dir (str): Path to output directory containing the files, or
or None to not use a separate output directory
out_rel_dir (str): Output directory relative to the current dir
work_dir (str): Directory to which the source will be checked out
work_dir (str): Directory to which the source will be checked out,
or None to use current directory
commit_upto (int): Commit number to build (0...n-1)
Returns:
@@ -206,7 +208,7 @@ class BuilderThread(threading.Thread):
"""
args = []
cwd = work_dir
src_dir = os.path.realpath(work_dir)
src_dir = os.path.realpath(work_dir) if work_dir else os.getcwd()
if commit_upto is None:
# In this case we are building in the original source directory
# (i.e. the current directory where buildman is invoked. The
@@ -215,8 +217,9 @@ class BuilderThread(threading.Thread):
#
# Symlinks can confuse U-Boot's Makefile since we may use '..'
# in our path, so remove them.
real_dir = os.path.realpath(out_dir)
args.append(f'O={real_dir}')
if out_dir:
real_dir = os.path.realpath(out_dir)
args.append(f'O={real_dir}')
cwd = None
src_dir = os.getcwd()
elif out_rel_dir:
@@ -398,7 +401,8 @@ class BuilderThread(threading.Thread):
config_only (bool): Only configure the source, do not build it
adjust_cfg (list of str): See the cfgutil module and run_commit()
commit (Commit): Commit only being built
out_dir (str): Output directory for the build
out_dir (str): Output directory for the build, or None to use
current
out_rel_dir (str): Output directory relatie to the current dir
result (CommandResult): Previous result
@@ -410,7 +414,7 @@ class BuilderThread(threading.Thread):
"""
# Set up the environment and command line
env = self.builder.make_environment(self.toolchain)
if not os.path.exists(out_dir):
if out_dir and not os.path.exists(out_dir):
mkdir(out_dir)
args, cwd, src_dir = self._build_args(brd, out_dir, out_rel_dir,
@@ -421,7 +425,7 @@ class BuilderThread(threading.Thread):
_remove_old_outputs(out_dir)
# If we need to reconfigure, do that now
cfg_file = os.path.join(out_dir, '.config')
cfg_file = os.path.join(out_dir or '', '.config')
cmd_list = []
if do_config or adjust_cfg:
result = self._reconfigure(

View File

@@ -1338,6 +1338,8 @@ disturbed by the build. Use `-i` to do an in-tree build instead. Note that this
does not affect the source directory, since buildman creates a separate git
'worktree' for each board. This means that it is possible to do an in-tree
build of an entire branch, or even a 'current source' build for multiple boards.
As a special case, you can use `-wi` to do an in-tree build in the current
directory.
Build summary
-------------

View File

@@ -390,7 +390,7 @@ def get_boards_obj(output_dir, regen_board_list, maintainer_check, full_check,
read it in.
Args:
output_dir (str): Output directory to use
output_dir (str): Output directory to use, or None to use current dir
regen_board_list (bool): True to just regenerate the board list
maintainer_check (bool): True to just run a maintainer check
full_check (bool): True to just run a full check of Kconfig and
@@ -414,9 +414,9 @@ def get_boards_obj(output_dir, regen_board_list, maintainer_check, full_check,
return 2
return 0
if not os.path.exists(output_dir):
if output_dir and not os.path.exists(output_dir):
os.makedirs(output_dir)
board_file = os.path.join(output_dir, 'boards.cfg')
board_file = os.path.join(output_dir or '', 'boards.cfg')
if regen_board_list and regen_board_list != '-':
board_file = regen_board_list
@@ -501,7 +501,7 @@ def adjust_args(args, series, selected):
def setup_output_dir(output_dir, work_in_output, branch, no_subdirs, col,
clean_dir):
in_tree, clean_dir):
"""Set up the output directory
Args:
@@ -509,6 +509,7 @@ def setup_output_dir(output_dir, work_in_output, branch, no_subdirs, col,
work_in_output (bool): True to work in the output directory
branch (str): Name of branch to build, or None if none
no_subdirs (bool): True to put the output in the top-level output dir
in_tree (bool): True if doing an in-tree build
clean_dir: Used for tests only, indicates that the existing output_dir
should be removed before starting the build
@@ -516,9 +517,11 @@ def setup_output_dir(output_dir, work_in_output, branch, no_subdirs, col,
str: Updated output directory pathname
"""
if not output_dir:
if work_in_output:
sys.exit(col.build(col.RED, '-w requires that you specify -o'))
output_dir = '..'
if work_in_output:
if not in_tree:
sys.exit(col.build(col.RED, '-w requires that you specify -o'))
output_dir = None
if branch and not no_subdirs:
# As a special case allow the board directory to be placed in the
# output directory itself rather than any subdirectory.
@@ -751,7 +754,7 @@ def do_buildman(args, toolchains=None, make_func=None, brds=None,
output_dir = setup_output_dir(
args.output_dir, args.work_in_output, args.branch,
args.no_subdirs, col, clean_dir)
args.no_subdirs, col, args.in_tree, clean_dir)
# Work out what subset of the boards we are building
if not brds: