Skip to content
Snippets Groups Projects
Commit 8da69b02 authored by Andrea Shepard's avatar Andrea Shepard
Browse files

Build shared LLVM things correctly with library dependencies

parent ccc6d682
No related branches found
No related tags found
No related merge requests found
...@@ -80,6 +80,52 @@ ctests = ['t_benchmark.c', ...@@ -80,6 +80,52 @@ ctests = ['t_benchmark.c',
't_misc.c', 't_misc.c',
't_regression.c'] 't_regression.c']
# some llvm versions are old and will not work; some require --system-libs
# with llvm-config, and some will break if given it
llvm_config_version = subprocess.Popen('%s --version' % env["LLVM_CONFIG"], \
shell=True, \
stdin=subprocess.PIPE, stdout=subprocess.PIPE).communicate()
if LooseVersion(llvm_config_version[0]) < LooseVersion("3.6"):
print "This LLVM version %s is too old" % llvm_config_version
Exit(1)
if LooseVersion(llvm_config_version[0]) < LooseVersion("3.9") and \
LooseVersion(llvm_config_version[0]) >= LooseVersion("3.5"):
llvm_system_libs_flag = "--system-libs"
else:
llvm_system_libs_flag = ""
# Only keep one copy of this
required_llvm_components = "core executionengine mcjit analysis x86codegen x86info"
# Stubbing this out so we can implement static-only mode if needed later
use_shared_llvm = True
# Can we ask for shared/static from llvm-config?
if LooseVersion(llvm_config_version[0]) < LooseVersion("3.9"):
# Nope
llvm_linkage_type_flag = ""
llvm_use_computed_shared_lib_name = True
else:
# Woo, they finally fixed the dumb
llvm_use_computed_shared_lib_name = False
if use_shared_llvm:
llvm_linkage_type_flag = "--link-shared"
else:
llvm_linkage_type_flag = "--link-static"
if llvm_use_computed_shared_lib_name:
# Okay, pull out the major and minor version numbers (barf barf)
p = re.compile("^(\d+)\.(\d+).*$")
m = p.match(llvm_config_version[0])
if m:
llvm_computed_shared_lib_name = "LLVM-%d.%d" % ((int)(m.group(1)), (int)(m.group(2)))
else:
print "Couldn't compute shared library name from LLVM version '%s', but needed to" % \
llvm_config_version[0]
Exit(1)
else:
# We won't be needing it
llvm_computed_shared_lib_name = None
# llvm-config 'helpfully' supplies -g and -O flags; educate it with this # llvm-config 'helpfully' supplies -g and -O flags; educate it with this
# custom ParseConfig function arg # custom ParseConfig function arg
...@@ -94,8 +140,30 @@ def llvm_config_sanitize(env, cmd, unique=1): ...@@ -94,8 +140,30 @@ def llvm_config_sanitize(env, cmd, unique=1):
env.MergeFlags(filtered_cmd, unique) env.MergeFlags(filtered_cmd, unique)
env.ParseConfig('%s --cflags --ldflags' % env["LLVM_CONFIG"], function=llvm_config_sanitize) env.ParseConfig('%s --cflags --ldflags' % env["LLVM_CONFIG"], function=llvm_config_sanitize)
libhammer_shared = env.SharedLibrary('hammer', parsers + backends + misc_hammer_parts)
libhammer_static = env.StaticLibrary('hammer', parsers + backends + misc_hammer_parts) libhammer_static = env.StaticLibrary('hammer', parsers + backends + misc_hammer_parts)
# Use a cloned env for the shared library so we can have library dependencies
shared_env = env.Clone()
# Get LLVM stuff into LIBS/LDFLAGS
shared_env.ParseConfig('%s --ldflags %s %s %s' % \
(env["LLVM_CONFIG"], llvm_system_libs_flag, llvm_linkage_type_flag, required_llvm_components), \
function=llvm_config_sanitize)
# Get the right -l lines in
if use_shared_llvm:
if llvm_use_computed_shared_lib_name:
shared_env.Append(LIBS=[llvm_computed_shared_lib_name, ])
else:
shared_env.ParseConfig('%s %s --libs %s' % \
(env["LLVM_CONFIG"], llvm_linkage_type_flag, required_llvm_components), \
function=llvm_config_sanitize)
else:
# Just grab the statics regardless of version
shared_env.ParseConfig('%s %s --libs %s' % \
(env["LLVM_CONFIG"], llvm_linkage_type_flag, required_llvm_components), \
function=llvm_config_sanitize)
shared_env.Append(LIBS=['stdc++', ], LIBPATH=['.'])
libhammer_shared = shared_env.SharedLibrary('hammer', parsers + backends + misc_hammer_parts)
Default(libhammer_shared, libhammer_static) Default(libhammer_shared, libhammer_static)
env.Install("$libpath", [libhammer_static, libhammer_shared]) env.Install("$libpath", [libhammer_static, libhammer_shared])
...@@ -107,22 +175,23 @@ env.Install("$pkgconfigpath", "../../../libhammer.pc") ...@@ -107,22 +175,23 @@ env.Install("$pkgconfigpath", "../../../libhammer.pc")
testenv = env.Clone() testenv = env.Clone()
testenv.Append(LIBS=['hammer'], LIBPATH=['.']) testenv.Append(LIBS=['hammer'], LIBPATH=['.'])
testenv.ParseConfig('pkg-config --cflags --libs glib-2.0') testenv.ParseConfig('pkg-config --cflags --libs glib-2.0')
testenv_llvm_config_version = subprocess.Popen('%s --version' % env["LLVM_CONFIG"], \ # Get LLVM stuff into LIBS/LDFLAGS
shell=True, \ testenv.ParseConfig('%s --ldflags %s %s %s' % \
stdin=subprocess.PIPE, stdout=subprocess.PIPE).communicate() (env["LLVM_CONFIG"], llvm_system_libs_flag, llvm_linkage_type_flag, required_llvm_components), \
function=llvm_config_sanitize)
if LooseVersion(testenv_llvm_config_version[0]) < LooseVersion("3.6"): # Get the right -l lines in
print "This LLVM version %s is too old" % testenv_llvm_config_version if use_shared_llvm:
Exit(1) if llvm_use_computed_shared_lib_name:
testenv.Append(LIBS=[llvm_computed_shared_lib_name, ])
if LooseVersion(testenv_llvm_config_version[0]) < LooseVersion("3.9") and \ else:
LooseVersion(testenv_llvm_config_version[0]) >= LooseVersion("3.5"): testenv.ParseConfig('%s %s --libs %s' % \
testenv_llvm_system_libs_flag = "--system-libs" (env["LLVM_CONFIG"], llvm_linkage_type_flag, required_llvm_components), \
function=llvm_config_sanitize)
else: else:
testenv_llvm_system_libs_flag = "" # Just grab the statics regardless of version
testenv.ParseConfig('%s %s --libs %s' % \
testenv.ParseConfig('%s --cflags --ldflags --libs %s core executionengine mcjit analysis x86codegen x86info' % \ (env["LLVM_CONFIG"], llvm_linkage_type_flag, required_llvm_components), \
(env["LLVM_CONFIG"], testenv_llvm_system_libs_flag), function=llvm_config_sanitize) function=llvm_config_sanitize)
testenv.Append(LIBS=['stdc++'], LIBPATH=['.']) testenv.Append(LIBS=['stdc++'], LIBPATH=['.'])
ctestexec = testenv.Program('test_suite', ctests + ['test_suite.c'], LINKFLAGS="--coverage" if testenv.GetOption("coverage") else None) ctestexec = testenv.Program('test_suite', ctests + ['test_suite.c'], LINKFLAGS="--coverage" if testenv.GetOption("coverage") else None)
ctest = Alias('testc', [ctestexec], "".join(["env LD_LIBRARY_PATH=", os.path.dirname(ctestexec[0].path), " ", ctestexec[0].path])) ctest = Alias('testc', [ctestexec], "".join(["env LD_LIBRARY_PATH=", os.path.dirname(ctestexec[0].path), " ", ctestexec[0].path]))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment