From 9f575664d3db2e90bb75c4fed512ef2f810236b1 Mon Sep 17 00:00:00 2001 From: John Stebbins Date: Tue, 16 Apr 2019 07:54:02 -0600 Subject: configure: make separate LDTest and PkgConfigTest functions Using LDProbe and PkgConfigProbe Actions within ChkLib Action resulted in somewhat ugly log output. Moving the work into separate Test functions allows it to be reused without using the Actions --- make/configure.py | 150 +++++++++++++++++++++++++++--------------------------- 1 file changed, 74 insertions(+), 76 deletions(-) (limited to 'make') diff --git a/make/configure.py b/make/configure.py index c0a6f7662..b4f891a14 100644 --- a/make/configure.py +++ b/make/configure.py @@ -364,6 +364,34 @@ class CCProbe( Action ): ## returns true if feature successfully compiles ## ## +def PkgConfigTest(args, lib): + msg_end = '' + if Tools.pkgconfig.fail: + fail = True + session = [] + msg_end = 'No pkg-config' + return fail, msg_end, session + + ## pipe and redirect stderr to stdout; effects communicate result + pipe = subprocess.Popen( '%s %s %s' % + (Tools.pkgconfig.pathname, args, lib), + shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT ) + + ## read data into memory buffers, only first element (stdout) + ## data is used + data = pipe.communicate() + fail = pipe.returncode != 0 + + if data[0]: + session = data[0].splitlines() + else: + session = [] + + if pipe.returncode: + msg_end = 'code %d' % (pipe.returncode) + + return fail, msg_end, session + class PkgConfigProbe( Action ): def __init__( self, pretext, args, lib ): super( PkgConfigProbe, self ).__init__( 'probe', pretext ) @@ -371,29 +399,8 @@ class PkgConfigProbe( Action ): 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) + self.fail, self.msg_end, self.session = PkgConfigTest(self.args, + self.lib) def _dumpSession( self, printf ): printf( ' + %s %s\n', Tools.pkgconfig.pathname, self.args ) @@ -407,6 +414,38 @@ class PkgConfigProbe( Action ): ## returns true if feature successfully compiles ## ## +def LDTest(command, lib, test_file): + ## write program file + with open( 'conftest.c', 'w' ) as out_file: + out_file.write( test_file ) + ## pipe and redirect stderr to stdout; effects communicate result + pipe = subprocess.Popen( '%s -o conftest conftest.c %s' % (command, lib), shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT ) + + ## read data into memory buffers, only first element (stdout) data is used + data = pipe.communicate() + fail = pipe.returncode != 0 + + if data[0]: + session = data[0].splitlines() + else: + session = [] + + msg_end = '' + if pipe.returncode: + msg_end = 'code %d' % (pipe.returncode) + + os.remove( 'conftest.c' ) + if not fail: + try: + os.remove( 'conftest.exe' ) + except: + pass + try: + os.remove( 'conftest' ) + except: + pass + return (fail, msg_end, session) + class LDProbe( Action ): def __init__( self, pretext, command, lib, test_file ): super( LDProbe, self ).__init__( 'probe', pretext ) @@ -415,34 +454,8 @@ class LDProbe( Action ): self.lib = lib def _action( self ): - ## write program file - with open( 'conftest.c', 'w' ) as out_file: - out_file.write( self.test_file ) - ## pipe and redirect stderr to stdout; effects communicate result - pipe = subprocess.Popen( '%s -o conftest conftest.c %s' % (self.command, 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) - - os.remove( 'conftest.c' ) - if not self.fail: - try: - os.remove( 'conftest.exe' ) - except: - pass - try: - os.remove( 'conftest' ) - except: - pass + self.fail, self.msg_end, self.session = LDTest( + self.command, self.lib, self.test_file) def _dumpSession( self, printf ): printf( ' + %s\n', self.command ) @@ -457,8 +470,8 @@ class LDProbe( Action ): ## ## class ChkLib( Action ): - def __init__( self, pretext, command, lib, test_file ): - super( ChkLib, self ).__init__( 'probe', pretext ) + def __init__( self, pretext, command, lib, test_file, abort=False ): + super( ChkLib, self ).__init__( 'probe', pretext, abort=abort ) self.command = command self.test_file = test_file self.lib = lib @@ -466,28 +479,15 @@ class ChkLib( Action ): 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 + self.fail, self.msg_end, self.session = PkgConfigTest( + '--libs', self.lib) + if not self.fail: 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 ) + ## If pkg-config fails, try compiling and linking test file + self.fail, self.msg_end, session = LDTest( + self.command, '-l%s' % self.lib, self.test_file) + self.session.append(session) ############################################################################### ## @@ -1850,11 +1850,9 @@ return 0; """ numa = ChkLib( 'numa', '%s' % Tools.gcc.pathname, - 'numa', numa_test ) + 'numa', numa_test, abort=True ) numa.run() - if numa.fail: - cfg.errln( 'Failed to find libnuma' ) ## cfg hook before doc prep cfg.doc_ready() -- cgit v1.2.3