devtool: deploy-target: Support stripped libs and execs

New devtool deploy-target option --strip which enables deploying
stripped binaries, saving some space on target.

* Copies the files of ${D} into a new directory and strips them in place
* Used oe.package.strip_execs for stripping directory
* Added devtool.conf option "strip" for changing default behavior

Config example:
[Deploy]
strip = true

[YOCTO #11227]

(From OE-Core rev: 7f10c5118793da6ded59ae6e60e796152dbd7ca3)

Signed-off-by: Tobias Hagelborn <tobiasha@axis.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Tobias Hagelborn 2017-08-25 13:32:38 +02:00 committed by Richard Purdie
parent 390dcbf2e1
commit cd26fc143b

View File

@ -16,12 +16,16 @@
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
"""Devtool plugin containing the deploy subcommands""" """Devtool plugin containing the deploy subcommands"""
import os
import subprocess
import logging import logging
import tempfile import os
import shutil import shutil
import subprocess
import tempfile
import bb.utils
import argparse_oe import argparse_oe
import oe.types
from devtool import exec_fakeroot, setup_tinfoil, check_workspace_recipe, DevtoolError from devtool import exec_fakeroot, setup_tinfoil, check_workspace_recipe, DevtoolError
logger = logging.getLogger('devtool') logger = logging.getLogger('devtool')
@ -140,11 +144,12 @@ def _prepare_remote_script(deploy, verbose=False, dryrun=False, undeployall=Fals
return '\n'.join(lines) return '\n'.join(lines)
def deploy(args, config, basepath, workspace): def deploy(args, config, basepath, workspace):
"""Entry point for the devtool 'deploy' subcommand""" """Entry point for the devtool 'deploy' subcommand"""
import re
import math import math
import oe.recipeutils import oe.recipeutils
import oe.package
check_workspace_recipe(workspace, args.recipename, checksrc=False) check_workspace_recipe(workspace, args.recipename, checksrc=False)
@ -170,6 +175,17 @@ def deploy(args, config, basepath, workspace):
'recipe? If so, the install step has not installed ' 'recipe? If so, the install step has not installed '
'any files.' % args.recipename) 'any files.' % args.recipename)
if args.strip and not args.dry_run:
# Fakeroot copy to new destination
srcdir = recipe_outdir
recipe_outdir = os.path.join(rd.getVar('WORKDIR', True), 'deploy-target-stripped')
if os.path.isdir(recipe_outdir):
bb.utils.remove(recipe_outdir, True)
exec_fakeroot(rd, "cp -af %s %s" % (os.path.join(srcdir, '.'), recipe_outdir), shell=True)
os.environ['PATH'] = ':'.join([os.environ['PATH'], rd.getVar('PATH', True) or ''])
oe.package.strip_execs(args.recipename, recipe_outdir, rd.getVar('STRIP', True), rd.getVar('libdir', True),
rd.getVar('base_libdir', True))
filelist = [] filelist = []
ftotalsize = 0 ftotalsize = 0
for root, _, files in os.walk(recipe_outdir): for root, _, files in os.walk(recipe_outdir):
@ -189,7 +205,6 @@ def deploy(args, config, basepath, workspace):
print(' %s' % item) print(' %s' % item)
return 0 return 0
extraoptions = '' extraoptions = ''
if args.no_host_check: if args.no_host_check:
extraoptions += '-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' extraoptions += '-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
@ -301,6 +316,7 @@ def undeploy(args, config, basepath, workspace):
def register_commands(subparsers, context): def register_commands(subparsers, context):
"""Register devtool subcommands from the deploy plugin""" """Register devtool subcommands from the deploy plugin"""
parser_deploy = subparsers.add_parser('deploy-target', parser_deploy = subparsers.add_parser('deploy-target',
help='Deploy recipe output files to live target machine', help='Deploy recipe output files to live target machine',
description='Deploys a recipe\'s build output (i.e. the output of the do_install task) to a live target machine over ssh. By default, any existing files will be preserved instead of being overwritten and will be restored if you run devtool undeploy-target. Note: this only deploys the recipe itself and not any runtime dependencies, so it is assumed that those have been installed on the target beforehand.', description='Deploys a recipe\'s build output (i.e. the output of the do_install task) to a live target machine over ssh. By default, any existing files will be preserved instead of being overwritten and will be restored if you run devtool undeploy-target. Note: this only deploys the recipe itself and not any runtime dependencies, so it is assumed that those have been installed on the target beforehand.',
@ -313,6 +329,15 @@ def register_commands(subparsers, context):
parser_deploy.add_argument('-p', '--no-preserve', help='Do not preserve existing files', action='store_true') parser_deploy.add_argument('-p', '--no-preserve', help='Do not preserve existing files', action='store_true')
parser_deploy.add_argument('--no-check-space', help='Do not check for available space before deploying', action='store_true') parser_deploy.add_argument('--no-check-space', help='Do not check for available space before deploying', action='store_true')
parser_deploy.add_argument('-P', '--port', default='22', help='Port to use for connection to the target') parser_deploy.add_argument('-P', '--port', default='22', help='Port to use for connection to the target')
strip_opts = parser_deploy.add_mutually_exclusive_group(required=False)
strip_opts.add_argument('-S', '--strip',
help='Strip executables prior to deploying (default: %(default)s). '
'The default value of this option can be controlled by setting the strip option in the [Deploy] section to True or False.',
default=oe.types.boolean(context.config.get('Deploy', 'strip', default='0')),
action='store_true')
strip_opts.add_argument('--no-strip', help='Do not strip executables prior to deploy', dest='strip', action='store_false')
parser_deploy.set_defaults(func=deploy) parser_deploy.set_defaults(func=deploy)
parser_undeploy = subparsers.add_parser('undeploy-target', parser_undeploy = subparsers.add_parser('undeploy-target',