1836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca"""llvm
2836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca
3836a9f0ae6e03d2f92dc024703015c25a5b3c353José FonsecaTool-specific initialization for LLVM
4836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca
5836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca"""
6836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca
7836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca#
8836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca# Copyright (c) 2009 VMware, Inc.
9836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca#
10836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca# Permission is hereby granted, free of charge, to any person obtaining
11836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca# a copy of this software and associated documentation files (the
12836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca# "Software"), to deal in the Software without restriction, including
13836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca# without limitation the rights to use, copy, modify, merge, publish,
14836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca# distribute, sublicense, and/or sell copies of the Software, and to
15836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca# permit persons to whom the Software is furnished to do so, subject to
16836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca# the following conditions:
17836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca#
18836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca# The above copyright notice and this permission notice shall be included
19836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca# in all copies or substantial portions of the Software.
20836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca#
21836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
22836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
23836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca#
29836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca
30836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonsecaimport os
31836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonsecaimport os.path
328edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonsecaimport re
33bf48447cafc8069839ad41c9c11078c794f4b307José Fonsecaimport sys
348edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonsecaimport distutils.version
35836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca
36836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonsecaimport SCons.Errors
37836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonsecaimport SCons.Util
38836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca
39836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca
40836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonsecadef generate(env):
41601498ae73e654c2de997ea75075613a694d604dJosé Fonseca    env['llvm'] = False
42601498ae73e654c2de997ea75075613a694d604dJosé Fonseca
43836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca    try:
44836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca        llvm_dir = os.environ['LLVM']
45836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca    except KeyError:
46836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca        # Do nothing -- use the system headers/libs
47bf48447cafc8069839ad41c9c11078c794f4b307José Fonseca        llvm_dir = None
48836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca    else:
49836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca        if not os.path.isdir(llvm_dir):
50836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca            raise SCons.Errors.InternalError, "Specified LLVM directory not found"
51836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca
52836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca        if env['debug']:
53836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca            llvm_subdir = 'Debug'
54836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca        else:
55836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca            llvm_subdir = 'Release'
56836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca
57836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca        llvm_bin_dir = os.path.join(llvm_dir, llvm_subdir, 'bin')
58836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca        if not os.path.isdir(llvm_bin_dir):
59459ea0095c31eff835b25dd3eef48a4c073d05f9José Fonseca            llvm_bin_dir = os.path.join(llvm_dir, 'bin')
60459ea0095c31eff835b25dd3eef48a4c073d05f9José Fonseca            if not os.path.isdir(llvm_bin_dir):
61459ea0095c31eff835b25dd3eef48a4c073d05f9José Fonseca                raise SCons.Errors.InternalError, "LLVM binary directory not found"
62836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca
63836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca        env.PrependENVPath('PATH', llvm_bin_dir)
64836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca
659e3728c858e0f84b05a24f858f6aeba53fa4e7cbJosé Fonseca    if env['platform'] == 'windows':
66bf48447cafc8069839ad41c9c11078c794f4b307José Fonseca        # XXX: There is no llvm-config on Windows, so assume a standard layout
678edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca        if llvm_dir is None:
68ea532f0e725bd68e7784189c9b7f6f7bf7f9d901José Fonseca            print 'scons: LLVM environment variable must be specified when building for windows'
69601498ae73e654c2de997ea75075613a694d604dJosé Fonseca            return
708edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca
718edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca        # Try to determine the LLVM version from llvm/Config/config.h
728edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca        llvm_config = os.path.join(llvm_dir, 'include/llvm/Config/config.h')
738edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca        if not os.path.exists(llvm_config):
748edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca            print 'scons: could not find %s' % llvm_config
75601498ae73e654c2de997ea75075613a694d604dJosé Fonseca            return
768edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca        llvm_version_re = re.compile(r'^#define PACKAGE_VERSION "([^"]*)"')
778edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca        llvm_version = None
788edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca        for line in open(llvm_config, 'rt'):
798edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca            mo = llvm_version_re.match(line)
808edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca            if mo:
818edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca                llvm_version = mo.group(1)
8219a633310feb3283d979c4ab4cb11a53dcfb6af6José Fonseca                llvm_version = distutils.version.LooseVersion(llvm_version)
838edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca                break
848edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca        if llvm_version is None:
858edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca            print 'scons: could not determine the LLVM version from %s' % llvm_config
86601498ae73e654c2de997ea75075613a694d604dJosé Fonseca            return
878edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca
888edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca        env.Prepend(CPPPATH = [os.path.join(llvm_dir, 'include')])
898edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca        env.AppendUnique(CPPDEFINES = [
908edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca            '__STDC_LIMIT_MACROS',
918edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca            '__STDC_CONSTANT_MACROS',
928edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca            'HAVE_STDINT_H',
938edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca        ])
948edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca        env.Prepend(LIBPATH = [os.path.join(llvm_dir, 'lib')])
95a1482b21cb438c271cf20e7d52cb9e4e0537344cJosé Fonseca        if llvm_version >= distutils.version.LooseVersion('3.0'):
96a1482b21cb438c271cf20e7d52cb9e4e0537344cJosé Fonseca            # 3.0
97a1482b21cb438c271cf20e7d52cb9e4e0537344cJosé Fonseca            env.Prepend(LIBS = [
98a1482b21cb438c271cf20e7d52cb9e4e0537344cJosé Fonseca                'LLVMBitWriter', 'LLVMX86Disassembler', 'LLVMX86AsmParser',
99a1482b21cb438c271cf20e7d52cb9e4e0537344cJosé Fonseca                'LLVMX86CodeGen', 'LLVMX86Desc', 'LLVMSelectionDAG',
100a1482b21cb438c271cf20e7d52cb9e4e0537344cJosé Fonseca                'LLVMAsmPrinter', 'LLVMMCParser', 'LLVMX86AsmPrinter',
101a1482b21cb438c271cf20e7d52cb9e4e0537344cJosé Fonseca                'LLVMX86Utils', 'LLVMX86Info', 'LLVMJIT',
102a1482b21cb438c271cf20e7d52cb9e4e0537344cJosé Fonseca                'LLVMExecutionEngine', 'LLVMCodeGen', 'LLVMScalarOpts',
103a1482b21cb438c271cf20e7d52cb9e4e0537344cJosé Fonseca                'LLVMInstCombine', 'LLVMTransformUtils', 'LLVMipa',
104a1482b21cb438c271cf20e7d52cb9e4e0537344cJosé Fonseca                'LLVMAnalysis', 'LLVMTarget', 'LLVMMC', 'LLVMCore',
105a1482b21cb438c271cf20e7d52cb9e4e0537344cJosé Fonseca                'LLVMSupport'
106a1482b21cb438c271cf20e7d52cb9e4e0537344cJosé Fonseca            ])
107a1482b21cb438c271cf20e7d52cb9e4e0537344cJosé Fonseca        elif llvm_version >= distutils.version.LooseVersion('2.9'):
1087be4cf9c63d3dcacce8a6bf47c471a9aab09b1d7José Fonseca            # 2.9
1097be4cf9c63d3dcacce8a6bf47c471a9aab09b1d7José Fonseca            env.Prepend(LIBS = [
1107be4cf9c63d3dcacce8a6bf47c471a9aab09b1d7José Fonseca                'LLVMObject', 'LLVMMCJIT', 'LLVMMCDisassembler',
1117be4cf9c63d3dcacce8a6bf47c471a9aab09b1d7José Fonseca                'LLVMLinker', 'LLVMipo', 'LLVMInterpreter',
1127be4cf9c63d3dcacce8a6bf47c471a9aab09b1d7José Fonseca                'LLVMInstrumentation', 'LLVMJIT', 'LLVMExecutionEngine',
1137be4cf9c63d3dcacce8a6bf47c471a9aab09b1d7José Fonseca                'LLVMBitWriter', 'LLVMX86Disassembler', 'LLVMX86AsmParser',
1147be4cf9c63d3dcacce8a6bf47c471a9aab09b1d7José Fonseca                'LLVMMCParser', 'LLVMX86AsmPrinter', 'LLVMX86CodeGen',
1157be4cf9c63d3dcacce8a6bf47c471a9aab09b1d7José Fonseca                'LLVMSelectionDAG', 'LLVMX86Utils', 'LLVMX86Info', 'LLVMAsmPrinter',
1167be4cf9c63d3dcacce8a6bf47c471a9aab09b1d7José Fonseca                'LLVMCodeGen', 'LLVMScalarOpts', 'LLVMInstCombine',
1177be4cf9c63d3dcacce8a6bf47c471a9aab09b1d7José Fonseca                'LLVMTransformUtils', 'LLVMipa', 'LLVMAsmParser',
1187be4cf9c63d3dcacce8a6bf47c471a9aab09b1d7José Fonseca                'LLVMArchive', 'LLVMBitReader', 'LLVMAnalysis', 'LLVMTarget',
1197be4cf9c63d3dcacce8a6bf47c471a9aab09b1d7José Fonseca                'LLVMCore', 'LLVMMC', 'LLVMSupport',
1207be4cf9c63d3dcacce8a6bf47c471a9aab09b1d7José Fonseca            ])
1217be4cf9c63d3dcacce8a6bf47c471a9aab09b1d7José Fonseca        elif llvm_version >= distutils.version.LooseVersion('2.7'):
1228edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca            # 2.7
1238edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca            env.Prepend(LIBS = [
1248edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca                'LLVMLinker', 'LLVMipo', 'LLVMInterpreter',
1258edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca                'LLVMInstrumentation', 'LLVMJIT', 'LLVMExecutionEngine',
1268edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca                'LLVMBitWriter', 'LLVMX86Disassembler', 'LLVMX86AsmParser',
1278edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca                'LLVMMCParser', 'LLVMX86AsmPrinter', 'LLVMX86CodeGen',
1288edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca                'LLVMSelectionDAG', 'LLVMX86Info', 'LLVMAsmPrinter',
1298edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca                'LLVMCodeGen', 'LLVMScalarOpts', 'LLVMInstCombine',
1308edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca                'LLVMTransformUtils', 'LLVMipa', 'LLVMAsmParser',
1318edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca                'LLVMArchive', 'LLVMBitReader', 'LLVMAnalysis', 'LLVMTarget',
1328edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca                'LLVMMC', 'LLVMCore', 'LLVMSupport', 'LLVMSystem',
1339e3728c858e0f84b05a24f858f6aeba53fa4e7cbJosé Fonseca            ])
1348edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca        else:
1358edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca            # 2.6
136bf48447cafc8069839ad41c9c11078c794f4b307José Fonseca            env.Prepend(LIBS = [
1378edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca                'LLVMX86AsmParser', 'LLVMX86AsmPrinter', 'LLVMX86CodeGen',
1388edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca                'LLVMX86Info', 'LLVMLinker', 'LLVMipo', 'LLVMInterpreter',
1398edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca                'LLVMInstrumentation', 'LLVMJIT', 'LLVMExecutionEngine',
1408edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca                'LLVMDebugger', 'LLVMBitWriter', 'LLVMAsmParser',
1418edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca                'LLVMArchive', 'LLVMBitReader', 'LLVMSelectionDAG',
1428edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca                'LLVMAsmPrinter', 'LLVMCodeGen', 'LLVMScalarOpts',
1438edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca                'LLVMTransformUtils', 'LLVMipa', 'LLVMAnalysis',
1448edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca                'LLVMTarget', 'LLVMMC', 'LLVMCore', 'LLVMSupport',
1459e3728c858e0f84b05a24f858f6aeba53fa4e7cbJosé Fonseca                'LLVMSystem',
146bf48447cafc8069839ad41c9c11078c794f4b307José Fonseca            ])
1478edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca        env.Append(LIBS = [
1488edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca            'imagehlp',
1498edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca            'psapi',
1503d1af78fdc4319b04f9cf324106f127b498b962dBrian Paul            'shell32',
1513d1af78fdc4319b04f9cf324106f127b498b962dBrian Paul            'advapi32'
1528edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca        ])
1538edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca        if env['msvc']:
1548edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca            # Some of the LLVM C headers use the inline keyword without
1558edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca            # defining it.
1568edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca            env.Append(CPPDEFINES = [('inline', '__inline')])
157e3a3a5378e4a1b45f30fcb26730d6c73e623cfacJosé Fonseca            if env['build'] in ('debug', 'checked'):
1588edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca                # LLVM libraries are static, build with /MT, and they
1598edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca                # automatically link agains LIBCMT. When we're doing a
1608edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca                # debug build we'll be linking against LIBCMTD, so disable
1618edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca                # that.
1628edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca                env.Append(LINKFLAGS = ['/nodefaultlib:LIBCMT'])
163ea532f0e725bd68e7784189c9b7f6f7bf7f9d901José Fonseca    else:
164ea532f0e725bd68e7784189c9b7f6f7bf7f9d901José Fonseca        if not env.Detect('llvm-config'):
165ea532f0e725bd68e7784189c9b7f6f7bf7f9d901José Fonseca            print 'scons: llvm-config script not found' % llvm_version
166601498ae73e654c2de997ea75075613a694d604dJosé Fonseca            return
167ea532f0e725bd68e7784189c9b7f6f7bf7f9d901José Fonseca
1688edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca        llvm_version = env.backtick('llvm-config --version').rstrip()
16919a633310feb3283d979c4ab4cb11a53dcfb6af6José Fonseca        llvm_version = distutils.version.LooseVersion(llvm_version)
170836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca
17179f48c9f9e739a1f6b0810072e41bc826f2b789dVinson Lee        try:
172acf82194ce4383308d1e8939d1778594bf5547c5José Fonseca            # Treat --cppflags specially to prevent NDEBUG from disabling
173acf82194ce4383308d1e8939d1778594bf5547c5José Fonseca            # assertion failures in debug builds.
174acf82194ce4383308d1e8939d1778594bf5547c5José Fonseca            cppflags = env.ParseFlags('!llvm-config --cppflags')
175acf82194ce4383308d1e8939d1778594bf5547c5José Fonseca            try:
176acf82194ce4383308d1e8939d1778594bf5547c5José Fonseca                cppflags['CPPDEFINES'].remove('NDEBUG')
177acf82194ce4383308d1e8939d1778594bf5547c5José Fonseca            except ValueError:
178acf82194ce4383308d1e8939d1778594bf5547c5José Fonseca                pass
179acf82194ce4383308d1e8939d1778594bf5547c5José Fonseca            env.MergeFlags(cppflags)
180acf82194ce4383308d1e8939d1778594bf5547c5José Fonseca
1813469715a8a171512cf9b528702e70393f01c6041José Fonseca            components = ['engine', 'bitwriter', 'x86asmprinter']
1823469715a8a171512cf9b528702e70393f01c6041José Fonseca
1833469715a8a171512cf9b528702e70393f01c6041José Fonseca            if llvm_version >= distutils.version.LooseVersion('3.1'):
1843469715a8a171512cf9b528702e70393f01c6041José Fonseca                components.append('mcjit')
1853469715a8a171512cf9b528702e70393f01c6041José Fonseca
1863469715a8a171512cf9b528702e70393f01c6041José Fonseca            env.ParseConfig('llvm-config --libs ' + ' '.join(components))
18779f48c9f9e739a1f6b0810072e41bc826f2b789dVinson Lee            env.ParseConfig('llvm-config --ldflags')
18879f48c9f9e739a1f6b0810072e41bc826f2b789dVinson Lee        except OSError:
189ea532f0e725bd68e7784189c9b7f6f7bf7f9d901José Fonseca            print 'scons: llvm-config version %s failed' % llvm_version
190601498ae73e654c2de997ea75075613a694d604dJosé Fonseca            return
1918edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca
1928edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca    assert llvm_version is not None
193601498ae73e654c2de997ea75075613a694d604dJosé Fonseca    env['llvm'] = True
1948edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca
1958edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca    print 'scons: Found LLVM version %s' % llvm_version
1968edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca    env['LLVM_VERSION'] = llvm_version
1978edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca
1988edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca    # Define HAVE_LLVM macro with the major/minor version number (e.g., 0x0206 for 2.6)
1998edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca    llvm_version_major = int(llvm_version.version[0])
2008edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca    llvm_version_minor = int(llvm_version.version[1])
2018edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca    llvm_version_hex = '0x%02x%02x' % (llvm_version_major, llvm_version_minor)
2028edc6b0bfca5b1e159f4d6c024922d5d3ef59e15José Fonseca    env.Prepend(CPPDEFINES = [('HAVE_LLVM', llvm_version_hex)])
203836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca
204836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonsecadef exists(env):
205836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca    return True
206836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca
207836a9f0ae6e03d2f92dc024703015c25a5b3c353José Fonseca# vim:set ts=4 sw=4 et:
208