blob: 00ba3b0408d00c5ec68de29df6f351747a8ddb6d [file] [log] [blame]
# Copyright 2019 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
"""Copies built host tools into Pigweed's host_tools directory."""
import argparse
import logging
from pathlib import Path
import shutil
import sys
from typing import Optional
import pw_cli.log
_LOG = logging.getLogger(__name__)
def argument_parser(
parser: Optional[argparse.ArgumentParser] = None
) -> argparse.ArgumentParser:
"""Registers the script's arguments on an argument parser."""
if parser is None:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--dst',
type=Path,
required=True,
help='Path to host tools directory')
parser.add_argument('--name', help='Name for the installed tool')
parser.add_argument('--out-root',
type=Path,
required=True,
help='Root of Ninja out directory')
parser.add_argument('--src',
type=Path,
required=True,
help='Path to host tool executable')
return parser
def main() -> int:
"""Copies a host tool into a destination directory."""
args = argument_parser().parse_args()
if not args.src.is_file():
_LOG.error('%s is not a file', args.src)
return 1
args.dst.mkdir(parents=True, exist_ok=True)
if args.name is not None:
if '/' in args.name:
_LOG.error('Host tool name cannot contain "/"')
return 1
name = args.name
else:
name = args.src.name
try:
shutil.copy2(args.src, args.dst.joinpath(name))
except OSError as err:
_LOG.error('%s', err)
# Errno 26 (text file busy) indicates that a host tool binary is
# currently running.
# TODO(frolv): Check if this works on Windows.
if err.errno == 26:
_LOG.error('')
_LOG.error(' %s has been rebuilt but cannot be', name)
_LOG.error(' copied into the host tools directory:')
_LOG.error('')
_LOG.error(' %s',
args.dst.relative_to(args.out_root).joinpath(name))
_LOG.error('')
_LOG.error(' This can occur if the program is already running.')
_LOG.error(
' If it is running, exit it and try re-running the build.')
_LOG.error('')
return 1
return 0
if __name__ == '__main__':
pw_cli.log.install()
sys.exit(main())