2012-08-07 15:09:14 +08:00
|
|
|
# -*- Python -*-
|
|
|
|
|
|
|
|
import os
|
|
|
|
import platform
|
|
|
|
import re
|
|
|
|
import subprocess
|
|
|
|
|
|
|
|
|
|
|
|
# Configuration file for the 'lit' test runner.
|
|
|
|
|
|
|
|
# name: The name of this test suite.
|
2012-08-07 16:33:04 +08:00
|
|
|
config.name = 'Clang Tools'
|
2012-08-07 15:09:14 +08:00
|
|
|
|
|
|
|
# Tweak PATH for Win32
|
|
|
|
if platform.system() == 'Windows':
|
|
|
|
# Seek sane tools in directories and set to $PATH.
|
|
|
|
path = getattr(config, 'lit_tools_dir', None)
|
|
|
|
path = lit.getToolsPath(path,
|
|
|
|
config.environment['PATH'],
|
|
|
|
['cmp.exe', 'grep.exe', 'sed.exe'])
|
|
|
|
if path is not None:
|
|
|
|
path = os.path.pathsep.join((path,
|
|
|
|
config.environment['PATH']))
|
|
|
|
config.environment['PATH'] = path
|
|
|
|
|
|
|
|
# testFormat: The test format to use to interpret tests.
|
|
|
|
#
|
|
|
|
# For now we require '&&' between commands, until they get globally killed and
|
|
|
|
# the test runner updated.
|
|
|
|
execute_external = (platform.system() != 'Windows'
|
|
|
|
or lit.getBashPath() not in [None, ""])
|
|
|
|
config.test_format = lit.formats.ShTest(execute_external)
|
|
|
|
|
|
|
|
# suffixes: A list of file extensions to treat as test files.
|
|
|
|
config.suffixes = ['.c', '.cpp', '.m', '.mm', '.cu', '.ll', '.cl', '.s']
|
|
|
|
|
|
|
|
# test_source_root: The root path where tests are located.
|
|
|
|
config.test_source_root = os.path.dirname(__file__)
|
|
|
|
|
|
|
|
# test_exec_root: The root path where tests should be run.
|
2012-08-07 16:33:04 +08:00
|
|
|
clang_tools_binary_dir = getattr(config, 'clang_tools_binary_dir', None)
|
|
|
|
if not clang_tools_binary_dir:
|
|
|
|
lit.fatal('No Clang tools binary dir set!')
|
|
|
|
config.test_exec_root = os.path.join(clang_tools_binary_dir, 'test')
|
2012-08-07 15:09:14 +08:00
|
|
|
|
|
|
|
# Clear some environment variables that might affect Clang.
|
|
|
|
#
|
|
|
|
# This first set of vars are read by Clang, but shouldn't affect tests
|
|
|
|
# that aren't specifically looking for these features, or are required
|
|
|
|
# simply to run the tests at all.
|
|
|
|
#
|
|
|
|
# FIXME: Should we have a tool that enforces this?
|
|
|
|
|
|
|
|
# safe_env_vars = ('TMPDIR', 'TEMP', 'TMP', 'USERPROFILE', 'PWD',
|
|
|
|
# 'MACOSX_DEPLOYMENT_TARGET', 'IPHONEOS_DEPLOYMENT_TARGET',
|
|
|
|
# 'IOS_SIMULATOR_DEPLOYMENT_TARGET',
|
|
|
|
# 'VCINSTALLDIR', 'VC100COMNTOOLS', 'VC90COMNTOOLS',
|
|
|
|
# 'VC80COMNTOOLS')
|
|
|
|
possibly_dangerous_env_vars = ['COMPILER_PATH', 'RC_DEBUG_OPTIONS',
|
|
|
|
'CINDEXTEST_PREAMBLE_FILE', 'LIBRARY_PATH',
|
|
|
|
'CPATH', 'C_INCLUDE_PATH', 'CPLUS_INCLUDE_PATH',
|
|
|
|
'OBJC_INCLUDE_PATH', 'OBJCPLUS_INCLUDE_PATH',
|
|
|
|
'LIBCLANG_TIMING', 'LIBCLANG_OBJTRACKING',
|
|
|
|
'LIBCLANG_LOGGING', 'LIBCLANG_BGPRIO_INDEX',
|
|
|
|
'LIBCLANG_BGPRIO_EDIT', 'LIBCLANG_NOTHREADS',
|
|
|
|
'LIBCLANG_RESOURCE_USAGE',
|
|
|
|
'LIBCLANG_CODE_COMPLETION_LOGGING']
|
|
|
|
# Clang/Win32 may refer to %INCLUDE%. vsvarsall.bat sets it.
|
|
|
|
if platform.system() != 'Windows':
|
|
|
|
possibly_dangerous_env_vars.append('INCLUDE')
|
|
|
|
for name in possibly_dangerous_env_vars:
|
|
|
|
if name in config.environment:
|
|
|
|
del config.environment[name]
|
|
|
|
|
|
|
|
# Tweak the PATH to include the tools dir and the scripts dir.
|
2012-08-07 16:33:04 +08:00
|
|
|
llvm_tools_dir = getattr(config, 'llvm_tools_dir', None)
|
|
|
|
if not llvm_tools_dir:
|
|
|
|
lit.fatal('No LLVM tools dir set!')
|
|
|
|
path = os.path.pathsep.join((llvm_tools_dir, config.environment['PATH']))
|
|
|
|
config.environment['PATH'] = path
|
|
|
|
|
|
|
|
llvm_libs_dir = getattr(config, 'llvm_libs_dir', None)
|
|
|
|
if not llvm_libs_dir:
|
|
|
|
lit.fatal('No LLVM libs dir set!')
|
|
|
|
path = os.path.pathsep.join((llvm_libs_dir,
|
|
|
|
config.environment.get('LD_LIBRARY_PATH','')))
|
|
|
|
config.environment['LD_LIBRARY_PATH'] = path
|
2012-08-07 15:09:14 +08:00
|
|
|
|
|
|
|
###
|
|
|
|
|
|
|
|
# When running under valgrind, we mangle '-vg' onto the end of the triple so we
|
|
|
|
# can check it with XFAIL and XTARGET.
|
|
|
|
if lit.useValgrind:
|
|
|
|
config.target_triple += '-vg'
|
|
|
|
|
2012-08-07 16:33:04 +08:00
|
|
|
config.clang = llvm_tools_dir + "/clang"
|
2012-08-07 15:09:14 +08:00
|
|
|
if not lit.quiet:
|
|
|
|
lit.note('using clang: %r' % config.clang)
|
|
|
|
|
|
|
|
# Note that when substituting %clang_cc1 also fill in the include directory of
|
|
|
|
# the builtin headers. Those are part of even a freestanding environment, but
|
|
|
|
# Clang relies on the driver to locate them.
|
|
|
|
def getClangBuiltinIncludeDir(clang):
|
|
|
|
cmd = subprocess.Popen([clang, '-print-file-name=include'],
|
|
|
|
stdout=subprocess.PIPE)
|
|
|
|
if not cmd.stdout:
|
|
|
|
lit.fatal("Couldn't find the include dir for Clang ('%s')" % clang)
|
|
|
|
return cmd.stdout.read().strip()
|
|
|
|
|
|
|
|
config.substitutions.append( ('%clang_cc1', '%s -cc1 -internal-isystem %s'
|
|
|
|
% (config.clang,
|
|
|
|
getClangBuiltinIncludeDir(config.clang))) )
|
|
|
|
|
|
|
|
config.substitutions.append( ('%clangxx', ' ' + config.clang +
|
|
|
|
' -ccc-clang-cxx -ccc-cxx '))
|
|
|
|
config.substitutions.append( ('%clang', ' ' + config.clang + ' ') )
|
|
|
|
|
|
|
|
# FIXME: Find nicer way to prohibit this.
|
|
|
|
config.substitutions.append(
|
|
|
|
(' clang ', """*** Do not use 'clang' in tests, use '%clang'. ***""") )
|
|
|
|
config.substitutions.append(
|
|
|
|
(' clang\+\+ ', """*** Do not use 'clang++' in tests, use '%clangxx'. ***"""))
|
|
|
|
config.substitutions.append(
|
|
|
|
(' clang-cc ',
|
|
|
|
"""*** Do not use 'clang-cc' in tests, use '%clang_cc1'. ***""") )
|
|
|
|
config.substitutions.append(
|
|
|
|
(' clang -cc1 ',
|
|
|
|
"""*** Do not use 'clang -cc1' in tests, use '%clang_cc1'. ***""") )
|
|
|
|
config.substitutions.append(
|
|
|
|
(' %clang-cc1 ',
|
|
|
|
"""*** invalid substitution, use '%clang_cc1'. ***""") )
|
|
|
|
|
|
|
|
###
|
|
|
|
|
|
|
|
# Set available features we allow tests to conditionalize on.
|
|
|
|
#
|
|
|
|
# As of 2011.08, crash-recovery tests still do not pass on FreeBSD.
|
|
|
|
if platform.system() not in ['FreeBSD']:
|
|
|
|
config.available_features.add('crash-recovery')
|
|
|
|
|
|
|
|
# Shell execution
|
|
|
|
if platform.system() not in ['Windows'] or lit.getBashPath() != '':
|
|
|
|
config.available_features.add('shell')
|
|
|
|
|
|
|
|
# ANSI escape sequences in non-dump terminal
|
|
|
|
if platform.system() not in ['Windows']:
|
|
|
|
config.available_features.add('ansi-escape-sequences')
|