# # 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. # # extractor.cmake -- Extracts function names from header files and writes # them to a .def file. # # cmake -DEXPORT_HEADER_FILE_PATHS=<...path_to_header_files> # -DEXPORT_DEF_FILE_PATH= # [-DEXPORT_BLACKLIST=<...symbols_to_ignore>] # -P extractor.cmake separate_arguments(EXPORT_HEADER_FILE_PATHS) separate_arguments(EXPORT_BLACKLIST) # see build/generator/extractor.py set(func_regex "(^|\n)((([A-Za-z0-9_]+|[*]) )+[*]?)?((svn|apr)_[A-Za-z0-9_]+)[ \t\r\n]*\\(") set(defs) foreach(file ${EXPORT_HEADER_FILE_PATHS}) file(READ ${file} contents) string(REGEX MATCHALL "${func_regex}" funcs ${contents}) foreach(func_string ${funcs}) string(REGEX MATCH "[A-Za-z0-9_]+[ \t\r\n]*\\($" func_name ${func_string}) string(REGEX REPLACE "[ \t\r\n]*\\($" "" func_name ${func_name}) list(APPEND defs "${func_name}") endforeach() get_filename_component(filename ${file} NAME) if(${filename} STREQUAL "svn_ctype.h") # See libsvn_subr/ctype.c for an explanation why we use CONSTANT and not # DATA, even though it causes an LNK4087 warning! list(APPEND defs "svn_ctype_table = svn_ctype_table_internal CONSTANT") elseif(${filename} STREQUAL "svn_wc_private.h") # svn_wc__internal_walk_children() is now internal to libsvn_wc # but entries-dump.c still calls it list(APPEND defs "svn_wc__internal_walk_children") endif() endforeach() list(SORT defs) list(REMOVE_DUPLICATES defs) set(def_file_content "EXPORTS\n") foreach(def ${defs}) list(FIND EXPORT_BLACKLIST "${def}" skip) if(skip LESS 0) string(APPEND def_file_content "${def}\n") endif() endforeach() if(EXISTS "${EXPORT_DEF_FILE_PATH}") file(READ "${EXPORT_DEF_FILE_PATH}" old_file_content) else() set(old_file_content "NOT_EXISTS") endif() if(NOT ${old_file_content} STREQUAL ${def_file_content}) file(WRITE "${EXPORT_DEF_FILE_PATH}" ${def_file_content}) endif()