[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