我有一个setup.py脚本,需要探测编译器是否支持TR1、是否存在windows.h(以添加NOMINMAX定义)等。我通过创建一个简单的程序,并尝试使用Distutils的Compiler类编译它来进行这些检查。有/没有错误就是我的答案。
这很有效,但意味着编译器的丑陋错误消息会打印到控制台上。有没有办法在手动调用compile函数时抑制错误消息?
以下是我的函数,它现在通过将错误流导向文件(回答了自己的问题)来消除错误消息:
这里有一个函数,它使用上述方法来检查头部是否存在。
这很有效,但意味着编译器的丑陋错误消息会打印到控制台上。有没有办法在手动调用compile函数时抑制错误消息?
以下是我的函数,它现在通过将错误流导向文件(回答了自己的问题)来消除错误消息:
def see_if_compiles(program, include_dirs, define_macros):
""" Try to compile the passed in program and report if it compiles successfully or not. """
from distutils.ccompiler import new_compiler, CompileError
from shutil import rmtree
import tempfile
import os
try:
tmpdir = tempfile.mkdtemp()
except AttributeError:
# Python 2.2 doesn't have mkdtemp().
tmpdir = "compile_check_tempdir"
try:
os.mkdir(tmpdir)
except OSError:
print "Can't create temporary directory. Aborting."
sys.exit()
old = os.getcwd()
os.chdir(tmpdir)
# Write the program
f = open('compiletest.cpp', 'w')
f.write(program)
f.close()
# redirect the error stream to keep ugly compiler error messages off the command line
devnull = open('errors.txt', 'w')
oldstderr = os.dup(sys.stderr.fileno())
os.dup2(devnull.fileno(), sys.stderr.fileno())
#
try:
c = new_compiler()
for macro in define_macros:
c.define_macro(name=macro[0], value=macro[1])
c.compile([f.name], include_dirs=include_dirs)
success = True
except CompileError:
success = False
# undo the error stream redirect
os.dup2(oldstderr, sys.stderr.fileno())
devnull.close()
os.chdir(old)
rmtree(tmpdir)
return success
这里有一个函数,它使用上述方法来检查头部是否存在。
def check_for_header(header, include_dirs, define_macros):
"""Check for the existence of a header file by creating a small program which includes it and see if it compiles."""
program = "#include <%s>\n" % header
sys.stdout.write("Checking for <%s>... " % header)
success = see_if_compiles(program, include_dirs, define_macros)
if (success):
sys.stdout.write("OK\n");
else:
sys.stdout.write("Not found\n");
return success