127 lines
2.8 KiB
Python
127 lines
2.8 KiB
Python
import re
|
|
import sys
|
|
from distutils.spawn import find_executable
|
|
from os.path import abspath, dirname, isfile, join
|
|
from subprocess import Popen, PIPE
|
|
|
|
|
|
def find_llvm_tblgen():
|
|
path = find_executable('llvm-tblgen')
|
|
if path is None:
|
|
sys.exit('Error: could not locate llvm-tblgen')
|
|
return path
|
|
|
|
|
|
def find_llvm_prefix():
|
|
return abspath(dirname(dirname(find_llvm_tblgen())))
|
|
|
|
|
|
def ensure_file(path):
|
|
if not isfile(path):
|
|
sys.exit('Error: no file: %r' % path)
|
|
|
|
|
|
def get_llvm_version():
|
|
args = [find_llvm_tblgen(), '--version']
|
|
p = Popen(args, stdout=PIPE, stderr=PIPE)
|
|
stdout, stderr = p.communicate()
|
|
if stderr:
|
|
sys.exit("Error: %r stderr is:\n%s" % (args, stderr.decode()))
|
|
out = stdout.decode().strip()
|
|
pat = re.compile(r'llvm\s+version\s+(\d+\.\d+\S*)', re.I)
|
|
m = pat.search(out)
|
|
if m is None:
|
|
sys.exit('Error: could not parse version in:' + out)
|
|
return m.group(1)
|
|
|
|
|
|
def libs_options():
|
|
# NOTE: instead of actually looking at the components requested,
|
|
# we just print out a bunch of libs
|
|
for lib in """
|
|
LLVMAnalysis
|
|
LLVMAsmParser
|
|
LLVMAsmPrinter
|
|
LLVMBitReader
|
|
LLVMBitWriter
|
|
LLVMCodeGen
|
|
LLVMCore
|
|
LLVMExecutionEngine
|
|
LLVMInstCombine
|
|
LLVMInstrumentation
|
|
LLVMInterpreter
|
|
LLVMipa
|
|
LLVMipo
|
|
LLVMJIT
|
|
LLVMMCJIT
|
|
LLVMLinker
|
|
LLVMMC
|
|
LLVMMCParser
|
|
LLVMObject
|
|
LLVMRuntimeDyld
|
|
LLVMScalarOpts
|
|
LLVMSelectionDAG
|
|
LLVMSupport
|
|
LLVMTarget
|
|
LLVMTransformUtils
|
|
LLVMVectorize
|
|
LLVMX86AsmParser
|
|
LLVMX86AsmPrinter
|
|
LLVMX86CodeGen
|
|
LLVMX86Desc
|
|
LLVMX86Disassembler
|
|
LLVMX86Info
|
|
LLVMX86Utils
|
|
LLVMDebugInfo
|
|
Advapi32
|
|
Shell32
|
|
""".split():
|
|
print('-l%s' % lib)
|
|
|
|
if isfile(join(find_llvm_prefix(), 'lib', 'LLVMPTXCodeGen.lib')):
|
|
print('-lLLVMPTXAsmPrinter')
|
|
print('-lLLVMPTXCodeGen')
|
|
print('-lLLVMPTXDesc')
|
|
print('-lLLVMPTXInfo')
|
|
|
|
elif isfile(join(find_llvm_prefix(), 'lib', 'LLVMNVPTXCodeGen.lib')):
|
|
print('-lLLVMNVPTXAsmPrinter')
|
|
print('-lLLVMNVPTXCodeGen')
|
|
print('-lLLVMNVPTXDesc')
|
|
print('-lLLVMNVPTXInfo')
|
|
|
|
|
|
def main():
|
|
try:
|
|
option = sys.argv[1]
|
|
except IndexError:
|
|
sys.exit('Error: option missing')
|
|
|
|
if option == '--version':
|
|
print(get_llvm_version())
|
|
|
|
elif option == '--targets-built':
|
|
print('X86') # just do X86
|
|
|
|
elif option == '--libs':
|
|
libs_options()
|
|
|
|
elif option == '--includedir':
|
|
incdir = join(find_llvm_prefix(), 'include')
|
|
ensure_file(join(incdir, 'llvm' , 'Linker.h'))
|
|
print(incdir)
|
|
|
|
elif option == '--libdir':
|
|
libdir = join(find_llvm_prefix(), 'lib')
|
|
ensure_file(join(libdir, 'LLVMCore.lib'))
|
|
print(libdir)
|
|
|
|
elif option in ('--ldflags', '--components'):
|
|
pass
|
|
|
|
else:
|
|
sys.exit('Error: Unrecognized llvm-config option %r' % option)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|