[petsc-dev] BuildSystem: how to prevent 'make clean' before 'make'

Blaise A Bourdin bourdin at lsu.edu
Wed Nov 29 17:45:01 CST 2017


Unfortunately, the weakest assumption is that each package’s build system is not screwed up… 

Blaise


> On Nov 29, 2017, at 5:40 PM, Satish Balay <balay at mcs.anl.gov> wrote:
> 
> Sure - there are lots of assumptions in GNUPackage and CMAKEPackage
> [they assume most packages behave similarly wrt these types of builds]
> 
> And one can also override these default routines provided.
> 
> Some pacakges might provide a different 'clean' target. And some might prefer
> VPATH? builds? [i.e mkdir objdir && cd objdir && ../configure && make]. 
> 
> The CMAKE packages default to this mode. Perhaps we need to add this for gnupackages aswell..
> 
> Satish
> 
> On Wed, 29 Nov 2017, Blaise A Bourdin wrote:
> 
>> Thanks.
>> 
>> I understand that it is not optimal. But OTOH, you are also assuming that make clean does what it is supposed to do…
>> 
>> Blaise
>> 
>> 
>>> On Nov 29, 2017, at 5:29 PM, Satish Balay <balay at mcs.anl.gov> wrote:
>>> 
>>> Right now there is no provision for this. The following can add it.
>>> 
>>> 
>>>>>>>>>>> 
>>> $ git diff
>>> diff --git a/config/BuildSystem/config/package.py b/config/BuildSystem/config/package.py
>>> index 14de19502b..f9a2e68a25 100644
>>> --- a/config/BuildSystem/config/package.py
>>> +++ b/config/BuildSystem/config/package.py
>>> @@ -80,6 +80,7 @@ class Package(config.base.Configure):
>>>    self.makerulename           = '' # some packages do too many things with the make stage; this allows a package to limit to, for example, just building the libraries
>>>    self.installedpetsc         = 0
>>>    self.installwithbatch       = 0  # install the package even though configure is running in the initial batch mode; f2blaslapack and fblaslapack for example
>>> +    self.skipcleanbeforebuild   = 0  # skip running 'make clean' before starting a fresh build of a package
>>>    return
>>> 
>>>  def __str__(self):
>>> @@ -1322,7 +1323,8 @@ class GNUPackage(Package):
>>>      if self.parallelMake: pmake = self.make.make_jnp+' '+self.makerulename+' '
>>>      else: pmake = self.make.make+' '+self.makerulename+' '
>>> 
>>> -      output2,err2,ret2  = config.base.Configure.executeShellCommand('cd '+self.packageDir+' && '+self.make.make+' clean', timeout=200, log = self.log)
>>> +      if not self.skipcleanbeforebuild:
>>> +        output2,err2,ret2  = config.base.Configure.executeShellCommand('cd '+self.packageDir+' && '+self.make.make+' clean', timeout=200, log = self.log)
>>>      output3,err3,ret3  = config.base.Configure.executeShellCommand('cd '+self.packageDir+' && '+pmake, timeout=6000, log = self.log)
>>>      self.logPrintBox('Running make install on '+self.PACKAGE+'; this may take several minutes')
>>>      self.installDirProvider.printSudoPasswordMessage(self.installSudo)
>>> <<<<<<<<
>>> 
>>> But then - a dirty build dir might break subsequent builds with the same PETSC_ARCH [usually triggered when configure options change]
>>> 
>>> Satish
>>> 
>>> On Wed, 29 Nov 2017, Blaise A Bourdin wrote:
>>> 
>>>> Hi,
>>>> 
>>>> I am trying to get BuildSystem to build pnetcdf (parallel netcdf automatically).
>>>> The build process is very straightforward (configure; make; make install)
>>>> Looking at other packages, I came up with the following for $PETSC_DIR/config/BuildSystem/config/packages/pnetcdf.py
>>>> 
>>>> import config.package
>>>> import os
>>>> 
>>>> class Configure(config.package.GNUPackage):
>>>> def __init__(self, framework):
>>>>   config.package.Package.__init__(self, framework)
>>>>   self.download          = ['http://cucis.ece.northwestern.edu/projects/PnetCDF/Release/parallel-netcdf-1.8.1.tar.gz']
>>>>   self.functions         = ['ncmpi_create']
>>>>   self.includes          = ['pnetcdf.h']
>>>>   self.liblist           = [['libpnetcdf.a']]
>>>>   self.downloaddirnames  = ['parallel-netcdf-1.8.1']
>>>>   return
>>>> 
>>>> def setupDependencies(self, framework):
>>>>   config.package.GNUPackage.setupDependencies(self, framework)
>>>>   self.mpi   = framework.require('config.packages.MPI', self)
>>>>   self.deps  = [self.mpi]
>>>>   return
>>>> 
>>>> def formGNUConfigureArgs(self):
>>>>   args = config.package.GNUPackage.formGNUConfigureArgs(self)
>>>>   args.append('LIBS="'+self.compilers.LIBS+'"')
>>>>   return args
>>>> 
>>>> 
>>>> Looking at configure.log, it looks like BuildSystem does a make clean between configure and make
>>>> Unfortunately, there must be something wrong with the parallel-netcdf makefile, as make clean erases some of the files generated by pkgconfig (?), so that make install later fails...
>>>> 
>>>> Is there an easy way to skip the 'make clean' step? 
>>>> 
>>>> Blaise
>>>> 
>>>> 
>>>> 
>>>> 
>>> 
>> 
>> 

-- 
Department of Mathematics and Center for Computation & Technology
Louisiana State University, Baton Rouge, LA 70803, USA
Tel. +1 (225) 578 1612, Fax  +1 (225) 578 4276 http://www.math.lsu.edu/~bourdin









More information about the petsc-dev mailing list