forked from percona/galera
-
Notifications
You must be signed in to change notification settings - Fork 0
/
SConscript
50 lines (40 loc) · 1.75 KB
/
SConscript
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
39
40
41
42
43
44
45
46
47
48
49
50
SConscript(['galerautils/SConscript',
'gcache/SConscript',
'gcomm/SConscript',
'gcs/SConscript',
'galera/SConscript',
'garb/SConscript'])
Import('env', 'sysname', 'has_version_script', 'galera_script')
# Clone the environment as it will be extended for this specific library
env = env.Clone()
if has_version_script:
# Limit symbols visible from Galera DSO.
# Doing this allows to:
# - make the ABI more clean and concise
# - hide symbols from commonly used libraries (boost, asio, etc.), which
# binds calls inside the DSO to its own versions of these libraries
# See: https://akkadia.org/drepper/dsohowto.pdf (section 2.2.5)
env.Append(SHLINKFLAGS = ' -Wl,--version-script=' + galera_script)
libmmgalera_objs = env['LIBGALERA_OBJS']
libmmgalera_objs.extend(env['LIBMMGALERA_OBJS'])
if sysname == 'darwin':
galera_lib = env.SharedLibrary('galera_smm', libmmgalera_objs, SHLIBSUFFIX='.so')
else:
galera_lib = env.SharedLibrary('galera_smm', libmmgalera_objs)
if has_version_script:
env.Depends(galera_lib, galera_script)
def check_dynamic_symbols(target, source, env):
import subprocess
# Check if objdump exists
p = subprocess.Popen(['objdump', '--version'], stdout=subprocess.PIPE)
p.wait()
if p.returncode != 0:
print('objdump utility is not found. Skipping checks...')
return 0
# Check that DSO doesn't contain asio-related dynamic symbols
if env.Execute(Action(['! objdump -T ' + target[0].abspath + ' | grep asio'], None)):
return 1
return 0
if has_version_script:
env.AddPostAction(galera_lib, Action(check_dynamic_symbols,
'Checking dynamic symbols for \'$TARGET\'...'))