diff options
author | Markus Lehtonen <markus.lehtonen@linux.intel.com> | 2016-02-18 16:18:55 +0200 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-02-28 11:32:58 +0000 |
commit | 73bf792c858752008fe174840dad1171eee86635 (patch) | |
tree | 403c2b0108aae097824ff0241f71f0f3b0441a86 /scripts | |
parent | 2fbd1d77bdcecde9afab25cdb367c9a8f8f22205 (diff) | |
download | poky-73bf792c858752008fe174840dad1171eee86635.tar.gz |
devtool: update-recipe: create config fragment
Create config fragment if the user makes modifications to kernel config.
User may change .config e.g. by directly editing it or by running the
'do_menuconfig' bitbake task. Devtool generates one monolithic fragment
by simply doing a diff between .config and .config.baseline files in the
source directory. If either of these files is missing, the config
fragment is not gerenrated or updated. The output is a file,
'devtool-fragment.cfg' that gets added to SRC_URI in the recipe (as well
as copied into the 'oe-local-files' directory if that is present in the
source tree).
${S}/.config will be a symlink to ${B}/.config. We need to do this as
devtool is not able to access ${B} because ${B} is set in a .bbappend in
the workspace layer which is not parsed by devtool itself.
[YOCTO #8999]
(From OE-Core rev: 524da136e5b837a60682516ac08f3092c635e934)
Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/lib/devtool/standard.py | 56 |
1 files changed, 55 insertions, 1 deletions
diff --git a/scripts/lib/devtool/standard.py b/scripts/lib/devtool/standard.py index ad2c4f7235..f2beb6f2f2 100644 --- a/scripts/lib/devtool/standard.py +++ b/scripts/lib/devtool/standard.py | |||
@@ -20,6 +20,7 @@ import os | |||
20 | import sys | 20 | import sys |
21 | import re | 21 | import re |
22 | import shutil | 22 | import shutil |
23 | import subprocess | ||
23 | import tempfile | 24 | import tempfile |
24 | import logging | 25 | import logging |
25 | import argparse | 26 | import argparse |
@@ -775,6 +776,10 @@ def modify(args, config, basepath, workspace): | |||
775 | if bb.data.inherits_class('kernel', rd): | 776 | if bb.data.inherits_class('kernel', rd): |
776 | f.write('SRCTREECOVEREDTASKS = "do_validate_branches do_kernel_checkout ' | 777 | f.write('SRCTREECOVEREDTASKS = "do_validate_branches do_kernel_checkout ' |
777 | 'do_fetch do_unpack do_patch do_kernel_configme do_kernel_configcheck"\n') | 778 | 'do_fetch do_unpack do_patch do_kernel_configme do_kernel_configcheck"\n') |
779 | f.write('\ndo_configure_append() {\n' | ||
780 | ' cp ${B}/.config ${S}/.config.baseline\n' | ||
781 | ' ln -sfT ${B}/.config ${S}/.config\n' | ||
782 | '}\n') | ||
778 | if initial_rev: | 783 | if initial_rev: |
779 | f.write('\n# initial_rev: %s\n' % initial_rev) | 784 | f.write('\n# initial_rev: %s\n' % initial_rev) |
780 | for commit in commits: | 785 | for commit in commits: |
@@ -916,6 +921,33 @@ def _export_patches(srctree, rd, start_rev, destdir): | |||
916 | return (updated, added, existing_patches) | 921 | return (updated, added, existing_patches) |
917 | 922 | ||
918 | 923 | ||
924 | def _create_kconfig_diff(srctree, rd, outfile): | ||
925 | """Create a kconfig fragment""" | ||
926 | # Only update config fragment if both config files exist | ||
927 | orig_config = os.path.join(srctree, '.config.baseline') | ||
928 | new_config = os.path.join(srctree, '.config') | ||
929 | if os.path.exists(orig_config) and os.path.exists(new_config): | ||
930 | cmd = ['diff', '--new-line-format=%L', '--old-line-format=', | ||
931 | '--unchanged-line-format=', orig_config, new_config] | ||
932 | pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, | ||
933 | stderr=subprocess.PIPE) | ||
934 | stdout, stderr = pipe.communicate() | ||
935 | if pipe.returncode == 1: | ||
936 | logger.info("Updating config fragment %s" % outfile) | ||
937 | with open(outfile, 'w') as fobj: | ||
938 | fobj.write(stdout) | ||
939 | elif pipe.returncode == 0: | ||
940 | logger.info("Would remove config fragment %s" % outfile) | ||
941 | if os.path.exists(outfile): | ||
942 | # Remove fragment file in case of empty diff | ||
943 | logger.info("Removing config fragment %s" % outfile) | ||
944 | os.unlink(outfile) | ||
945 | else: | ||
946 | raise bb.process.ExecutionError(cmd, pipe.returncode, stdout, stderr) | ||
947 | return True | ||
948 | return False | ||
949 | |||
950 | |||
919 | def _export_local_files(srctree, rd, destdir): | 951 | def _export_local_files(srctree, rd, destdir): |
920 | """Copy local files from srctree to given location. | 952 | """Copy local files from srctree to given location. |
921 | Returns three-tuple of dicts: | 953 | Returns three-tuple of dicts: |
@@ -936,6 +968,7 @@ def _export_local_files(srctree, rd, destdir): | |||
936 | updated = OrderedDict() | 968 | updated = OrderedDict() |
937 | added = OrderedDict() | 969 | added = OrderedDict() |
938 | removed = OrderedDict() | 970 | removed = OrderedDict() |
971 | local_files_dir = os.path.join(srctree, 'oe-local-files') | ||
939 | git_files = _git_ls_tree(srctree) | 972 | git_files = _git_ls_tree(srctree) |
940 | if 'oe-local-files' in git_files: | 973 | if 'oe-local-files' in git_files: |
941 | # If tracked by Git, take the files from srctree HEAD. First get | 974 | # If tracked by Git, take the files from srctree HEAD. First get |
@@ -946,11 +979,32 @@ def _export_local_files(srctree, rd, destdir): | |||
946 | env=dict(os.environ, GIT_WORK_TREE=destdir, | 979 | env=dict(os.environ, GIT_WORK_TREE=destdir, |
947 | GIT_INDEX_FILE=tmp_index)) | 980 | GIT_INDEX_FILE=tmp_index)) |
948 | new_set = _git_ls_tree(srctree, tree, True).keys() | 981 | new_set = _git_ls_tree(srctree, tree, True).keys() |
949 | elif os.path.isdir(os.path.join(srctree, 'oe-local-files')): | 982 | elif os.path.isdir(local_files_dir): |
950 | # If not tracked by Git, just copy from working copy | 983 | # If not tracked by Git, just copy from working copy |
951 | new_set = _ls_tree(os.path.join(srctree, 'oe-local-files')) | 984 | new_set = _ls_tree(os.path.join(srctree, 'oe-local-files')) |
952 | bb.process.run(['cp', '-ax', | 985 | bb.process.run(['cp', '-ax', |
953 | os.path.join(srctree, 'oe-local-files', '.'), destdir]) | 986 | os.path.join(srctree, 'oe-local-files', '.'), destdir]) |
987 | else: | ||
988 | new_set = [] | ||
989 | |||
990 | # Special handling for kernel config | ||
991 | if bb.data.inherits_class('kernel-yocto', rd): | ||
992 | fragment_fn = 'devtool-fragment.cfg' | ||
993 | fragment_path = os.path.join(destdir, fragment_fn) | ||
994 | if _create_kconfig_diff(srctree, rd, fragment_path): | ||
995 | if os.path.exists(fragment_path): | ||
996 | if fragment_fn not in new_set: | ||
997 | new_set.append(fragment_fn) | ||
998 | # Copy fragment to local-files | ||
999 | if os.path.isdir(local_files_dir): | ||
1000 | shutil.copy2(fragment_path, local_files_dir) | ||
1001 | else: | ||
1002 | if fragment_fn in new_set: | ||
1003 | new_set.remove(fragment_fn) | ||
1004 | # Remove fragment from local-files | ||
1005 | if os.path.exists(os.path.join(local_files_dir, fragment_fn)): | ||
1006 | os.unlink(os.path.join(local_files_dir, fragment_fn)) | ||
1007 | |||
954 | if new_set is not None: | 1008 | if new_set is not None: |
955 | for fname in new_set: | 1009 | for fname in new_set: |
956 | if fname in existing_files: | 1010 | if fname in existing_files: |