gpt4 book ai didi

python - numpy distutils——尝试编译一些东西并在失败时设置标志

转载 作者:太空狗 更新时间:2023-10-30 01:34:39 24 4
gpt4 key购买 nike

在 *NIX 平台上构建源代码的一种常见方法是使用 configure 脚本。在幕后,configure 尝试构建一堆测试程序以确定您可以访问哪些库。然后它生成一个头文件,该文件包含在项目中,该文件有条件地定义了一堆宏,以便程序员可以提供替代方案或在缺少特定“依赖项”时构建库/程序的精简版本。使用 numpy.distutils 是否有任何功能等效的东西?

例如,这是我的setup.py:

from numpy.distutils.misc_util import Configuration

def configuration(parent_package='',top_path=None):
config = Configuration('pyggcm',parent_package,top_path)

#TODO: Currently, I have some macros to conditionally build the seek-code
#Unfortunately, that's not the best solution (by far). Perhaps if we
#changed to using stream access it would work better, without the need
#for these silly macros.
config.add_extension('_fortfile',sources=['_fortfile/_fortfile.F90'],
define_macros=[
('FSEEKABLE',1), #compiler provides fseek and ftell
('HAVE_STREAM',1) #compiler provides access='stream' for opening files. (f2003 standard)
])

config.add_extension('jrrle',sources=['jrrle/jrrle.f90'])
config.add_scripts(['scripts/ggcm_timehist',
'scripts/ggcm_plasmasheet',
'scripts/ggcm_plot'])
return config


from numpy.distutils.core import setup
setup(configuration=configuration)

这是无条件构建 FSEEKABLE 代码,如果用户 Fortran 编译器不支持它,则需要手动编辑(宏包装了 fseekftell GNU 内部函数)。有没有办法确定 Fortran 编译器是否提供这些内部函数?

最佳答案

试试这个:

import os
import shutil
import tempfile
from distutils.ccompiler import new_compiler

def hasfunction(cc, funcname, include=None, extra_postargs=None):
tmpdir = tempfile.mkdtemp(prefix='hasfunction-')
devnull = oldstderr = None
try:
try:
fname = os.path.join(tmpdir, 'funcname.c')
f = open(fname, 'w')
if include is not None:
f.write('#include %s\n' % include)
f.write('int main(void) {\n')
f.write(' %s;\n' % funcname)
f.write('}\n')
f.close()
devnull = open(os.devnull, 'w')
oldstderr = os.dup(sys.stderr.fileno())
os.dup2(devnull.fileno(), sys.stderr.fileno())
objects = cc.compile([fname], output_dir=tmpdir,
extra_postargs=extra_postargs)
cc.link_executable(objects, os.path.join(tmpdir, 'a.out'))
except Exception as e:
return False
return True
finally:
if oldstderr is not None:
os.dup2(oldstderr, sys.stderr.fileno())
if devnull is not None:
devnull.close()
shutil.rmtree(tmpdir)

例子:

def detect_sse3():
"Does this compiler support SSE3 intrinsics?"
compiler = new_compiler()
return hasfunction(compiler, '__m128 v; _mm_hadd_ps(v,v)',
include='<pmmintrin.h>',
extra_postargs=['-msse3'])

关于python - numpy distutils——尝试编译一些东西并在失败时设置标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16239165/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com