blob: 7c06397f86f3cbd4fca8ba0dbf4ca343ea5e9aba [file] [log] [blame]
#
# 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()