diff options
author | Tom Zanussi <tom.zanussi@intel.com> | 2013-01-18 12:27:11 -0600 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2013-01-20 13:05:39 +0000 |
commit | 7b0026ea1250b170ac70e1212d12bb86698e79e9 (patch) | |
tree | b9f3ce94d4b69e4c672809798e67dbef1d88674d | |
parent | 93d37a261b1c6cc91451b3d197c7f28a3f6123b1 (diff) | |
download | poky-7b0026ea1250b170ac70e1212d12bb86698e79e9.tar.gz |
scripts/lib/bsp/engine.py: refactor bsp-creation code
This does a bit of refactoring of the bsp-generation code to make it
generically reusable for generating non-bsp layers.
The first user remains the existing yocto-bsp tool; these changes
allow a second user, the new yocto-layer tool, to use the same code.
(From meta-yocto rev: 1527a0ee7bce08a527c9d80516531b17816dff17)
Signed-off-by: Tom Zanussi <tom.zanussi@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r-- | scripts/lib/bsp/engine.py | 141 |
1 files changed, 76 insertions, 65 deletions
diff --git a/scripts/lib/bsp/engine.py b/scripts/lib/bsp/engine.py index d406e79fe4..7431860547 100644 --- a/scripts/lib/bsp/engine.py +++ b/scripts/lib/bsp/engine.py | |||
@@ -1039,7 +1039,9 @@ def gen_program_machine_lines(machine, program_lines): | |||
1039 | Use the input values we got from the command line. | 1039 | Use the input values we got from the command line. |
1040 | """ | 1040 | """ |
1041 | line = "machine = \"" + machine + "\"" | 1041 | line = "machine = \"" + machine + "\"" |
1042 | program_lines.append(line) | ||
1042 | 1043 | ||
1044 | line = "layer_name = \"" + machine + "\"" | ||
1043 | program_lines.append(line) | 1045 | program_lines.append(line) |
1044 | 1046 | ||
1045 | 1047 | ||
@@ -1321,10 +1323,13 @@ def capture_context(context): | |||
1321 | return captured_context | 1323 | return captured_context |
1322 | 1324 | ||
1323 | 1325 | ||
1324 | def expand_targets(context, bsp_output_dir): | 1326 | def expand_targets(context, bsp_output_dir, expand_common=True): |
1325 | """ | 1327 | """ |
1326 | Expand all the tags in both the common and machine-specific | 1328 | Expand all the tags in both the common and machine-specific |
1327 | 'targets'. | 1329 | 'targets'. |
1330 | |||
1331 | If expand_common is False, don't expand the common target (this | ||
1332 | option is used to create special-purpose layers). | ||
1328 | """ | 1333 | """ |
1329 | target_files = [] | 1334 | target_files = [] |
1330 | 1335 | ||
@@ -1336,8 +1341,9 @@ def expand_targets(context, bsp_output_dir): | |||
1336 | bsp_path = lib_path + '/bsp' | 1341 | bsp_path = lib_path + '/bsp' |
1337 | arch_path = bsp_path + '/substrate/target/arch' | 1342 | arch_path = bsp_path + '/substrate/target/arch' |
1338 | 1343 | ||
1339 | common = os.path.join(arch_path, "common") | 1344 | if expand_common: |
1340 | expand_target(common, target_files, bsp_output_dir) | 1345 | common = os.path.join(arch_path, "common") |
1346 | expand_target(common, target_files, bsp_output_dir) | ||
1341 | 1347 | ||
1342 | arches = os.listdir(arch_path) | 1348 | arches = os.listdir(arch_path) |
1343 | if arch not in arches or arch == "common": | 1349 | if arch not in arches or arch == "common": |
@@ -1352,21 +1358,22 @@ def expand_targets(context, bsp_output_dir): | |||
1352 | return target_files | 1358 | return target_files |
1353 | 1359 | ||
1354 | 1360 | ||
1355 | def yocto_layer_create(layer_name, scripts_path, layer_output_dir, codedump, properties_file): | 1361 | def yocto_common_create(machine, target, scripts_path, layer_output_dir, codedump, properties_file, properties_str="", expand_common=True): |
1356 | """ | 1362 | """ |
1357 | Create yocto layer | 1363 | Common layer-creation code |
1358 | 1364 | ||
1359 | layer_name - user-defined layer name | 1365 | machine - user-defined machine name (if needed, will generate 'machine' var) |
1366 | target - the 'target' the layer will be based on, must be one in | ||
1367 | scripts/lib/bsp/substrate/target/arch | ||
1360 | scripts_path - absolute path to yocto /scripts dir | 1368 | scripts_path - absolute path to yocto /scripts dir |
1361 | bsp_output_dir - dirname to create for BSP | 1369 | layer_output_dir - dirname to create for layer |
1362 | codedump - dump generated code to bspgen.out | 1370 | codedump - dump generated code to bspgen.out |
1363 | properties_file - use values from here if nonempty i.e no prompting | 1371 | properties_file - use values from this file if nonempty i.e no prompting |
1364 | 1372 | properties_str - use values from this string if nonempty i.e no prompting | |
1365 | arch - the arch for a generic layer is 'generic-layer', defined in | 1373 | expand_common - boolean, use the contents of (for bsp layers) arch/common |
1366 | scripts/lib/bsp/substrate/target/generic-layer | ||
1367 | """ | 1374 | """ |
1368 | if os.path.exists(bsp_output_dir): | 1375 | if os.path.exists(layer_output_dir): |
1369 | print "\nBSP output dir already exists, exiting. (%s)" % bsp_output_dir | 1376 | print "\nlayer output dir already exists, exiting. (%s)" % layer_output_dir |
1370 | sys.exit(1) | 1377 | sys.exit(1) |
1371 | 1378 | ||
1372 | properties = None | 1379 | properties = None |
@@ -1380,10 +1387,10 @@ def yocto_layer_create(layer_name, scripts_path, layer_output_dir, codedump, pro | |||
1380 | 1387 | ||
1381 | properties = json.load(infile) | 1388 | properties = json.load(infile) |
1382 | 1389 | ||
1383 | os.mkdir(bsp_output_dir) | 1390 | os.mkdir(layer_output_dir) |
1384 | 1391 | ||
1385 | context = create_context(machine, arch, scripts_path) | 1392 | context = create_context(machine, target, scripts_path) |
1386 | target_files = expand_targets(context, bsp_output_dir) | 1393 | target_files = expand_targets(context, layer_output_dir, expand_common) |
1387 | 1394 | ||
1388 | input_lines = gather_inputlines(target_files) | 1395 | input_lines = gather_inputlines(target_files) |
1389 | 1396 | ||
@@ -1405,7 +1412,22 @@ def yocto_layer_create(layer_name, scripts_path, layer_output_dir, codedump, pro | |||
1405 | 1412 | ||
1406 | run_program_lines(program_lines, codedump) | 1413 | run_program_lines(program_lines, codedump) |
1407 | 1414 | ||
1408 | print "New %s BSP created in %s" % (arch, bsp_output_dir) | 1415 | |
1416 | def yocto_layer_create(layer_name, scripts_path, layer_output_dir, codedump, properties_file): | ||
1417 | """ | ||
1418 | Create yocto layer | ||
1419 | |||
1420 | layer_name - user-defined layer name | ||
1421 | scripts_path - absolute path to yocto /scripts dir | ||
1422 | layer_output_dir - dirname to create for layer | ||
1423 | codedump - dump generated code to bspgen.out | ||
1424 | properties_file - use values from this file if nonempty i.e no prompting | ||
1425 | properties - use values from this string if nonempty i.e no prompting | ||
1426 | """ | ||
1427 | yocto_common_create(layer_name, "layer", scripts_path, layer_output_dir, codedump, properties_file, False) | ||
1428 | |||
1429 | print "\nNew layer created in %s.\n" % (layer_output_dir) | ||
1430 | print "Don't forget to add it to your BBLAYERS (for details see %s\README)." % (layer_output_dir) | ||
1409 | 1431 | ||
1410 | 1432 | ||
1411 | def yocto_bsp_create(machine, arch, scripts_path, bsp_output_dir, codedump, properties_file): | 1433 | def yocto_bsp_create(machine, arch, scripts_path, bsp_output_dir, codedump, properties_file): |
@@ -1418,49 +1440,12 @@ def yocto_bsp_create(machine, arch, scripts_path, bsp_output_dir, codedump, prop | |||
1418 | scripts_path - absolute path to yocto /scripts dir | 1440 | scripts_path - absolute path to yocto /scripts dir |
1419 | bsp_output_dir - dirname to create for BSP | 1441 | bsp_output_dir - dirname to create for BSP |
1420 | codedump - dump generated code to bspgen.out | 1442 | codedump - dump generated code to bspgen.out |
1421 | properties_file - use values from here if nonempty i.e no prompting | 1443 | properties_file - use values from this file if nonempty i.e no prompting |
1444 | properties - use values from this string if nonempty i.e no prompting | ||
1422 | """ | 1445 | """ |
1423 | if os.path.exists(bsp_output_dir): | 1446 | yocto_common_create(machine, arch, scripts_path, bsp_output_dir, codedump, properties_file) |
1424 | print "\nBSP output dir already exists, exiting. (%s)" % bsp_output_dir | ||
1425 | sys.exit(1) | ||
1426 | 1447 | ||
1427 | properties = None | 1448 | print "\nNew %s BSP created in %s" % (arch, bsp_output_dir) |
1428 | |||
1429 | if properties_file: | ||
1430 | try: | ||
1431 | infile = open(properties_file, "r") | ||
1432 | except IOError: | ||
1433 | print "Couldn't open properties file %s for reading, exiting" % properties_file | ||
1434 | sys.exit(1) | ||
1435 | |||
1436 | properties = json.load(infile) | ||
1437 | |||
1438 | os.mkdir(bsp_output_dir) | ||
1439 | |||
1440 | context = create_context(machine, arch, scripts_path) | ||
1441 | target_files = expand_targets(context, bsp_output_dir) | ||
1442 | |||
1443 | input_lines = gather_inputlines(target_files) | ||
1444 | |||
1445 | program_lines = [] | ||
1446 | |||
1447 | gen_program_header_lines(program_lines) | ||
1448 | |||
1449 | gen_initial_property_vals(input_lines, program_lines) | ||
1450 | |||
1451 | if properties: | ||
1452 | gen_supplied_property_vals(properties, program_lines) | ||
1453 | |||
1454 | gen_program_machine_lines(machine, program_lines) | ||
1455 | |||
1456 | if not properties: | ||
1457 | gen_program_input_lines(input_lines, program_lines, context) | ||
1458 | |||
1459 | gen_program_lines(target_files, program_lines) | ||
1460 | |||
1461 | run_program_lines(program_lines, codedump) | ||
1462 | |||
1463 | print "New %s BSP created in %s" % (arch, bsp_output_dir) | ||
1464 | 1449 | ||
1465 | 1450 | ||
1466 | def print_dict(items, indent = 0): | 1451 | def print_dict(items, indent = 0): |
@@ -1508,15 +1493,15 @@ def get_properties(input_lines): | |||
1508 | return properties | 1493 | return properties |
1509 | 1494 | ||
1510 | 1495 | ||
1511 | def yocto_bsp_list_properties(arch, scripts_path, properties_file): | 1496 | def yocto_layer_list_properties(arch, scripts_path, properties_file, expand_common=True): |
1512 | """ | 1497 | """ |
1513 | List the complete set of properties for all the input items in the | 1498 | List the complete set of properties for all the input items in the |
1514 | BSP. If properties_file is non-null, write the complete set of | 1499 | layer. If properties_file is non-null, write the complete set of |
1515 | properties as a nested JSON object corresponding to a possibly | 1500 | properties as a nested JSON object corresponding to a possibly |
1516 | nested dictionary. | 1501 | nested dictionary. |
1517 | """ | 1502 | """ |
1518 | context = create_context("unused", arch, scripts_path) | 1503 | context = create_context("unused", arch, scripts_path) |
1519 | target_files = expand_targets(context, "unused") | 1504 | target_files = expand_targets(context, "unused", expand_common) |
1520 | 1505 | ||
1521 | input_lines = gather_inputlines(target_files) | 1506 | input_lines = gather_inputlines(target_files) |
1522 | 1507 | ||
@@ -1605,7 +1590,7 @@ def print_values(type, values_list): | |||
1605 | print "[\"%s\", \"%s\"]" % (value[0], value[1]) | 1590 | print "[\"%s\", \"%s\"]" % (value[0], value[1]) |
1606 | 1591 | ||
1607 | 1592 | ||
1608 | def yocto_bsp_list_property_values(arch, property, scripts_path, properties_file): | 1593 | def yocto_layer_list_property_values(arch, property, scripts_path, properties_file, expand_common=True): |
1609 | """ | 1594 | """ |
1610 | List the possible values for a given input property. If | 1595 | List the possible values for a given input property. If |
1611 | properties_file is non-null, write the complete set of properties | 1596 | properties_file is non-null, write the complete set of properties |
@@ -1614,7 +1599,7 @@ def yocto_bsp_list_property_values(arch, property, scripts_path, properties_file | |||
1614 | context = create_context("unused", arch, scripts_path) | 1599 | context = create_context("unused", arch, scripts_path) |
1615 | context["name"] = property | 1600 | context["name"] = property |
1616 | 1601 | ||
1617 | target_files = expand_targets(context, "unused") | 1602 | target_files = expand_targets(context, "unused", expand_common) |
1618 | 1603 | ||
1619 | input_lines = gather_inputlines(target_files) | 1604 | input_lines = gather_inputlines(target_files) |
1620 | 1605 | ||
@@ -1697,13 +1682,39 @@ def yocto_bsp_list(args, scripts_path, properties_file): | |||
1697 | 1682 | ||
1698 | if len(args) == 2: | 1683 | if len(args) == 2: |
1699 | if args[1] == "properties": | 1684 | if args[1] == "properties": |
1700 | yocto_bsp_list_properties(arch, scripts_path, properties_file) | 1685 | yocto_layer_list_properties(arch, scripts_path, properties_file) |
1701 | else: | 1686 | else: |
1702 | return False | 1687 | return False |
1703 | 1688 | ||
1704 | if len(args) == 3: | 1689 | if len(args) == 3: |
1705 | if args[1] == "property": | 1690 | if args[1] == "property": |
1706 | yocto_bsp_list_property_values(arch, args[2], scripts_path, properties_file) | 1691 | yocto_layer_list_property_values(arch, args[2], scripts_path, properties_file) |
1692 | else: | ||
1693 | return False | ||
1694 | |||
1695 | return True | ||
1696 | |||
1697 | |||
1698 | def yocto_layer_list(args, scripts_path, properties_file): | ||
1699 | """ | ||
1700 | Print the complete list of input properties defined by the layer, | ||
1701 | or the possible values for a particular layer property. | ||
1702 | """ | ||
1703 | if len(args) < 1: | ||
1704 | return False | ||
1705 | |||
1706 | if len(args) < 1 or len(args) > 2: | ||
1707 | return False | ||
1708 | |||
1709 | if len(args) == 1: | ||
1710 | if args[0] == "properties": | ||
1711 | yocto_layer_list_properties("layer", scripts_path, properties_file, False) | ||
1712 | else: | ||
1713 | return False | ||
1714 | |||
1715 | if len(args) == 2: | ||
1716 | if args[0] == "property": | ||
1717 | yocto_layer_list_property_values("layer", args[1], scripts_path, properties_file, False) | ||
1707 | else: | 1718 | else: |
1708 | return False | 1719 | return False |
1709 | 1720 | ||