| # | |
| # 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=<path_to_def_file> | |
| # [-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() |