diff options
Diffstat (limited to 'scripts/lib/recipetool/create_buildsys.py')
-rw-r--r-- | scripts/lib/recipetool/create_buildsys.py | 95 |
1 files changed, 94 insertions, 1 deletions
diff --git a/scripts/lib/recipetool/create_buildsys.py b/scripts/lib/recipetool/create_buildsys.py index c6d9bbe254..127e13359b 100644 --- a/scripts/lib/recipetool/create_buildsys.py +++ b/scripts/lib/recipetool/create_buildsys.py | |||
@@ -144,6 +144,8 @@ class AutotoolsRecipeHandler(RecipeHandler): | |||
144 | def extract_autotools_deps(outlines, srctree, extravalues=None, acfile=None): | 144 | def extract_autotools_deps(outlines, srctree, extravalues=None, acfile=None): |
145 | import shlex | 145 | import shlex |
146 | import oe.package | 146 | import oe.package |
147 | import json | ||
148 | import glob | ||
147 | 149 | ||
148 | values = {} | 150 | values = {} |
149 | inherits = [] | 151 | inherits = [] |
@@ -163,6 +165,7 @@ class AutotoolsRecipeHandler(RecipeHandler): | |||
163 | pkg_re = re.compile('PKG_CHECK_MODULES\(\[?[a-zA-Z0-9_]*\]?, *\[?([^,\]]*)\]?[),].*') | 165 | pkg_re = re.compile('PKG_CHECK_MODULES\(\[?[a-zA-Z0-9_]*\]?, *\[?([^,\]]*)\]?[),].*') |
164 | pkgce_re = re.compile('PKG_CHECK_EXISTS\(\[?([^,\]]*)\]?[),].*') | 166 | pkgce_re = re.compile('PKG_CHECK_EXISTS\(\[?([^,\]]*)\]?[),].*') |
165 | lib_re = re.compile('AC_CHECK_LIB\(\[?([^,\]]*)\]?,.*') | 167 | lib_re = re.compile('AC_CHECK_LIB\(\[?([^,\]]*)\]?,.*') |
168 | libx_re = re.compile('AX_CHECK_LIBRARY\(\[?[^,\]]*\]?, *\[?([^,\]]*)\]?, *\[?([a-zA-Z0-9-]*)\]?,.*') | ||
166 | progs_re = re.compile('_PROGS?\(\[?[a-zA-Z0-9_]*\]?, \[?([^,\]]*)\]?[),].*') | 169 | progs_re = re.compile('_PROGS?\(\[?[a-zA-Z0-9_]*\]?, \[?([^,\]]*)\]?[),].*') |
167 | dep_re = re.compile('([^ ><=]+)( [<>=]+ [^ ><=]+)?') | 170 | dep_re = re.compile('([^ ><=]+)( [<>=]+ [^ ><=]+)?') |
168 | ac_init_re = re.compile('AC_INIT\(([^,]+), *([^,]+)[,)].*') | 171 | ac_init_re = re.compile('AC_INIT\(([^,]+), *([^,]+)[,)].*') |
@@ -189,6 +192,7 @@ class AutotoolsRecipeHandler(RecipeHandler): | |||
189 | 192 | ||
190 | # Now turn it into a library->recipe mapping | 193 | # Now turn it into a library->recipe mapping |
191 | recipelibmap = {} | 194 | recipelibmap = {} |
195 | recipeheadermap = {} | ||
192 | pkgdata_dir = tinfoil.config_data.getVar('PKGDATA_DIR', True) | 196 | pkgdata_dir = tinfoil.config_data.getVar('PKGDATA_DIR', True) |
193 | for libname, pkg in pkglibmap.iteritems(): | 197 | for libname, pkg in pkglibmap.iteritems(): |
194 | try: | 198 | try: |
@@ -203,6 +207,27 @@ class AutotoolsRecipeHandler(RecipeHandler): | |||
203 | else: | 207 | else: |
204 | raise | 208 | raise |
205 | 209 | ||
210 | def load_headermap(): | ||
211 | if recipeheadermap: | ||
212 | return | ||
213 | includedir = tinfoil.config_data.getVar('includedir', True) | ||
214 | for pkg in glob.glob(os.path.join(pkgdata_dir, 'runtime', '*-dev')): | ||
215 | with open(os.path.join(pkgdata_dir, 'runtime', pkg)) as f: | ||
216 | pn = None | ||
217 | headers = [] | ||
218 | for line in f: | ||
219 | if line.startswith('PN:'): | ||
220 | pn = line.split(':', 1)[-1].strip() | ||
221 | elif line.startswith('FILES_INFO:'): | ||
222 | val = line.split(':', 1)[1].strip() | ||
223 | dictval = json.loads(val) | ||
224 | for fullpth in sorted(dictval): | ||
225 | if fullpth.startswith(includedir) and fullpth.endswith('.h'): | ||
226 | headers.append(os.path.relpath(fullpth, includedir)) | ||
227 | if pn and headers: | ||
228 | for header in headers: | ||
229 | recipeheadermap[header] = pn | ||
230 | |||
206 | defines = {} | 231 | defines = {} |
207 | def subst_defines(value): | 232 | def subst_defines(value): |
208 | newvalue = value | 233 | newvalue = value |
@@ -263,7 +288,7 @@ class AutotoolsRecipeHandler(RecipeHandler): | |||
263 | deps.append('intltool-native') | 288 | deps.append('intltool-native') |
264 | elif keyword == 'AM_PATH_GLIB_2_0': | 289 | elif keyword == 'AM_PATH_GLIB_2_0': |
265 | deps.append('glib-2.0') | 290 | deps.append('glib-2.0') |
266 | elif keyword == 'AC_CHECK_PROG' or keyword == 'AC_PATH_PROG': | 291 | elif keyword in ('AC_CHECK_PROG', 'AC_PATH_PROG', 'AX_WITH_PROG'): |
267 | res = progs_re.search(value) | 292 | res = progs_re.search(value) |
268 | if res: | 293 | if res: |
269 | for prog in shlex.split(res.group(1)): | 294 | for prog in shlex.split(res.group(1)): |
@@ -292,6 +317,26 @@ class AutotoolsRecipeHandler(RecipeHandler): | |||
292 | if libdep is None: | 317 | if libdep is None: |
293 | if not lib.startswith('$'): | 318 | if not lib.startswith('$'): |
294 | unmappedlibs.append(lib) | 319 | unmappedlibs.append(lib) |
320 | elif keyword == 'AX_CHECK_LIBRARY': | ||
321 | res = libx_re.search(value) | ||
322 | if res: | ||
323 | lib = res.group(2) | ||
324 | if lib in ignorelibs: | ||
325 | logger.debug('Ignoring library dependency %s' % lib) | ||
326 | else: | ||
327 | libdep = recipelibmap.get(lib, None) | ||
328 | if libdep: | ||
329 | deps.append(libdep) | ||
330 | else: | ||
331 | if libdep is None: | ||
332 | if not lib.startswith('$'): | ||
333 | header = res.group(1) | ||
334 | load_headermap() | ||
335 | libdep = recipeheadermap.get(header, None) | ||
336 | if libdep: | ||
337 | deps.append(libdep) | ||
338 | else: | ||
339 | unmappedlibs.append(lib) | ||
295 | elif keyword == 'AC_PATH_X': | 340 | elif keyword == 'AC_PATH_X': |
296 | deps.append('libx11') | 341 | deps.append('libx11') |
297 | elif keyword in ('AX_BOOST', 'BOOST_REQUIRE'): | 342 | elif keyword in ('AX_BOOST', 'BOOST_REQUIRE'): |
@@ -300,6 +345,36 @@ class AutotoolsRecipeHandler(RecipeHandler): | |||
300 | deps.append('flex-native') | 345 | deps.append('flex-native') |
301 | elif keyword in ('AC_PROG_YACC', 'AX_PROG_BISON'): | 346 | elif keyword in ('AC_PROG_YACC', 'AX_PROG_BISON'): |
302 | deps.append('bison-native') | 347 | deps.append('bison-native') |
348 | elif keyword == 'AX_CHECK_ZLIB': | ||
349 | deps.append('zlib') | ||
350 | elif keyword in ('AX_CHECK_OPENSSL', 'AX_LIB_CRYPTO'): | ||
351 | deps.append('openssl') | ||
352 | elif keyword == 'AX_LIB_CURL': | ||
353 | deps.append('curl') | ||
354 | elif keyword == 'AX_LIB_BEECRYPT': | ||
355 | deps.append('beecrypt') | ||
356 | elif keyword == 'AX_LIB_EXPAT': | ||
357 | deps.append('expat') | ||
358 | elif keyword == 'AX_LIB_GCRYPT': | ||
359 | deps.append('libgcrypt') | ||
360 | elif keyword == 'AX_LIB_NETTLE': | ||
361 | deps.append('nettle') | ||
362 | elif keyword == 'AX_LIB_READLINE': | ||
363 | deps.append('readline') | ||
364 | elif keyword == 'AX_LIB_SQLITE3': | ||
365 | deps.append('sqlite3') | ||
366 | elif keyword == 'AX_LIB_TAGLIB': | ||
367 | deps.append('taglib') | ||
368 | elif keyword == 'AX_PKG_SWIG': | ||
369 | deps.append('swig') | ||
370 | elif keyword == 'AX_PROG_XSLTPROC': | ||
371 | deps.append('libxslt-native') | ||
372 | elif keyword == 'AX_WITH_CURSES': | ||
373 | deps.append('ncurses') | ||
374 | elif keyword == 'AX_PATH_BDB': | ||
375 | deps.append('db') | ||
376 | elif keyword == 'AX_PATH_LIB_PCRE': | ||
377 | deps.append('libpcre') | ||
303 | elif keyword == 'AC_INIT': | 378 | elif keyword == 'AC_INIT': |
304 | if extravalues is not None: | 379 | if extravalues is not None: |
305 | res = ac_init_re.match(value) | 380 | res = ac_init_re.match(value) |
@@ -336,7 +411,9 @@ class AutotoolsRecipeHandler(RecipeHandler): | |||
336 | 'AM_PATH_GLIB_2_0', | 411 | 'AM_PATH_GLIB_2_0', |
337 | 'AC_CHECK_PROG', | 412 | 'AC_CHECK_PROG', |
338 | 'AC_PATH_PROG', | 413 | 'AC_PATH_PROG', |
414 | 'AX_WITH_PROG', | ||
339 | 'AC_CHECK_LIB', | 415 | 'AC_CHECK_LIB', |
416 | 'AX_CHECK_LIBRARY', | ||
340 | 'AC_PATH_X', | 417 | 'AC_PATH_X', |
341 | 'AX_BOOST', | 418 | 'AX_BOOST', |
342 | 'BOOST_REQUIRE', | 419 | 'BOOST_REQUIRE', |
@@ -345,6 +422,22 @@ class AutotoolsRecipeHandler(RecipeHandler): | |||
345 | 'AX_PROG_FLEX', | 422 | 'AX_PROG_FLEX', |
346 | 'AC_PROG_YACC', | 423 | 'AC_PROG_YACC', |
347 | 'AX_PROG_BISON', | 424 | 'AX_PROG_BISON', |
425 | 'AX_CHECK_ZLIB', | ||
426 | 'AX_CHECK_OPENSSL', | ||
427 | 'AX_LIB_CRYPTO', | ||
428 | 'AX_LIB_CURL', | ||
429 | 'AX_LIB_BEECRYPT', | ||
430 | 'AX_LIB_EXPAT', | ||
431 | 'AX_LIB_GCRYPT', | ||
432 | 'AX_LIB_NETTLE', | ||
433 | 'AX_LIB_READLINE' | ||
434 | 'AX_LIB_SQLITE3', | ||
435 | 'AX_LIB_TAGLIB', | ||
436 | 'AX_PKG_SWIG', | ||
437 | 'AX_PROG_XSLTPROC', | ||
438 | 'AX_WITH_CURSES', | ||
439 | 'AX_PATH_BDB', | ||
440 | 'AX_PATH_LIB_PCRE', | ||
348 | 'AC_INIT', | 441 | 'AC_INIT', |
349 | 'AM_INIT_AUTOMAKE', | 442 | 'AM_INIT_AUTOMAKE', |
350 | 'define(', | 443 | 'define(', |