diff options
| author | Guido van Rossum <guido@python.org> | 1998-08-10 13:12:22 +0000 | 
|---|---|---|
| committer | Guido van Rossum <guido@python.org> | 1998-08-10 13:12:22 +0000 | 
| commit | e7f3953142e6b565fd48208db61092604e650b31 (patch) | |
| tree | c5acc6a3a603fe345ef41639aa15f579baa33ad4 /Tools/scripts | |
| parent | a9ca42daf0fdf58fbf809a89957dfa7abf2557cc (diff) | |
| download | cpython-git-e7f3953142e6b565fd48208db61092604e650b31.tar.gz | |
A script by Mark-Andre Lemburg to produce the PC/python_nt.def file
automatically.
Diffstat (limited to 'Tools/scripts')
| -rwxr-xr-x | Tools/scripts/nm2def.py | 102 | 
1 files changed, 102 insertions, 0 deletions
diff --git a/Tools/scripts/nm2def.py b/Tools/scripts/nm2def.py new file mode 100755 index 0000000000..120c106224 --- /dev/null +++ b/Tools/scripts/nm2def.py @@ -0,0 +1,102 @@ +"""nm2def.py + +Helpers to extract symbols from Unix libs and auto-generate +Windows definition files from them. Depends on nm(1). Tested +on Linux and Solaris only (-p option to nm is for Solaris only). + +By Marc-Andre Lemburg, Aug 1998. + +Additional notes: the output of nm is supposed to look like this: + +acceler.o: +000001fd T PyGrammar_AddAccelerators +         U PyGrammar_FindDFA +00000237 T PyGrammar_RemoveAccelerators +         U _IO_stderr_ +         U exit +         U fprintf +         U free +         U malloc +         U printf + +grammar1.o: +00000000 T PyGrammar_FindDFA +00000034 T PyGrammar_LabelRepr +         U _PyParser_TokenNames +         U abort +         U printf +         U sprintf + +... + +Even if this isn't the default output of your nm, there is generally an +option to produce this format (since it is the original v7 Unix format). + +""" +import os,re,string,sys + +PYTHONLIB = 'libpython'+sys.version[:3]+'.a' +PC_PYTHONLIB = 'Python'+sys.version[0]+sys.version[2]+'.dll' +NM = 'nm -p -g %s'                      # For Linux, use "nm -g %s" + +def symbols(lib=PYTHONLIB,types=('T','C','D')): + +    lines = os.popen(NM % lib).readlines() +    lines = map(string.strip,lines) +    symbols = {} +    for line in lines: +	if len(line) == 0 or ':' in line: +	    continue +	items = string.split(line) +	if len(items) != 3: +	    continue +	address, type, name = items +	if type not in types: +	    continue +	symbols[name] = address,type +    return symbols + +def export_list(symbols): + +    data = [] +    code = [] +    for name,(addr,type) in symbols.items(): +	if type in ('C','D'): +	    data.append('\t'+name) +	else: +	    code.append('\t'+name) +    data.sort() +    data.append('') +    code.sort() +    return string.join(data,' DATA\n')+'\n'+string.join(code,'\n') + +# Definition file template +DEF_TEMPLATE = """\ +EXPORTS +%s +""" + +# Special symbols that have to be included even though they don't +# pass the filter +SPECIALS = ( +    ) + +def filter_Python(symbols,specials=SPECIALS): + +    for name in symbols.keys(): +	if name[:2] == 'Py' or name[:3] == '_Py': +	    pass +	elif name not in specials: +	    del symbols[name] + +def main(): + +    s = symbols(PYTHONLIB) +    filter_Python(s) +    exports = export_list(s) +    f = sys.stdout # open('PC/python_nt.def','w') +    f.write(DEF_TEMPLATE % (exports)) +    f.close() +     +if __name__ == '__main__': +    main()  | 
