Commit 2bc3b231 authored by Greg Ward's avatar Greg Ward

Added 'include_dirs' parameters all over the place.

Added 'check_lib()', which provides a subset of the functionality of
  'check_func()' with a simpler interface and implementation.
parent 7d785e9c
...@@ -112,24 +112,26 @@ class config (Command): ...@@ -112,24 +112,26 @@ class config (Command):
file.close() file.close()
return filename return filename
def _preprocess (self, body, headers, lang): def _preprocess (self, body, headers, include_dirs, lang):
src = self._gen_temp_sourcefile(body, headers, lang) src = self._gen_temp_sourcefile(body, headers, lang)
out = "_configtest.i" out = "_configtest.i"
self.temp_files.extend([src, out]) self.temp_files.extend([src, out])
self.compiler.preprocess(src, out) self.compiler.preprocess(src, out, include_dirs=include_dirs)
return (src, out) return (src, out)
def _compile (self, body, headers, lang): def _compile (self, body, headers, include_dirs, lang):
src = self._gen_temp_sourcefile(body, headers, lang) src = self._gen_temp_sourcefile(body, headers, lang)
if self.dump_source: if self.dump_source:
dump_file(src, "compiling '%s':" % src) dump_file(src, "compiling '%s':" % src)
(obj,) = self.compiler.object_filenames([src]) (obj,) = self.compiler.object_filenames([src])
self.temp_files.extend([src, obj]) self.temp_files.extend([src, obj])
self.compiler.compile([src]) self.compiler.compile([src], include_dirs=include_dirs)
return (src, obj) return (src, obj)
def _link (self, body, headers, libraries, library_dirs, lang): def _link (self, body,
(src, obj) = self._compile(body, headers, lang) headers, include_dirs,
libraries, library_dirs, lang):
(src, obj) = self._compile(body, headers, include_dirs, lang)
prog = os.path.splitext(os.path.basename(src))[0] prog = os.path.splitext(os.path.basename(src))[0]
self.temp_files.append(prog) # XXX should be prog + exe_ext self.temp_files.append(prog) # XXX should be prog + exe_ext
self.compiler.link_executable([obj], prog, self.compiler.link_executable([obj], prog,
...@@ -159,7 +161,7 @@ class config (Command): ...@@ -159,7 +161,7 @@ class config (Command):
# XXX need access to the header search path and maybe default macros. # XXX need access to the header search path and maybe default macros.
def try_cpp (self, body=None, headers=None, lang="c"): def try_cpp (self, body=None, headers=None, include_dirs=None, lang="c"):
"""Construct a source file from 'body' (a string containing lines """Construct a source file from 'body' (a string containing lines
of C/C++ code) and 'headers' (a list of header files to include) of C/C++ code) and 'headers' (a list of header files to include)
and run it through the preprocessor. Return true if the and run it through the preprocessor. Return true if the
...@@ -177,7 +179,8 @@ class config (Command): ...@@ -177,7 +179,8 @@ class config (Command):
self._clean() self._clean()
return ok return ok
def search_cpp (self, pattern, body=None, headers=None, lang="c"): def search_cpp (self, pattern, body=None,
headers=None, include_dirs=None, lang="c"):
"""Construct a source file (just like 'try_cpp()'), run it through """Construct a source file (just like 'try_cpp()'), run it through
the preprocessor, and return true if any line of the output matches the preprocessor, and return true if any line of the output matches
'pattern'. 'pattern' should either be a compiled regex object or a 'pattern'. 'pattern' should either be a compiled regex object or a
...@@ -206,7 +209,7 @@ class config (Command): ...@@ -206,7 +209,7 @@ class config (Command):
self._clean() self._clean()
return match return match
def try_compile (self, body, headers=None, lang="c"): def try_compile (self, body, headers=None, include_dirs=None, lang="c"):
"""Try to compile a source file built from 'body' and 'headers'. """Try to compile a source file built from 'body' and 'headers'.
Return true on success, false otherwise. Return true on success, false otherwise.
""" """
...@@ -222,8 +225,8 @@ class config (Command): ...@@ -222,8 +225,8 @@ class config (Command):
self._clean() self._clean()
return ok return ok
def try_link (self, def try_link (self, body,
body, headers=None, headers=None, include_dirs=None,
libraries=None, library_dirs=None, libraries=None, library_dirs=None,
lang="c"): lang="c"):
"""Try to compile and link a source file, built from 'body' and """Try to compile and link a source file, built from 'body' and
...@@ -233,7 +236,8 @@ class config (Command): ...@@ -233,7 +236,8 @@ class config (Command):
from distutils.ccompiler import CompileError, LinkError from distutils.ccompiler import CompileError, LinkError
self._check_compiler() self._check_compiler()
try: try:
self._link(body, headers, libraries, library_dirs, lang) self._link(body, headers, include_dirs,
libraries, library_dirs, lang)
ok = 1 ok = 1
except (CompileError, LinkError): except (CompileError, LinkError):
ok = 0 ok = 0
...@@ -242,8 +246,8 @@ class config (Command): ...@@ -242,8 +246,8 @@ class config (Command):
self._clean() self._clean()
return ok return ok
def try_run (self, def try_run (self, body,
body, headers=None, headers=None, include_dirs=None,
libraries=None, library_dirs=None, libraries=None, library_dirs=None,
lang="c"): lang="c"):
"""Try to compile, link to an executable, and run a program """Try to compile, link to an executable, and run a program
...@@ -253,7 +257,8 @@ class config (Command): ...@@ -253,7 +257,8 @@ class config (Command):
from distutils.ccompiler import CompileError, LinkError from distutils.ccompiler import CompileError, LinkError
self._check_compiler() self._check_compiler()
try: try:
self._link(body, headers, libraries, library_dirs, lang) self._link(body, headers, include_dirs,
libraries, library_dirs, lang)
self.spawn([exe]) self.spawn([exe])
ok = 1 ok = 1
except (CompileError, LinkError, DistutilsExecError): except (CompileError, LinkError, DistutilsExecError):
...@@ -268,7 +273,8 @@ class config (Command): ...@@ -268,7 +273,8 @@ class config (Command):
# (these are the ones that are actually likely to be useful # (these are the ones that are actually likely to be useful
# when implementing a real-world config command!) # when implementing a real-world config command!)
def check_func (self, func, headers=None, def check_func (self, func,
headers=None, include_dirs=None,
libraries=None, library_dirs=None, libraries=None, library_dirs=None,
decl=0, call=0): decl=0, call=0):
...@@ -298,16 +304,30 @@ class config (Command): ...@@ -298,16 +304,30 @@ class config (Command):
body.append("}") body.append("}")
body = string.join(body, "\n") + "\n" body = string.join(body, "\n") + "\n"
return self.try_link(body, headers, libraries, library_dirs) return self.try_link(body, headers, include_dirs,
libraries, library_dirs)
# check_func () # check_func ()
def check_header (self, header, lang="c"): def check_lib (self, library, library_dirs=None,
headers=None, include_dirs=None):
"""Determine if 'library' is available to be linked against,
without actually checking that any particular symbols are provided
by it. 'headers' will be used in constructing the source file to
be compiled, but the only effect of this is to check if all the
header files listed are available.
"""
self._check_compiler()
return self.try_link("int main (void) { }",
headers, include_dirs, [library], library_dirs)
def check_header (self, header, include_dirs=None,
library_dirs=None, lang="c"):
"""Determine if the system header file named by 'header_file' """Determine if the system header file named by 'header_file'
exists and can be found by the preprocessor; return true if so, exists and can be found by the preprocessor; return true if so,
false otherwise. false otherwise.
""" """
return self.try_cpp(headers=[header]) return self.try_cpp(headers=[header], include_dirs=include_dirs)
# class config # class config
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment