summaryrefslogtreecommitdiff
path: root/cmake/StrictAbi.cmake
blob: fdf3664b09f1d3c00777e7e7886f128a64b6543e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
################################################################################
#
# :: 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).
#
################################################################################

function(make_version_script header ns lib)
  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 ${lib}_SYMS
    OUTPUT_STRIP_TRAILING_WHITESPACE)
  string(REPLACE "\n" ";" ${lib}_SYMS ${${lib}_SYMS})

  set(${lib}_VERSION_SCRIPT "${CMAKE_BINARY_DIR}/${lib}.ld")

  file(WRITE ${${lib}_VERSION_SCRIPT}
    "{ global:\n")
  foreach(sym ${${lib}_SYMS})
    file(APPEND ${${lib}_VERSION_SCRIPT}
      "${sym};\n")
  endforeach(sym)
  file(APPEND ${${lib}_VERSION_SCRIPT}
    "local: *; };\n")

  set_target_properties(${lib}_shared PROPERTIES
    LINK_FLAGS -Wl,--version-script,${${lib}_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()