CMake: suppress warnings building with mold on Linux

Support manipulating symbols_unix.map using symbols_unix.map.cmake
script.

Currently this removes symbols that generate noisy warnings with the
mold linker.
This commit is contained in:
Campbell Barton
2024-03-13 12:11:19 +11:00
parent bab4f7a0cd
commit 0a0551cf26
3 changed files with 61 additions and 0 deletions

View File

@@ -1078,6 +1078,13 @@ unset(_IS_LINKER_DEFAULT)
# Avoid conflicts with Mesa llvmpipe, Luxrender, and other plug-ins that may
# use the same libraries as Blender with a different version or build options.
set(PLATFORM_SYMBOLS_MAP ${CMAKE_SOURCE_DIR}/source/creator/symbols_unix.map)
# Prevent noisy warnings for symbols that MOLD doesn't define.
if(WITH_LINKER_MOLD)
set(PLATFORM_SYMBOLS_MAP_SOURCE "${PLATFORM_SYMBOLS_MAP}")
set(PLATFORM_SYMBOLS_MAP ${CMAKE_BINARY_DIR}/source/creator/symbols_unix.map.gen)
endif()
set(PLATFORM_LINKFLAGS
"${PLATFORM_LINKFLAGS} -Wl,--version-script='${PLATFORM_SYMBOLS_MAP}'"
)

View File

@@ -148,6 +148,30 @@ set(SRC
creator_intern.h
)
# When a source is defined, the map file is generated and may need to be re-generated.
if(DEFINED PLATFORM_SYMBOLS_MAP)
list(APPEND SRC "${PLATFORM_SYMBOLS_MAP}")
if(DEFINED PLATFORM_SYMBOLS_MAP_SOURCE)
add_custom_command(
COMMAND
"${CMAKE_COMMAND}"
-D "PLATFORM_SYMBOLS_MAP_SOURCE=${PLATFORM_SYMBOLS_MAP_SOURCE}"
-D "PLATFORM_SYMBOLS_MAP=${PLATFORM_SYMBOLS_MAP}"
-D "WITH_LINKER_MOLD=${WITH_LINKER_MOLD}"
-D "WITH_LINKER_GOLD=${WITH_LINKER_GOLD}"
-D "WITH_LINKER_LLD=${WITH_LINKER_LLD}"
-P "${PLATFORM_SYMBOLS_MAP_SOURCE}.cmake"
DEPENDS
"${PLATFORM_SYMBOLS_MAP_SOURCE}"
"${PLATFORM_SYMBOLS_MAP_SOURCE}.cmake"
OUTPUT
"${PLATFORM_SYMBOLS_MAP}"
)
set_source_files_properties("${PLATFORM_SYMBOLS_MAP}" PROPERTIES GENERATED TRUE)
endif()
endif()
if(CMAKE_GENERATOR MATCHES "^Visual Studio.+")
# This helps visual studio find the debugger visualizers
list(APPEND SRC ${CMAKE_SOURCE_DIR}/tools/utils_ide/natvis/Blender.natvis)

View File

@@ -0,0 +1,30 @@
# SPDX-FileCopyrightText: 2024 Blender Authors
#
# SPDX-License-Identifier: GPL-2.0-or-later
# This script generates a modified symbols map,
# use this for situations where dynamic modifications of symbols map is needed,
# or done to suppress noisy output.
if(NOT DEFINED PLATFORM_SYMBOLS_MAP_SOURCE)
message(FATAL_ERROR "PLATFORM_SYMBOLS_MAP_SOURCE was not defined!")
endif()
if(NOT DEFINED PLATFORM_SYMBOLS_MAP)
message(FATAL_ERROR "PLATFORM_SYMBOLS_MAP was not defined!")
endif()
file(READ "${PLATFORM_SYMBOLS_MAP_SOURCE}" file_data)
if(WITH_LINKER_MOLD)
# These generate noisy warnings.
set(sym_list_remove
" _bss_start\;"
" __end\;"
" aligned_free\;"
)
foreach(sym ${sym_list_remove})
string(REPLACE "${sym}" "/* ${sym} */" file_data "${file_data}")
endforeach()
endif()
file(WRITE "${PLATFORM_SYMBOLS_MAP}" "${file_data}")