blob: 46399a58a7a965b9a83d1b8d4c7ed631901956f7 [file] [log] [blame]
#!/usr/bin/env python3
'''
[usage] python parse_cargo_package.py <cargo_toml_path> <teaclave_root>
This script parses Cargo.toml to print three lists for CMake
"<pkg_name_list>\n<pkg_path_list>\n<pkg_category_list>"
The items in each list are separated by ":"
In Cargo.toml, lines ending with "# ignore" will be omitted
e.g.
members = [
"examples/neural_net",
"teaclave_sdk", # ignore
]
'''
import os
import re
import sys
def parse_members_for_workspace(toml_path):
"""Parse members from Cargo.toml of the worksapce"""
with open(toml_path, mode='rb') as f:
data = f.read()
manifest = data.decode('utf8')
regex = re.compile(r"^members\s*=\s*\[(.*?)\]", re.S | re.M)
members_block = regex.findall(manifest)[0]
out = []
members = members_block.split('\n')
regex2 = re.compile(r'\s*"(.*?)".*')
for mem in members:
if (len(mem.strip()) == 0) or re.match(r".*#\signore", mem):
continue
out.append(regex2.findall(mem)[0])
return out
def parse_package_name(package_toml_path):
"""Parse package name from Cargo.toml"""
with open(package_toml_path, mode='rb') as f:
data = f.read()
manifest = data.decode('utf8')
regex = re.compile(r'^name\s*=\s*"(.*?)"', re.M)
return regex.findall(manifest)[0]
def pkg_path_2_category(pkg_path):
"""
Take pkg path and return its category.
Return services/examples/tests/cli/dcap depends on the beginning of pkg_path.
(lib not used by this function)
"""
if pkg_path.startswith('services/'):
return 'services'
elif pkg_path.startswith('examples/'):
return 'examples'
elif pkg_path.startswith('tests/'):
return 'tests'
elif pkg_path == 'cli':
return 'cli'
elif pkg_path == 'dcap':
return 'dcap'
else:
sys.stderr.write(
'[Error]: Unknown category for package_path {}\n'.format(pkg_path))
sys.exit(-1)
DEFAULT_EDL_LIB = "Enclave_common_t"
PKG_NAME_TO_EDL_LIB = {
"teaclave_unit_tests_enclave": "Enclave_fa_t",
"teaclave_execution_service_enclave": "Enclave_fa_t",
}
def pkg_name_2_edl_lib_name(pkg_name):
"""
Take pkg_name and return its configured edl libary name, default is DEFAULT_EDL_LIB.
"""
return PKG_NAME_TO_EDL_LIB.get(pkg_name, DEFAULT_EDL_LIB)
def main():
"""parses Cargo.toml to generate a list of package to be built"""
if len(sys.argv) < 3:
err = "[usage] python {} cargo_toml_path teaclave_root".format(
sys.argv[0])
raise ValueError(err)
toml_path = sys.argv[1]
teaclave_root = sys.argv[2]
pkg_names = []
pkg_paths = []
pkg_categories = []
edl_lib_names = []
members = parse_members_for_workspace(toml_path)
for pkg_path in members:
pkg_toml_path = os.path.join(teaclave_root, pkg_path, "Cargo.toml")
pkg_name = parse_package_name(pkg_toml_path)
pkg_names.append(pkg_name)
pkg_paths.append(pkg_path)
pkg_categories.append(pkg_path_2_category(pkg_path))
edl_lib_names.append(pkg_name_2_edl_lib_name(pkg_name))
out = [
":".join(pkg_names), ":".join(pkg_paths), ":".join(pkg_categories),
":".join(edl_lib_names)
]
sys.stdout.write("\n".join(out))
if __name__ == "__main__":
main()