mirror of
https://github.com/thead-yocto-mirror/meta-external-toolchain
synced 2026-06-21 08:52:27 +02:00
Add support for FILES_PREMIRRORS
This lets us prefer certain alternative paths to the default in
particular cases, such as use of ${libdir}/bin in the case of a multilib
build to avoid bindir conflicts.
Signed-off-by: Christopher Larson <chris_larson@mentor.com>
This commit is contained in:
@@ -59,6 +59,8 @@ EXTERNAL_INSTALL_SOURCE_PATHS = "\
|
||||
"
|
||||
|
||||
# Potential locations within the external toolchain sysroot
|
||||
FILES_PREMIRRORS ?= ""
|
||||
|
||||
FILES_MIRRORS = "\
|
||||
${bindir}/|/usr/${baselib}/bin/\n \
|
||||
${base_libdir}/|/usr/${baselib}/\n \
|
||||
|
||||
@@ -73,7 +73,7 @@ python () {
|
||||
if not bb.utils.to_boolean(d.getVar('EXTERNAL_AUTO_PROVIDE', d)):
|
||||
return
|
||||
|
||||
sysroots, mirrors = oe.external.get_file_search_metadata(d)
|
||||
sysroots, mirrors, premirrors = oe.external.get_file_search_metadata(d)
|
||||
search_patterns = []
|
||||
pattern = d.getVar('EXTERNAL_PROVIDE_PATTERN', True)
|
||||
if pattern:
|
||||
@@ -82,7 +82,7 @@ python () {
|
||||
files = oe.external.gather_pkg_files(d)
|
||||
search_patterns.extend(filter(lambda f: '.debug' not in f, files))
|
||||
|
||||
expanded = oe.external.expand_paths(search_patterns, mirrors)
|
||||
expanded = oe.external.expand_paths(search_patterns, mirrors, premirrors)
|
||||
paths = oe.external.search_sysroots(expanded, sysroots)
|
||||
if not any(f for p, f in paths):
|
||||
raise bb.parse.SkipPackage('No files found in external toolchain sysroot for: {}'.format(', '.join(search_patterns)))
|
||||
@@ -118,9 +118,9 @@ def external_toolchain_propagate_mode (d, installdest):
|
||||
python external_toolchain_do_install () {
|
||||
import subprocess
|
||||
installdest = d.getVar('D', True)
|
||||
sysroots, mirrors = oe.external.get_file_search_metadata(d)
|
||||
sysroots, mirrors, premirrors = oe.external.get_file_search_metadata(d)
|
||||
files = oe.external.gather_pkg_files(d)
|
||||
oe.external.copy_from_sysroots(files, sysroots, mirrors, installdest)
|
||||
oe.external.copy_from_sysroots(files, sysroots, mirrors, premirrors, installdest)
|
||||
if 'do_install_extra' in d:
|
||||
bb.build.exec_func('do_install_extra', d)
|
||||
external_toolchain_propagate_mode(d, installdest)
|
||||
|
||||
@@ -29,24 +29,35 @@ def run(d, cmd, *args):
|
||||
return 'UNKNOWN'
|
||||
|
||||
|
||||
def get_file_search_metadata(d):
|
||||
'''Given the metadata, return the mirrors and sysroots to operate against.'''
|
||||
|
||||
mirrors = []
|
||||
for entry in d.getVar('FILES_MIRRORS').replace('\\n', '\n').split('\n'):
|
||||
def parse_mirrors(mirrors_string):
|
||||
mirrors, invalid = [], []
|
||||
for entry in mirrors_string.replace('\\n', '\n').split('\n'):
|
||||
entry = entry.strip()
|
||||
if not entry:
|
||||
continue
|
||||
try:
|
||||
pathname, subst = entry.strip().split('|', 1)
|
||||
except ValueError:
|
||||
bb.warn('Invalid FILES_MIRRORS entry: {0}'.format(entry))
|
||||
invalid.append(entry)
|
||||
mirrors.append(('^' + re.escape(pathname), subst))
|
||||
return mirrors, invalid
|
||||
|
||||
|
||||
def get_file_search_metadata(d):
|
||||
'''Given the metadata, return the mirrors and sysroots to operate against.'''
|
||||
|
||||
premirrors, invalid = parse_mirrors(d.getVar('FILES_PREMIRRORS'))
|
||||
for invalid_entry in invalid:
|
||||
bb.warn('Invalid FILES_MIRRORS entry: {0}'.format(invalid_entry))
|
||||
|
||||
mirrors, invalid = parse_mirrors(d.getVar('FILES_MIRRORS'))
|
||||
for invalid_entry in invalid:
|
||||
bb.warn('Invalid FILES_MIRRORS entry: {0}'.format(invalid_entry))
|
||||
|
||||
source_paths = [os.path.realpath(p)
|
||||
for p in d.getVar('EXTERNAL_INSTALL_SOURCE_PATHS').split()]
|
||||
|
||||
return source_paths, mirrors
|
||||
return source_paths, mirrors, premirrors
|
||||
|
||||
|
||||
def gather_pkg_files(d):
|
||||
@@ -60,10 +71,10 @@ def gather_pkg_files(d):
|
||||
return files
|
||||
|
||||
|
||||
def copy_from_sysroots(pathnames, sysroots, mirrors, installdest):
|
||||
def copy_from_sysroots(pathnames, sysroots, mirrors, premirrors, installdest):
|
||||
'''Copy the specified files from the specified sysroots, also checking the
|
||||
specified mirror patterns as alternate paths, to the specified destination.'''
|
||||
expanded_pathnames = expand_paths(pathnames, mirrors)
|
||||
expanded_pathnames = expand_paths(pathnames, mirrors, premirrors)
|
||||
searched_paths = search_sysroots(expanded_pathnames, sysroots)
|
||||
for path, files in searched_paths:
|
||||
if not files:
|
||||
@@ -74,13 +85,24 @@ def copy_from_sysroots(pathnames, sysroots, mirrors, installdest):
|
||||
subprocess.check_call(['cp', '-PR', '--preserve=mode,timestamps', '--no-preserve=ownership'] + list(files) + [destdir + '/'])
|
||||
bb.note('Copied `{}` to `{}/`'.format(', '.join(files), destdir))
|
||||
|
||||
def expand_paths(pathnames, mirrors):
|
||||
def expand_paths(pathnames, mirrors, premirrors):
|
||||
'''Apply search/replace to paths to get alternate search paths.
|
||||
|
||||
Returns a generator with tuples of (pathname, expanded_paths).'''
|
||||
import re
|
||||
for pathname in pathnames:
|
||||
expanded_paths = [pathname]
|
||||
expanded_paths = []
|
||||
|
||||
for search, replace in premirrors:
|
||||
try:
|
||||
new_pathname = re.sub(search, replace, pathname, count=1)
|
||||
except re.error as exc:
|
||||
bb.warn("Invalid pattern for `%s`" % search)
|
||||
continue
|
||||
if new_pathname != pathname:
|
||||
expanded_paths.append(new_pathname)
|
||||
|
||||
expanded_paths.append(pathname)
|
||||
|
||||
for search, replace in mirrors:
|
||||
try:
|
||||
@@ -102,7 +124,7 @@ def search_sysroots(path_entries, sysroots):
|
||||
import itertools
|
||||
for path, pathnames in path_entries:
|
||||
for sysroot, pathname in ((s, p) for s in sysroots
|
||||
for p in itertools.chain([path], pathnames)):
|
||||
for p in pathnames):
|
||||
check_path = sysroot + os.sep + pathname
|
||||
found_paths = glob.glob(check_path)
|
||||
if found_paths:
|
||||
@@ -113,7 +135,7 @@ def search_sysroots(path_entries, sysroots):
|
||||
|
||||
|
||||
def find_sysroot_files(paths, d):
|
||||
sysroots, mirrors = get_file_search_metadata(d)
|
||||
expanded = expand_paths(paths, mirrors)
|
||||
sysroots, mirrors, premirrors = get_file_search_metadata(d)
|
||||
expanded = expand_paths(paths, mirrors, premirrors)
|
||||
search_results = list(search_sysroots(expanded, sysroots))
|
||||
return [v for k, v in search_results]
|
||||
|
||||
Reference in New Issue
Block a user