2013-04-26 2 views
5

* NIX 플랫폼에서 소스 코드를 빌드하는 일반적인 방법 중 하나는 configure 스크립트를 사용하는 것입니다. 내부적으로, configure는 당신이 접근 할 수있는 라이브러리를 결정하기 위해 많은 테스트 프로그램을 만들려고합니다. 그런 다음 매크로에 일련의 매크로를 정의한 프로젝트에 포함 된 헤더 파일을 생성하여 프로그래머가 대체 프로그램을 제공하거나 특정 "종속성"이없는 라이브러리/프로그램을 제거합니다. numpy.distutils을 사용하여 기능상으로 동등한 것이 있습니까? 예를 들어 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 코드를 구축하고 사용자 포트란 컴파일러는 그 (매크로는 fseek 포장 지원하지 않는 경우 수동으로 편집 할 필요가있다 및 ftell GNU 내장 함수). Fortran 컴파일러가 이러한 내장 함수를 제공하는지 여부를 결정하는 방법이 있습니까?

답변

0

코드 조각을 파일로 생성 & 오류 코드 검사는 정상적인 방법이며 제대로 작동해야합니다. 그러나 AFAIK는 이미 distutils의 일부로이 작업을 수행하지 않았습니다. 필자는 파이썬 기반의 다른 도구 중 하나가이를 지원할 수있는 도구를 만든다고 생각합니다. 최선의 방법은 GNU 자동 설정이라고 생각합니다.

+0

누락 된 단어 : * ... 같은 도구를 구축 할 수있다 ... *? – Tshepang

1

이 시도 :

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'])