Arquivos
mpich/maint/gen_binding_c.py
Hui Zhou 716b64a081 doc: generate alias doc for large-count APIs (2nd try)
Last commit ae7bba3 didn't create html pages for large count routines.
That commit was a bit hackish by assuming the content pattern of the man
page, and we can't reuse the same hack for html aliases since html docs
are independent from man pages in principle.

This commit revise the mechanism by generating a poly_aliases list file
during binding/mansrc generation, thus a more robust mechanism.
2024-08-30 15:08:11 -05:00

165 linhas
5.1 KiB
Python

##
## Copyright (C) by Argonne National Laboratory
## See COPYRIGHT in top-level directory
##
from local_python import MPI_API_Global as G
from local_python.mpi_api import *
from local_python.binding_c import *
from local_python import RE
from local_python.info_hints import collect_info_hint_blocks
import glob
def main():
# currently support: -single-source
G.parse_cmdline()
binding_dir = G.get_srcdir_path("src/binding")
c_dir = "src/binding/c"
abi_dir = "src/binding/abi"
func_list = load_C_func_list(binding_dir)
# -- Loading extra api prototypes (needed until other `buildiface` scripts are updated)
G.mpi_declares = []
# -- functions that are not generated yet
extras = []
extras.append("MPI_DUP_FN")
# now generate the prototypes
for a in extras:
func = G.FUNCS[a.lower()]
mapping = G.MAPS['SMALL_C_KIND_MAP']
G.mpi_declares.append(get_declare_function(func, False, "proto"))
if 'output-mansrc' in G.opts:
G.check_write_path(c_dir + '/mansrc/')
G.hints = collect_info_hint_blocks("src")
else:
G.hints = None
# -- prescan the functions and set internal attributes
for func in func_list:
# Note: set func['_has_poly'] = False to skip embiggenning
func['_has_poly'] = function_has_POLY_parameters(func)
if 'replace' in func and 'body' not in func:
m = re.search(r'with\s+(MPI_\w+)', func['replace'])
repl_func = G.FUNCS[m.group(1).lower()]
if '_replaces' not in repl_func:
repl_func['_replaces'] = []
repl_func['_replaces'].append(func)
# -- Generating code --
G.out = []
G.out.append("#include \"mpiimpl.h\"")
G.out.append("")
G.doc3_src_txt = []
G.poly_aliases = [] # large-count mansrc aliases
G.need_dump_romio_reference = True
# internal function to dump G.out into filepath
def dump_out(file_path):
G.check_write_path(file_path)
dump_c_file(file_path, G.out)
# add to mpi_sources for dump_Makefile_mk()
G.mpi_sources.append(file_path)
G.out = []
G.out.append("#include \"mpiimpl.h\"")
G.out.append("")
G.need_dump_romio_reference = True
def dump_func(func, manpage_out):
# dumps the code to G.out array
dump_mpi_c(func, False)
if func['_has_poly']:
dump_mpi_c(func, True)
dump_manpage(func, manpage_out)
if 'output-mansrc' in G.opts:
f = get_mansrc_file_path(func, c_dir + '/mansrc')
with open(f, "w") as Out:
for l in manpage_out:
print(l.rstrip(), file=Out)
G.doc3_src_txt.append(f)
if func['_has_poly']:
G.poly_aliases.append(func['name'])
def dump_func_abi(func):
func['_is_abi'] = True
G.err_codes = {}
# dumps the code to G.out array
dump_mpi_c(func, False)
if func['_has_poly']:
dump_mpi_c(func, True)
del func['_is_abi']
# ----
for func in func_list:
G.err_codes = {}
manpage_out = []
if 'replace' in func and 'body' not in func:
continue
dump_func(func, manpage_out)
if '_replaces' in func:
for t_func in func['_replaces']:
dump_func(t_func, manpage_out)
if 'single-source' not in G.opts:
# dump individual functions in separate source files
dump_out(get_func_file_path(func, c_dir))
if 'single-source' in G.opts:
# otherwise, dump all functions in binding.c
dump_out(c_dir + "/c_binding.c")
# ---- dump c_binding_abi.c
G.out = []
G.out.append("#include \"mpiimpl.h\"")
G.out.append("#include \"mpi_abi_util.h\"")
G.out.append("")
for func in func_list:
if 'replace' in func and 'body' not in func:
continue
if re.match(r'MPIX_', func['name']):
if re.match(r'MPIX_(Grequest_|Type_iov)', func['name']):
# needed by ROMIO
pass
else:
continue
dump_func_abi(func)
if '_replaces' in func:
for t_func in func['_replaces']:
dump_func_abi(t_func)
abi_file_path = abi_dir + "/c_binding_abi.c"
G.check_write_path(abi_file_path)
dump_c_file(abi_file_path, G.out)
G.out = []
if 'output-mansrc' in G.opts:
f = c_dir + '/mansrc/' + 'poly_aliases.lst'
with open(f, "w") as Out:
for name in G.poly_aliases:
print("%s - %s_c" % (name, name), file=Out)
# -- Dump other files --
G.check_write_path("src/include")
G.check_write_path("src/mpi_t")
G.check_write_path("src/include/mpi_proto.h")
dump_Makefile_mk("%s/Makefile.mk" % c_dir)
dump_mpir_impl_h("src/include/mpir_impl.h")
dump_errnames_txt("%s/errnames.txt" % c_dir)
dump_qmpi_register_h("src/mpi_t/qmpi_register.h")
dump_mpi_proto_h("src/include/mpi_proto.h")
dump_mtest_mpix_h("test/mpi/include/mtest_mpix.h")
# ---------------------------------------------------------
if __name__ == "__main__":
main()