Source code for pypeit.bspline.setup_package

import os
import sys
import tempfile, subprocess, shutil

from distutils.extension import Extension

# the most reliable way to check for openmp support in the C compiler is to try to build
# some test code with the -fopenmp flag. openmp provides a big performance boost, but some
# systems, notably apple's version of clang that xcode provides, don't support it out of the box.

# see http://openmp.org/wp/openmp-compilers/
omp_test = \
r"""
#include <omp.h>
#include <stdio.h>
int main() {
#pragma omp parallel
printf("Hello from thread %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads());
}
"""

[docs]def check_for_openmp(): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) if 'CC' in os.environ: c_compiler = os.environ['CC'] else: c_compiler = 'gcc' filename = r'test.c' with open(filename, 'w') as file: file.write(omp_test) with open(os.devnull, 'w') as fnull: result = subprocess.call([c_compiler, '-fopenmp', filename], stdout=fnull, stderr=fnull) os.chdir(curdir) # clean up test code shutil.rmtree(tmpdir) # return code from compiler process is 0 if it completed successfully if result == 0: return True else: return False
C_BSPLINE_PKGDIR = os.path.relpath(os.path.dirname(__file__)) SRC_FILES = [os.path.join(C_BSPLINE_PKGDIR, filename) for filename in ['src/bspline.c']] extra_compile_args=['-UNDEBUG', '-ffast-math'] if not sys.platform.startswith('win'): extra_compile_args.append('-fPIC') if check_for_openmp(): extra_compile_args.append('-fopenmp') extra_link_args = ['-fopenmp'] else: extra_link_args = []
[docs]def get_extensions(): return [Extension(name='pypeit.bspline._bspline', sources=SRC_FILES, extra_compile_args=extra_compile_args, language='c', extra_link_args=extra_link_args, export_symbols=['bspline_model', 'solution_arrays', 'cholesky_band', 'cholesky_solve', 'intrv'])]