Author: rinrab Date: Mon Jun 9 13:41:13 2025 New Revision: 1926286 URL: http://svn.apache.org/viewvc?rev=1926286&view=rev Log: cmake: Generate def files in build time using an external script extractor.cmake script (similarly to extractor.py).
* build/cmake/extractor.cmake: New file, with symbol scrapper code. * CMakeLists.txt (def generator): Generate def files using custom commands and the extractor.cmake script. Added: subversion/trunk/build/cmake/extractor.cmake Modified: subversion/trunk/CMakeLists.txt Modified: subversion/trunk/CMakeLists.txt URL: http://svn.apache.org/viewvc/subversion/trunk/CMakeLists.txt?rev=1926286&r1=1926285&r2=1926286&view=diff ============================================================================== --- subversion/trunk/CMakeLists.txt (original) +++ subversion/trunk/CMakeLists.txt Mon Jun 9 13:41:13 2025 @@ -516,52 +516,22 @@ function(target_exports target_name) ) set(def_file_path ${CMAKE_BINARY_DIR}/${target_name}.def) + set(headers) - # 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 ${ARGN}) - 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() + list(APPEND headers "${CMAKE_CURRENT_SOURCE_DIR}/${file}") endforeach() - list(SORT defs) - list(REMOVE_DUPLICATES defs) - - set(def_file_content "EXPORTS\n") - foreach(def ${defs}) - list(FIND filter_names "${def}" skip) - if(skip LESS 0) - string(APPEND def_file_content "${def}\n") - endif() - endforeach() - - if(EXISTS "${def_file_path}") - file(READ "${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 "${def_file_path}" ${def_file_content}) - endif() + add_custom_command( + OUTPUT "${def_file_path}" + DEPENDS ${headers} + COMMAND ${CMAKE_COMMAND} + "-DEXPORT_HEADER_FILE_PATHS=${headers}" + "-DEXPORT_DEF_FILE_PATH=${def_file_path}" + "-DEXPORT_BLACKLIST=${filter_names}" + -P "${CMAKE_CURRENT_SOURCE_DIR}/build/cmake/extractor.cmake" + WORKING_DIRECTORY "${SERF_SOURCE_DIR}" + ) target_sources("${target_name}" PRIVATE "${def_file_path}") endif() Added: subversion/trunk/build/cmake/extractor.cmake URL: http://svn.apache.org/viewvc/subversion/trunk/build/cmake/extractor.cmake?rev=1926286&view=auto ============================================================================== --- subversion/trunk/build/cmake/extractor.cmake (added) +++ subversion/trunk/build/cmake/extractor.cmake Mon Jun 9 13:41:13 2025 @@ -0,0 +1,74 @@ +# +# 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()