On Thu, May 16, 2013 at 11:22 AM, Jed Brown <[email protected]> wrote:
> Satish Balay <[email protected]> writes: > > > > ================================================================================ > > TEST check from > config.libraries(/cygdrive/d/petsc-3.4.0/config/BuildSystem/config/libraries.py:145) > > TESTING: check from > config.libraries(config/BuildSystem/config/libraries.py:145) > > Checks that the library "libName" contains "funcs", and if it does > defines HAVE_LIB"libName" > > - libDir may be a list of directories > > - libName may be a list of library names > > Checking for function MPI_Init in library > ['/cygdrive/c/Program Files/Microsoft HPC Pack > 2012/lib/amd64/msmpifec.lib', '/cygdrive/c/Program Files/Microsoft HPC Pack > 2012/lib/amd64/msmpi.lib'] [] > > Pushing language C > > sh: /cygdrive/d/petsc-3.4.0/bin/win32fe/win32fe cl -c -o > /tmp/petsc-tL1oq8/config.libraries/conftest.o > -I/tmp/petsc-tL1oq8/config.compilers > -I/tmp/petsc-tL1oq8/config.setCompilers -I/tmp/petsc-tL1oq8/config.headers > -I/tmp/petsc-tL1oq8/PETSc.utilities.cacheDetails > -I/tmp/petsc-tL1oq8/config.types > -I/tmp/petsc-tL1oq8/PETSc.utilities.missing > -I/tmp/petsc-tL1oq8/PETSc.utilities.scalarTypes > -I/tmp/petsc-tL1oq8/config.functions -I/tmp/petsc-tL1oq8/config.libraries > -MT -wd4996 -Z7 /tmp/petsc-tL1oq8/config.libraries/conftest.c > > Executing: /cygdrive/d/petsc-3.4.0/bin/win32fe/win32fe cl -c -o > /tmp/petsc-tL1oq8/config.libraries/conftest.o > -I/tmp/petsc-tL1oq8/config.compilers > -I/tmp/petsc-tL1oq8/config.setCompilers -I/tmp/petsc-tL1oq8/config.headers > -I/tmp/petsc-tL1oq8/PETSc.utilities.cacheDetails > -I/tmp/petsc-tL1oq8/config.types > -I/tmp/petsc-tL1oq8/PETSc.utilities.missing > -I/tmp/petsc-tL1oq8/PETSc.utilities.scalarTypes > -I/tmp/petsc-tL1oq8/config.functions -I/tmp/petsc-tL1oq8/config.libraries > -MT -wd4996 -Z7 /tmp/petsc-tL1oq8/config.libraries/conftest.c > > sh: conftest.c^M > > > > Successful compile: > > <<<<<<<<<<<< > > > > Actually the libraries are found. > > I'm afraid I don't understand what happens here. We look for and find > MPI_Init in ../lib/amd64-msmpi.lib, then we look for MPI_Comm_create and > compile with no warnings, then the link fails to produce the executable, > but does not issue any warnings or error message: > > Executing: /cygdrive/d/petsc-3.4.0/bin/win32fe/win32fe cl -o > /tmp/petsc-tL1oq8/config.libraries/conftest.exe -MT -wd4996 -Z7 > /tmp/petsc-tL1oq8/config.libraries/conftest.o > /cygdrive/c/Program\ Files/Microsoft\ HPC\ Pack\ > 2012/lib/amd64/msmpifec.lib /cygdrive/c/Program\ Files/Microsoft\ HPC\ > Pack\ 2012/lib/amd64/msmpi.lib Ws2_32.lib > sh: LINK : C:\cygwin\tmp\PE236E~1\CONFIG~1.LIB\conftest.exe not found or > not built by the last incremental link; performing full link > > We interpret this as a successful link and move on to checking for > includes. This fails and now we try the next entry in the liblist? The > library can't possibly affect our ability to compile so the rest is just > noise. If we consider the library to be primary, we shouldn't fall back > to others due to indirect failure like lack of includes. > > Should we change configureLibrary (below) to "lock in" the library once > linking succeeds, then only iterate over includes? > I don't think this makes sense. A certain pair of library and include makes sense. Decoupling these invites all sorts of mismatches which would be hard to track down. I do not see what is wrong with the strategy above? Matt > It looks like we may need more ability to iterate over possible include > paths anyway, in which case maybe generateGuesses should be split into > one part that finds a library and another part that finds include paths? > > > > for location, directory, lib, incl in self.generateGuesses(): > if directory and not os.path.isdir(directory): > self.framework.logPrint('Directory does not exist: %s (while > checking "%s" for "%r")' % (directory,location,lib)) > continue > if lib == '': lib = [] > elif not isinstance(lib, list): lib = [lib] > if incl == '': incl = [] > elif not isinstance(incl, list): incl = [incl] > testedincl = list(incl) > # weed out duplicates when adding fincs > for loc in self.compilers.fincs: > if not loc in incl: > incl.append(loc) > if self.functions: > self.framework.logPrint('Checking for library in '+location+': > '+str(lib)) > if directory: self.framework.logPrint('Contents: > '+str(os.listdir(directory))) > else: > self.framework.logPrint('Not checking for library in '+location+': > '+str(lib)+' because no functions given to check for') > if self.executeTest(self.libraries.check,[lib, > self.functions],{'otherLibs' : libs, 'fortranMangle' : > self.functionsFortran, 'cxxMangle' : self.functionsCxx[0], 'prototype' : > self.functionsCxx[1], 'call' : self.functionsCxx[2], 'cxxLink': self.cxx}): > self.lib = lib > self.framework.logPrint('Checking for headers '+location+': > '+str(incl)) > if (not self.includes) or self.checkInclude(incl, self.includes, > incls, timeout = 1800.0): > if self.includes: > self.include = testedincl > self.found = 1 > self.dlib = self.lib+libs > if not hasattr(self.framework, 'packages'): > self.framework.packages = [] > self.directory = directory > self.framework.packages.append(self) > return > if not self.lookforbydefault: > raise RuntimeError('Could not find a functional '+self.name+'\n') > -- What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead. -- Norbert Wiener
