[petsc-dev] configure: generating guesses from liblist and includes

Jed Brown jedbrown at mcs.anl.gov
Thu May 16 11:22:46 CDT 2013


Satish Balay <balay at mcs.anl.gov> 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?

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')



More information about the petsc-dev mailing list