Former-commit-id:9f19e3f712
[formerly9f19e3f712
[formerly 64fa9254b946eae7e61bbc3f513b7c3696c4f54f]] Former-commit-id:06a8b51d6d
Former-commit-id:3360eb6c5f
57 lines
1.5 KiB
Python
Executable file
57 lines
1.5 KiB
Python
Executable file
|
|
import os.path as op
|
|
|
|
def detect_hdf5(basedir, **compiler_attrs):
|
|
""" Compile, link & execute a test program, in empty directory basedir.
|
|
The C compiler will be updated with any keywords given via setattr.
|
|
|
|
Returns a dictionary containing information about the HDF5 installation.
|
|
"""
|
|
|
|
from distutils import ccompiler
|
|
from distutils.core import CompileError, LinkError
|
|
import subprocess
|
|
|
|
cc = ccompiler.new_compiler()
|
|
for name, val in compiler_attrs.iteritems():
|
|
setattr(cc, name, val)
|
|
|
|
cfile = op.join(basedir, 'vers.c')
|
|
efile = op.join(basedir, 'vers')
|
|
|
|
f = open(cfile, 'w')
|
|
try:
|
|
f.write(
|
|
r"""
|
|
#include <stdio.h>
|
|
#include "hdf5.h"
|
|
|
|
int main(){
|
|
unsigned int main, minor, release;
|
|
if(H5get_libversion(&main, &minor, &release)<0) return 1;
|
|
fprintf(stdout, "vers: %d.%d.%d\n", main, minor, release);
|
|
return 0;
|
|
}
|
|
""")
|
|
finally:
|
|
f.close()
|
|
|
|
objs = cc.compile([cfile])
|
|
cc.link_executable(objs, efile)
|
|
|
|
result = subprocess.Popen(efile,
|
|
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
so, se = result.communicate()
|
|
if result.returncode:
|
|
raise IOError("Error running HDF5 version detection script:\n%s\n%s" % (so,se))
|
|
|
|
handlers = {'vers': lambda val: tuple(int(v) for v in val.split('.')),
|
|
'parallel': lambda val: bool(int(val))}
|
|
|
|
props = {}
|
|
for line in (x for x in so.split('\n') if x):
|
|
key, val = line.split(':')
|
|
props[key] = handlers[key](val)
|
|
|
|
return props
|
|
|