blob: b27799e65a20a498743e2920d2449596ef755b6e [file] [log] [blame]
#!/usr/bin/env fuchsia-vendored-python
"""Creates a Python library for a C extension."""
# Copyright 2023 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import argparse
import os
import sys
def main():
"""Creates library wrapper"""
parser = argparse.ArgumentParser(
'Creates a Python library wrapper for a C extension.')
parser.add_argument(
'--target_name',
help='Name of the build target',
required=True,
)
parser.add_argument(
'--shlib_source',
help='Path to the shared library',
required=True,
)
parser.add_argument(
'--gen_dir',
help='Path to gen directory, used to stage temp directories',
required=True,
)
parser.add_argument('--output', help='Path to output', required=True)
parser.add_argument(
'--depfile',
help='Path to the depfile to generate',
type=argparse.FileType('w'),
required=True,
)
args = parser.parse_args()
app_dir = os.path.join(args.gen_dir, args.target_name)
os.makedirs(app_dir, exist_ok=True)
main_file = os.path.join(app_dir, "__init__.py")
shlib_source_dir = os.path.dirname(args.shlib_source)
if not shlib_source_dir:
shlib_source_dir = os.path.join('.')
shlib_source = os.path.basename(args.shlib_source)
# Making this a list in the event that there are more deps.
deps = ' '.join([f'{args.shlib_source}.so'])
args.depfile.write(f'{args.output}: {deps}\n')
with open(main_file, 'w', encoding='utf-8') as main_file_out:
main_file_out.write(
f'''
import importlib.util
import importlib.machinery
def _init():
finder = importlib.machinery.PathFinder()
spec = finder.find_spec('{shlib_source}', path=['{shlib_source_dir}'])
if spec is None:
raise Exception('Couldn\\'t load library "{shlib_source}" from {shlib_source_dir}')
mod = importlib.util.module_from_spec(spec)
spec.loader.exec_module(mod)
return mod
__all__ = _init().__dict__
''')
return 0
if __name__ == '__main__':
sys.exit(main())