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:
parent
7b6e5b025e
commit
524ee088b3
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue