2013-04-26 14 views
5

Başarısızlık durumunda bir şey derlemeyi deneyin ve bayraklar ayarlayın. * NIX platformlarında bir kaynak kodu oluşturmak için ortak bir yol, bir configure komut dosyası kullanmaktır. Kaput altında, yapılandırmak istediğiniz kitaplıkları belirlemek için bir dizi test programı oluşturmaya çalışır. Daha sonra, bir grup makroyu koşullu olarak tanımlayan bir başlık dosyası oluşturur, böylece programcı bir alternatif sağlayabilir veya belirli bir "bağımlılık" eksikse bir kütüphane/programın soyulmuş bir sürümünü oluşturabilir. numpy.distutils kullanarak işlevsel olarak eşdeğer bir şey var mı? Örnek olarak numut distutils -

, burada benim 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) 

Bu koşulsuz FSEEKABLE yöntem oluşturmaya ve kullanıcılar Fortran derleyici o (makrolar fseek sarmak desteklemiyorsa elle düzenlenmesi gerekir ediyorum ve ftell GNU intrinsik işlevi). Fortran derleyicisinin bu içsel işlevleri sağlayıp sağlamadığını belirlemenin bir yolu var mı?

cevap

0

Bir dosyaya & bir kod parçası oluşturun, hata kodlarını kontrol etmeyi deneyin normal bir yaklaşımdır ve güzel çalışmalıdır, ancak AFAIK hiç kimse bunu sizin için bir sorun haline getirmiştir. Sanırım, belki de python tabanlı olanlardan biri, bunu destekleyebilecek gibi araçlar inşa ediyor. En iyi bahsinizin GNU autoconfigure olduğunu düşünüyorum.

+0

Eksik kelimeyi: * ... gibi araçlar oluşturmak may ... *? – Tshepang

1

bu deneyin:

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) 

Örnek:

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']) 
İlgili konular