#!/usr/bin/env python # # gen_def.py : Generate the .DEF file for Windows builds # # =================================================================== # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # =================================================================== # # Typically, this script is used like: # # C:\PATH> python build/gen_def.py serf.h serf_bucket_types.h serf_bucket_util.h > build/serf.def # import re import sys # This regex parses function declarations that look like: # # return_type serf_func1(... # return_type *serf_func2(... # # Where return_type is a combination of words and "*" each separated by a # SINGLE space. If the function returns a pointer type (like serf_func2), # then a space may exist between the "*" and the function name. Thus, # a more complicated example might be: # const type * const * serf_func3(... # _funcs = re.compile(r'^(?:(?:\w+|\*) )+\*?(serf_[a-z][a-zA-Z_0-9]*)\(', re.MULTILINE) # This regex parses the bucket type definitions which look like: # # extern const serf_bucket_type_t serf_bucket_type_FOO; # _types = re.compile(r'^extern const serf_bucket_type_t (serf_[a-z_]*);', re.MULTILINE) def extract_exports(fname): content = open(fname).read() exports = [ ] for name in _funcs.findall(content): exports.append(name) for name in _types.findall(content): exports.append(name) return exports # Blacklist the serf v2 API for now blacklist = ['serf_connection_switch_protocol', 'serf_http_protocol_create', 'serf_http_request_create', 'serf_https_protocol_create'] if __name__ == '__main__': # run the extraction over each file mentioned import sys print("EXPORTS") for fname in sys.argv[1:]: funclist = extract_exports(fname) funclist = set(funclist) - set(blacklist) for func in funclist: print(func)