diff options
author | John Stebbins <[email protected]> | 2019-04-15 12:12:08 -0600 |
---|---|---|
committer | John Stebbins <[email protected]> | 2019-04-15 12:12:08 -0600 |
commit | dd549866b250a5beef4ee4c349d5a55a075087f2 (patch) | |
tree | 8790d626ebe9d378eb4584173499704ec29da472 | |
parent | a144fd366bd8ca1030aa785f7cbfa27e84a0b428 (diff) |
configure: add PkgConfigProbe and ChkLib actions
PkgConfigProbe checks for the existence of a lib using pkg-config.
ChkLib tries to verify a lib with PlkConfigProbe, then tries with
LDProbe.
Use ChkLib to verify existence of libnuma when configured and fail if
not found
-rw-r--r-- | make/configure.py | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/make/configure.py b/make/configure.py index ef55c05c0..457327c88 100644 --- a/make/configure.py +++ b/make/configure.py @@ -364,6 +364,49 @@ class CCProbe( Action ): ## returns true if feature successfully compiles ## ## +class PkgConfigProbe( Action ): + def __init__( self, pretext, args, lib ): + super( PkgConfigProbe, self ).__init__( 'probe', pretext ) + self.args = args + self.lib = lib + + def _action( self ): + if Tools.pkgconfig.fail: + self.fail = True + self.session = [] + self.msg_end = 'No pkg-config' + return + + ## pipe and redirect stderr to stdout; effects communicate result + pipe = subprocess.Popen( '%s %s %s' % + (Tools.pkgconfig.pathname, self.args, self.lib), + shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT ) + + ## read data into memory buffers, only first element (stdout) + ## data is used + data = pipe.communicate() + self.fail = pipe.returncode != 0 + + if data[0]: + self.session = data[0].splitlines() + else: + self.session = [] + + if pipe.returncode: + self.msg_end = 'code %d' % (pipe.returncode) + + def _dumpSession( self, printf ): + printf( ' + %s %s\n', Tools.pkgconfig.pathname, self.args ) + super( PkgConfigProbe, self )._dumpSession( printf ) + + +############################################################################### +## +## Compile test probe: determine if compile time feature is supported +## +## returns true if feature successfully compiles +## +## class LDProbe( Action ): def __init__( self, pretext, command, lib, test_file ): super( LDProbe, self ).__init__( 'probe', pretext ) @@ -408,6 +451,46 @@ class LDProbe( Action ): ############################################################################### ## +## Basic library existence check +## +## returns true if feature successfully compiles +## +## +class ChkLib( Action ): + def __init__( self, pretext, command, lib, test_file ): + super( ChkLib, self ).__init__( 'probe', pretext ) + self.command = command + self.test_file = test_file + self.lib = lib + + def _action( self ): + ## First try pkg-config + if not Tools.pkgconfig.fail: + pkgconfig = PkgConfigProbe( 'pkgconfig %s' % self.pretext, + '--libs', self.lib ) + pkgconfig.run() + if not pkgconfig.fail: + self.session = pkgconfig.session + self.fail = False + return + + ld = LDProbe( 'link %s' % self.pretext, self.command, + '-l%s' % self.lib, self.test_file ) + ld.run() + self.session = ld.session + self.fail = ld.fail + if self.fail: + self.msg_end = ld.msg_end + + def _actionEnd( self ): + pass + + def _dumpSession( self, printf ): + printf( ' + %s\n', self.command ) + super( ChkLib, self )._dumpSession( printf ) + +############################################################################### +## ## GNU host tuple probe: determine canonical platform type ## ## example results from various platforms: @@ -1702,6 +1785,25 @@ int main() strerror_r = LDProbe( 'strerror_r', '%s' % Tools.gcc.pathname, '', strerror_r_test ) strerror_r.run() + if build.system == 'linux': + if options.enable_numa: + numa_test = """ +#include <numa.h> + +int main() +{ +struct bitmask *bm = numa_allocate_cpumask(); +return 0; +} +""" + + numa = ChkLib( 'numa', '%s' % Tools.gcc.pathname, + 'numa', numa_test ) + numa.run() + + if numa.fail: + cfg.errln( 'Failed to find libnuma' ) + ## cfg hook before doc prep cfg.doc_ready() |