tomato/cmake/StrictAbi.cmake

77 lines
2.3 KiB
CMake
Raw Normal View History

################################################################################
#
# :: Strict ABI
#
# Enabling the STRICT_ABI flag will generate and use an LD version script.
# It ensures that the dynamic libraries (libtoxcore.so, libtoxav.so) only
# export the symbols that are defined in their public API (tox.h and toxav.h,
# respectively).
#
################################################################################
find_program(SHELL NAMES sh dash bash zsh fish)
macro(make_version_script)
if(STRICT_ABI AND SHELL AND ENABLE_SHARED)
_make_version_script(${ARGN})
endif()
endmacro()
function(_make_version_script target)
set(${target}_VERSION_SCRIPT "${CMAKE_BINARY_DIR}/${target}.ld")
file(WRITE ${${target}_VERSION_SCRIPT}
"{ global:\n")
foreach(sublib ${ARGN})
string(REPLACE "^" ";" sublib ${sublib})
list(GET sublib 0 header)
list(GET sublib 1 ns)
execute_process(
COMMAND ${SHELL} -c "egrep '^\\w' ${header} | grep '${ns}_[a-z0-9_]*(' | grep -v '^typedef' | grep -o '${ns}_[a-z0-9_]*(' | egrep -o '\\w+' | sort -u"
OUTPUT_VARIABLE sublib_SYMS
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REPLACE "\n" ";" sublib_SYMS ${sublib_SYMS})
foreach(sym ${sublib_SYMS})
file(APPEND ${${target}_VERSION_SCRIPT}
"${sym};\n")
endforeach(sym)
endforeach(sublib)
file(APPEND ${${target}_VERSION_SCRIPT}
"local: *; };\n")
set_target_properties(${target}_shared PROPERTIES
LINK_FLAGS -Wl,--version-script,${${target}_VERSION_SCRIPT})
endfunction()
option(STRICT_ABI "Enforce strict ABI export in dynamic libraries" OFF)
if(WIN32 OR APPLE)
# Windows and OSX don't have this linker functionality.
set(STRICT_ABI OFF)
endif()
if(STRICT_ABI AND NOT ENABLE_STATIC)
if(AUTOTEST)
message("AUTOTEST option is incompatible with STRICT_ABI. Disabling AUTOTEST.")
endif()
set(AUTOTEST OFF)
if(BUILD_MISC_TESTS)
message("BUILD_MISC_TESTS option is incompatible with STRICT_ABI. Disabling BUILD_MISC_TESTS.")
endif()
set(BUILD_MISC_TESTS OFF)
if(BOOTSTRAP_DAEMON)
message("BOOTSTRAP_DAEMON option is incompatible with STRICT_ABI. Disabling BOOTSTRAP_DAEMON.")
endif()
set(BOOTSTRAP_DAEMON OFF)
if(DHT_BOOTSTRAP)
message("DHT_BOOTSTRAP option is incompatible with STRICT_ABI. Disabling DHT_BOOTSTRAP.")
endif()
set(DHT_BOOTSTRAP OFF)
endif()