recipetool: create: improve CMake package mapping

* Package names are actually case sensitive near as I can tell, so we
  shouldn't be lowercasing them everywhere.
* Look for CMake packages in pkgdata and map those back to recipes,
  so we aren't dependent on the hardcoded mappings (though those are
  still preserved).
* Avoid duplicates in the unmapped package list

(From OE-Core rev: 2ddad52ccca07245eea43d9b844c6c7d4b667ca3)

Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Paul Eggleton 2016-02-19 22:39:02 +13:00 committed by Richard Purdie
parent 7b6e5b025e
commit 524ee088b3
2 changed files with 40 additions and 14 deletions

View File

@ -43,6 +43,7 @@ def tinfoil_init(instance):
class RecipeHandler(object): class RecipeHandler(object):
recipelibmap = {} recipelibmap = {}
recipeheadermap = {} recipeheadermap = {}
recipecmakefilemap = {}
@staticmethod @staticmethod
def load_libmap(d): def load_libmap(d):
@ -90,15 +91,18 @@ class RecipeHandler(object):
RecipeHandler.recipelibmap['GLESv2'] = 'virtual/libgles2' RecipeHandler.recipelibmap['GLESv2'] = 'virtual/libgles2'
@staticmethod @staticmethod
def load_headermap(d): def load_devel_filemap(d):
'''Build up lib headerfile->recipe mapping''' '''Build up development file->recipe mapping'''
if RecipeHandler.recipeheadermap: if RecipeHandler.recipeheadermap:
return return
pkgdata_dir = d.getVar('PKGDATA_DIR', True)
includedir = d.getVar('includedir', True) includedir = d.getVar('includedir', True)
cmakedir = os.path.join(d.getVar('libdir', True), 'cmake')
for pkg in glob.glob(os.path.join(pkgdata_dir, 'runtime', '*-dev')): for pkg in glob.glob(os.path.join(pkgdata_dir, 'runtime', '*-dev')):
with open(os.path.join(pkgdata_dir, 'runtime', pkg)) as f: with open(os.path.join(pkgdata_dir, 'runtime', pkg)) as f:
pn = None pn = None
headers = [] headers = []
cmakefiles = []
for line in f: for line in f:
if line.startswith('PN:'): if line.startswith('PN:'):
pn = line.split(':', 1)[-1].strip() pn = line.split(':', 1)[-1].strip()
@ -108,9 +112,14 @@ class RecipeHandler(object):
for fullpth in sorted(dictval): for fullpth in sorted(dictval):
if fullpth.startswith(includedir) and fullpth.endswith('.h'): if fullpth.startswith(includedir) and fullpth.endswith('.h'):
headers.append(os.path.relpath(fullpth, includedir)) headers.append(os.path.relpath(fullpth, includedir))
elif fullpth.startswith(cmakedir) and fullpth.endswith('.cmake'):
cmakefiles.append(os.path.relpath(fullpth, cmakedir))
if pn and headers: if pn and headers:
for header in headers: for header in headers:
RecipeHandler.recipeheadermap[header] = pn RecipeHandler.recipeheadermap[header] = pn
if pn and cmakefiles:
for fn in cmakefiles:
RecipeHandler.recipecmakefilemap[fn] = pn
@staticmethod @staticmethod
def checkfiles(path, speclist, recursive=False): def checkfiles(path, speclist, recursive=False):
@ -172,7 +181,7 @@ class RecipeHandler(object):
deps.append(recipe) deps.append(recipe)
elif recipe is None: elif recipe is None:
if header: if header:
RecipeHandler.load_headermap(d) RecipeHandler.load_devel_filemap(d)
recipe = RecipeHandler.recipeheadermap.get(header, None) recipe = RecipeHandler.recipeheadermap.get(header, None)
if recipe: if recipe:
deps.append(recipe) deps.append(recipe)

View File

@ -17,6 +17,7 @@
import re import re
import logging import logging
import glob
from recipetool.create import RecipeHandler, validate_pv from recipetool.create import RecipeHandler, validate_pv
logger = logging.getLogger('recipetool') logger = logging.getLogger('recipetool')
@ -156,6 +157,16 @@ class CmakeRecipeHandler(RecipeHandler):
subdir_re = re.compile('add_subdirectory\s*\(\s*([^)\s]*)\s*([^)\s]*)\s*\)', re.IGNORECASE) subdir_re = re.compile('add_subdirectory\s*\(\s*([^)\s]*)\s*([^)\s]*)\s*\)', re.IGNORECASE)
dep_re = re.compile('([^ ><=]+)( *[<>=]+ *[^ ><=]+)?') dep_re = re.compile('([^ ><=]+)( *[<>=]+ *[^ ><=]+)?')
def find_cmake_package(pkg):
RecipeHandler.load_devel_filemap(tinfoil.config_data)
for fn, pn in RecipeHandler.recipecmakefilemap.iteritems():
splitname = fn.split('/')
if len(splitname) > 1:
if splitname[0].lower().startswith(pkg.lower()):
if splitname[1] == '%s-config.cmake' % pkg.lower() or splitname[1] == '%sConfig.cmake' % pkg or splitname[1] == 'Find%s.cmake' % pkg:
return pn
return None
def interpret_value(value): def interpret_value(value):
return value.strip('"') return value.strip('"')
@ -209,7 +220,7 @@ class CmakeRecipeHandler(RecipeHandler):
res = findpackage_re.match(line) res = findpackage_re.match(line)
if res: if res:
origpkg = res.group(1) origpkg = res.group(1)
pkg = interpret_value(origpkg.lower()) pkg = interpret_value(origpkg)
found = False found = False
for handler in handlers: for handler in handlers:
if handler.process_findpackage(srctree, fn, pkg, deps, outlines, inherits, values): if handler.process_findpackage(srctree, fn, pkg, deps, outlines, inherits, values):
@ -218,23 +229,29 @@ class CmakeRecipeHandler(RecipeHandler):
break break
if found: if found:
continue continue
elif pkg == 'gettext': elif pkg == 'Gettext':
inherits.append('gettext') inherits.append('gettext')
elif pkg == 'perl': elif pkg == 'Perl':
inherits.append('perlnative') inherits.append('perlnative')
elif pkg == 'pkgconfig': elif pkg == 'PkgConfig':
inherits.append('pkgconfig') inherits.append('pkgconfig')
elif pkg == 'pythoninterp': elif pkg == 'PythonInterp':
inherits.append('pythonnative') inherits.append('pythonnative')
elif pkg == 'pythonlibs': elif pkg == 'PythonLibs':
inherits.append('python-dir') inherits.append('python-dir')
else: else:
dep = cmake_pkgmap.get(pkg, None) # Try to map via looking at installed CMake packages in pkgdata
dep = find_cmake_package(pkg)
if dep: if dep:
logger.debug('Mapped CMake package %s to recipe %s via internal list' % (pkg, dep)) logger.debug('Mapped CMake package %s to recipe %s via pkgdata' % (pkg, dep))
deps.append(dep) deps.append(dep)
elif dep is None: else:
unmappedpkgs.append(origpkg) dep = cmake_pkgmap.get(pkg.lower(), None)
if dep:
logger.debug('Mapped CMake package %s to recipe %s via internal list' % (pkg, dep))
deps.append(dep)
elif dep is None:
unmappedpkgs.append(origpkg)
continue continue
res = checklib_re.match(line) res = checklib_re.match(line)
if res: if res:
@ -257,7 +274,7 @@ class CmakeRecipeHandler(RecipeHandler):
parse_cmake_file(srcfiles[0]) parse_cmake_file(srcfiles[0])
if unmappedpkgs: if unmappedpkgs:
outlines.append('# NOTE: unable to map the following CMake package dependencies: %s' % ' '.join(unmappedpkgs)) outlines.append('# NOTE: unable to map the following CMake package dependencies: %s' % ' '.join(list(set(unmappedpkgs))))
RecipeHandler.handle_depends(libdeps, pcdeps, deps, outlines, values, tinfoil.config_data) RecipeHandler.handle_depends(libdeps, pcdeps, deps, outlines, values, tinfoil.config_data)