xref: /petsc/config/configure.py (revision 4564aff79bd561daa559abd5da4fb071d674793d)
15d5a5a7bSMatthew Knepley#!/usr/bin/env python
25d5a5a7bSMatthew Knepleyimport os
35d5a5a7bSMatthew Knepleyimport sys
44f8a5b45SBarry Smithimport commands
5a1eda5bfSSatish Balay# to load ~/.pythonrc.py before inserting correct BuildSystem to path
6a1eda5bfSSatish Balayimport user
77c9abfe7SSatish BalayextraLogs = []
8b0b472b0SSatish Balaypetsc_arch = ''
94b8aa89bSBarry Smith
1044b0d7f9SSatish Balay# Use en_US as language so that BuildSystem parses compiler messages in english
119b436e4bSSatish Balayif 'LC_LOCAL' in os.environ and os.environ['LC_LOCAL'] != '' and os.environ['LC_LOCAL'] != 'en_US' and os.environ['LC_LOCAL']!= 'en_US.UTF-8': os.environ['LC_LOCAL'] = 'en_US.UTF-8'
129b436e4bSSatish Balayif 'LANG' in os.environ and os.environ['LANG'] != '' and os.environ['LANG'] != 'en_US' and os.environ['LANG'] != 'en_US.UTF-8': os.environ['LANG'] = 'en_US.UTF-8'
1344b0d7f9SSatish Balay
14378f148eSBarry Smithif not hasattr(sys, 'version_info') or not sys.version_info[1] >= 2 or not sys.version_info[0] >= 2:
15495ffa62SBarry Smith  print '**** You must have Python version 2.2 or higher to run config/configure.py ******'
16495ffa62SBarry Smith  print '*           Python is easy to install for end users or sys-admin.               *'
1732077d6dSBarry Smith  print '*                   http://www.python.org/download/                             *'
1832077d6dSBarry Smith  print '*                                                                               *'
19495ffa62SBarry Smith  print '*            You CANNOT configure PETSc without Python                          *'
20495ffa62SBarry Smith  print '*    http://www.mcs.anl.gov/petsc/petsc-as/documentation/installation.html      *'
2132077d6dSBarry Smith  print '*********************************************************************************'
22b26a8723SBarry Smith  sys.exit(4)
232fb34ac0SMatthew Knepley
2459e9bfd6SSatish Balaydef check_petsc_arch(opts):
25c43ea0feSSatish Balay  # If PETSC_ARCH not specified - use script name (if not configure.py)
26b0b472b0SSatish Balay  global petsc_arch
27c43ea0feSSatish Balay  found = 0
2859e9bfd6SSatish Balay  for name in opts:
29c43ea0feSSatish Balay    if name.find('PETSC_ARCH=') >= 0:
30b0b472b0SSatish Balay      petsc_arch=name.split('=')[1]
31c43ea0feSSatish Balay      found = 1
3259e9bfd6SSatish Balay      break
3359e9bfd6SSatish Balay  # If not yet specified - use the filename of script
34c43ea0feSSatish Balay  if not found:
3559e9bfd6SSatish Balay      filename = os.path.basename(sys.argv[0])
367eed1879SBarry Smith      if not filename.startswith('configure') and not filename.startswith('reconfigure'):
37b0b472b0SSatish Balay        petsc_arch=os.path.splitext(os.path.basename(sys.argv[0]))[0]
38b0b472b0SSatish Balay        useName = 'PETSC_ARCH='+petsc_arch
3959e9bfd6SSatish Balay        opts.append(useName)
401937db7aSSatish Balay  return 0
414b8aa89bSBarry Smith
4285ef4d1eSSatish Balaydef chkbrokencygwin():
439dabcff0SSatish Balay  if os.path.exists('/usr/bin/cygcheck.exe'):
449dabcff0SSatish Balay    buf = os.popen('/usr/bin/cygcheck.exe -c cygwin').read()
459dabcff0SSatish Balay    if buf.find('1.5.11-1') > -1:
461937db7aSSatish Balay      print '================================================================================='
471937db7aSSatish Balay      print ' *** cygwin-1.5.11-1 detected. config/configure.py fails with this version   ***'
481937db7aSSatish Balay      print ' *** Please upgrade to cygwin-1.5.12-1 or newer version. This can  ***'
491937db7aSSatish Balay      print ' *** be done by running cygwin-setup, selecting "next" all the way.***'
501937db7aSSatish Balay      print '================================================================================='
511937db7aSSatish Balay      sys.exit(3)
529dabcff0SSatish Balay  return 0
539dabcff0SSatish Balay
5485ef4d1eSSatish Balaydef chkusingwindowspython():
551937db7aSSatish Balay  if os.path.exists('/usr/bin/cygcheck.exe') and sys.platform != 'cygwin':
561937db7aSSatish Balay    print '================================================================================='
571937db7aSSatish Balay    print ' *** Non-cygwin python detected. Please rerun config/configure.py with cygwin-python ***'
581937db7aSSatish Balay    print '================================================================================='
591937db7aSSatish Balay    sys.exit(3)
6085ef4d1eSSatish Balay  return 0
6185ef4d1eSSatish Balay
6285ef4d1eSSatish Balaydef chkcygwinpythonver():
6371384062SSatish Balay  if os.path.exists('/usr/bin/cygcheck.exe'):
6471384062SSatish Balay    buf = os.popen('/usr/bin/cygcheck.exe -c python').read()
65c4b7e894SSatish Balay    if (buf.find('2.4') > -1) or (buf.find('2.5') > -1) or (buf.find('2.6') > -1):
661937db7aSSatish Balay      sys.argv.append('--useThreads=0')
671937db7aSSatish Balay      extraLogs.append('''\
681937db7aSSatish Balay================================================================================
691937db7aSSatish Balay** Cygwin-python-2.4/2.5 detected. Threads do not work correctly with this version *
701937db7aSSatish Balay ********* Disabling thread usage for this run of config/configure.py **********
711937db7aSSatish Balay================================================================================''')
7271384062SSatish Balay  return 0
7371384062SSatish Balay
741937db7aSSatish Balaydef chkrhl9():
751937db7aSSatish Balay  if os.path.exists('/etc/redhat-release'):
76836c2c52SSatish Balay    try:
77594eb360SSatish Balay      file = open('/etc/redhat-release','r')
78836c2c52SSatish Balay      buf = file.read()
79836c2c52SSatish Balay      file.close()
80836c2c52SSatish Balay    except:
81836c2c52SSatish Balay      # can't read file - assume dangerous RHL9
821937db7aSSatish Balay      buf = 'Shrike'
83836c2c52SSatish Balay    if buf.find('Shrike') > -1:
841937db7aSSatish Balay      sys.argv.append('--useThreads=0')
851937db7aSSatish Balay      extraLogs.append('''\
861937db7aSSatish Balay================================================================================
871937db7aSSatish Balay   *** RHL9 detected. Threads do not work correctly with this distribution ***
881937db7aSSatish Balay    ****** Disabling thread usage for this run of config/configure.py *******
891937db7aSSatish Balay================================================================================''')
90836c2c52SSatish Balay  return 0
91836c2c52SSatish Balay
92da58527dSSatish Balaydef check_broken_configure_log_links():
93da58527dSSatish Balay  '''Sometime symlinks can get broken if the original files are deleted. Delete such broken links'''
94da58527dSSatish Balay  import os
95da58527dSSatish Balay  for logfile in ['configure.log','configure.log.bkp']:
96da58527dSSatish Balay    if os.path.islink(logfile) and not os.path.isfile(logfile): os.remove(logfile)
97da58527dSSatish Balay  return
98da58527dSSatish Balay
99da1d79b4SSatish Balaydef move_configure_log(framework):
100da1d79b4SSatish Balay  '''Move configure.log to PETSC_ARCH/conf - and update configure.log.bkp in both locations appropriately'''
101b0b472b0SSatish Balay  global petsc_arch
102b0b472b0SSatish Balay
103b0b472b0SSatish Balay  if hasattr(framework,'arch'): petsc_arch = framework.arch
104b0b472b0SSatish Balay  if hasattr(framework,'logName'): curr_file = framework.logName
105b0b472b0SSatish Balay  else: curr_file = 'configure.log'
106b0b472b0SSatish Balay
107b0b472b0SSatish Balay  if petsc_arch:
108da1d79b4SSatish Balay    import shutil
109da1d79b4SSatish Balay    import os
110b0b472b0SSatish Balay
111b0b472b0SSatish Balay    # Just in case - confdir is not created
112b0b472b0SSatish Balay    conf_dir = os.path.join(petsc_arch,'conf')
113b0b472b0SSatish Balay    if not os.path.isdir(petsc_arch): os.mkdir(petsc_arch)
114b0b472b0SSatish Balay    if not os.path.isdir(conf_dir): os.mkdir(conf_dir)
115b0b472b0SSatish Balay
116da1d79b4SSatish Balay    curr_bkp  = curr_file + '.bkp'
117b0b472b0SSatish Balay    new_file  = os.path.join(conf_dir,curr_file)
118da1d79b4SSatish Balay    new_bkp   = new_file + '.bkp'
119da1d79b4SSatish Balay
120da1d79b4SSatish Balay    # Keep backup in $PETSC_ARCH/conf location
121da1d79b4SSatish Balay    if os.path.isfile(new_bkp): os.remove(new_bkp)
122da1d79b4SSatish Balay    if os.path.isfile(new_file): os.rename(new_file,new_bkp)
123da58527dSSatish Balay    if os.path.isfile(curr_file): shutil.move(curr_file,new_file)
124da58527dSSatish Balay    if os.path.isfile(new_file): os.symlink(new_file,curr_file)
125da1d79b4SSatish Balay    # If the old bkp is using the same PETSC_ARCH/conf - then update bkp link
126da1d79b4SSatish Balay    if os.path.realpath(curr_bkp) == os.path.realpath(new_file):
127da58527dSSatish Balay      if os.path.isfile(curr_bkp): os.remove(curr_bkp)
128da58527dSSatish Balay      if os.path.isfile(new_bkp): os.symlink(new_bkp,curr_bkp)
129da1d79b4SSatish Balay  return
130da1d79b4SSatish Balay
1315d5a5a7bSMatthew Knepleydef petsc_configure(configure_options):
13259e9bfd6SSatish Balay  print '================================================================================='
13359e9bfd6SSatish Balay  print '             Configuring PETSc to compile on your system                         '
13459e9bfd6SSatish Balay  print '================================================================================='
13559e9bfd6SSatish Balay
136c43ea0feSSatish Balay  # Command line arguments take precedence (but don't destroy argv[0])
137c43ea0feSSatish Balay  sys.argv = sys.argv[:1] + configure_options + sys.argv[1:]
13859e9bfd6SSatish Balay  # check PETSC_ARCH
13959e9bfd6SSatish Balay  check_petsc_arch(sys.argv)
140da58527dSSatish Balay  check_broken_configure_log_links()
1415fb2c094SBarry Smith
142c22cdea9SBarry Smith  # support a few standard configure option types
143ed6a7445SBarry Smith  for l in range(0,len(sys.argv)):
144c22cdea9SBarry Smith    name = sys.argv[l]
145637cc2ebSSatish Balay    if name.find('enable-') >= 0:
146193cd51eSMatthew Knepley      if name.find('=') == -1:
147193cd51eSMatthew Knepley        sys.argv[l] = name.replace('enable-','with-')+'=1'
148193cd51eSMatthew Knepley      else:
149193cd51eSMatthew Knepley        head, tail = name.split('=', 1)
150193cd51eSMatthew Knepley        sys.argv[l] = head.replace('enable-','with-')+'='+tail
151637cc2ebSSatish Balay    if name.find('disable-') >= 0:
152193cd51eSMatthew Knepley      if name.find('=') == -1:
153193cd51eSMatthew Knepley        sys.argv[l] = name.replace('disable-','with-')+'=0'
154193cd51eSMatthew Knepley      else:
155193cd51eSMatthew Knepley        head, tail = name.split('=', 1)
156193cd51eSMatthew Knepley        if tail == '1': tail = '0'
157193cd51eSMatthew Knepley        sys.argv[l] = head.replace('disable-','with-')+'='+tail
158637cc2ebSSatish Balay    if name.find('without-') >= 0:
159193cd51eSMatthew Knepley      if name.find('=') == -1:
160193cd51eSMatthew Knepley        sys.argv[l] = name.replace('without-','with-')+'=0'
161193cd51eSMatthew Knepley      else:
162193cd51eSMatthew Knepley        head, tail = name.split('=', 1)
163193cd51eSMatthew Knepley        if tail == '1': tail = '0'
164193cd51eSMatthew Knepley        sys.argv[l] = head.replace('without-','with-')+'='+tail
165adc3e427SMatthew Knepley
1669dabcff0SSatish Balay  # Check for broken cygwin
1671937db7aSSatish Balay  chkbrokencygwin()
168d65f3bddSMatthew Knepley  # Disable threads on RHL9
1691937db7aSSatish Balay  chkrhl9()
17085ef4d1eSSatish Balay  # Make sure cygwin-python is used on windows
1711937db7aSSatish Balay  chkusingwindowspython()
17285ef4d1eSSatish Balay  # Threads don't work for cygwin & python-2.4, 2.5 etc..
1731937db7aSSatish Balay  chkcygwinpythonver()
1749dabcff0SSatish Balay
17587282423SMatthew Knepley  # Should be run from the toplevel
176dbca6d9dSSatish Balay  configDir = os.path.abspath('config')
177f8833479SBarry Smith  bsDir     = os.path.join(configDir, 'BuildSystem')
178f8833479SBarry Smith  if not os.path.isdir(configDir):
1795d5a5a7bSMatthew Knepley    raise RuntimeError('Run configure from $PETSC_DIR, not '+os.path.abspath('.'))
18087282423SMatthew Knepley  if not os.path.isdir(bsDir):
181ec1ee742SBarry Smith    print '================================================================================='
182dbca6d9dSSatish Balay    print '''++ Could not locate BuildSystem in %s.''' % configDir
183*4564aff7SMatthew Knepley    print '''++ Downloading it using "hg clone http://hg.mcs.anl.gov/petsc/BuildSystem %s"''' % bsDir
184ec1ee742SBarry Smith    print '================================================================================='
185*4564aff7SMatthew Knepley    (status,output) = commands.getstatusoutput('hg clone http://petsc.cs.iit.edu/petsc/BuildSystem '+ bsDir)
1867d7624c9SBarry Smith    if status:
1877d7624c9SBarry Smith      if output.find('ommand not found') >= 0:
188ec1ee742SBarry Smith        print '================================================================================='
18959dc5438SMatthew Knepley        print '''** Unable to locate hg (Mercurial) to download BuildSystem; make sure hg is in your path'''
190ab21cac3SMatthew Knepley        print '''** or manually copy BuildSystem to $PETSC_DIR/config/BuildSystem from a machine where'''
19159dc5438SMatthew Knepley        print '''** you do have hg installed and can clone BuildSystem. '''
192ec1ee742SBarry Smith        print '================================================================================='
1937d7624c9SBarry Smith      elif output.find('Cannot resolve host') >= 0:
194ec1ee742SBarry Smith        print '================================================================================='
195d688700cSSatish Balay        print '''** Unable to download BuildSystem. You must be off the network.'''
196d688700cSSatish Balay        print '''** Connect to the internet and run config/configure.py again.'''
197ec1ee742SBarry Smith        print '================================================================================='
1987d7624c9SBarry Smith      else:
199ec1ee742SBarry Smith        print '================================================================================='
200d688700cSSatish Balay        print '''** Unable to download BuildSystem. Please send this message to petsc-maint@mcs.anl.gov'''
201ec1ee742SBarry Smith        print '================================================================================='
2027d7624c9SBarry Smith      print output
20387282423SMatthew Knepley      sys.exit(3)
2044f8a5b45SBarry Smith
20587282423SMatthew Knepley  sys.path.insert(0, bsDir)
206f8833479SBarry Smith  sys.path.insert(0, configDir)
207e69ef9dfSMatthew Knepley  import config.base
2085d5a5a7bSMatthew Knepley  import config.framework
209f56be888SMatthew Knepley  import cPickle
2104f8a5b45SBarry Smith
2112e22a60eSMatthew Knepley  # Disable shared libraries by default
2122e22a60eSMatthew Knepley  import nargs
2132e22a60eSMatthew Knepley  if nargs.Arg.findArgument('with-shared', sys.argv[1:]) is None:
2142e22a60eSMatthew Knepley    sys.argv.append('--with-shared=0')
2152e22a60eSMatthew Knepley
2169dd2fdb1SMatthew Knepley  framework = None
2179dd2fdb1SMatthew Knepley  try:
2181a784507SMatthew Knepley    framework = config.framework.Framework(['--configModules=PETSc.Configure','--optionsModule=PETSc.compilerOptions']+sys.argv[1:], loadArgDB = 0)
219d65f3bddSMatthew Knepley    framework.setup()
220d65f3bddSMatthew Knepley    framework.logPrint('\n'.join(extraLogs))
221f24f64feSBarry Smith    framework.configure(out = sys.stdout)
222358ebc22SMatthew Knepley    framework.storeSubstitutions(framework.argDB)
223f56be888SMatthew Knepley    framework.argDB['configureCache'] = cPickle.dumps(framework)
2247cfd0b05SBarry Smith    import PETSc.packages
2257cfd0b05SBarry Smith    for i in framework.packages:
2267cfd0b05SBarry Smith      if hasattr(i,'postProcess'):
2277cfd0b05SBarry Smith        i.postProcess()
2287cfd0b05SBarry Smith    framework.logClear()
229eefa2c0fSBarry Smith    framework.closeLog()
230da1d79b4SSatish Balay    move_configure_log(framework)
231dd50d019SBarry Smith    return 0
232e69ef9dfSMatthew Knepley  except (RuntimeError, config.base.ConfigureSetupError), e:
2337d670a3cSBarry Smith    emsg = str(e)
23442351d26SSatish Balay    if not emsg.endswith('\n'): emsg = emsg+'\n'
235fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
236fe09c992SBarry Smith    +'         UNABLE to CONFIGURE with GIVEN OPTIONS    (see configure.log for details):\n' \
237fe09c992SBarry Smith    +'---------------------------------------------------------------------------------------\n'  \
2387d670a3cSBarry Smith    +emsg+'*********************************************************************************\n'
239e9f3bb17SBarry Smith    se = ''
2409dd2fdb1SMatthew Knepley  except (TypeError, ValueError), e:
2417d670a3cSBarry Smith    emsg = str(e)
24242351d26SSatish Balay    if not emsg.endswith('\n'): emsg = emsg+'\n'
243fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
244fe09c992SBarry Smith    +'                ERROR in COMMAND LINE ARGUMENT to config/configure.py \n' \
245fe09c992SBarry Smith    +'---------------------------------------------------------------------------------------\n'  \
2467d670a3cSBarry Smith    +emsg+'*********************************************************************************\n'
2471a02243aSBarry Smith    se = ''
24896dc2fe8SMatthew Knepley  except ImportError, e :
2497d670a3cSBarry Smith    emsg = str(e)
25042351d26SSatish Balay    if not emsg.endswith('\n'): emsg = emsg+'\n'
251fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
252fe09c992SBarry Smith    +'                     UNABLE to FIND MODULE for config/configure.py \n' \
253fe09c992SBarry Smith    +'---------------------------------------------------------------------------------------\n'  \
2547d670a3cSBarry Smith    +emsg+'*********************************************************************************\n'
25596dc2fe8SMatthew Knepley    se = ''
25601def6f0SMatthew Knepley  except OSError, e :
25701def6f0SMatthew Knepley    emsg = str(e)
25801def6f0SMatthew Knepley    if not emsg.endswith('\n'): emsg = emsg+'\n'
25901def6f0SMatthew Knepley    msg ='*********************************************************************************\n'\
26001def6f0SMatthew Knepley    +'                    UNABLE to EXECUTE BINARIES for config/configure.py \n' \
26101def6f0SMatthew Knepley    +'---------------------------------------------------------------------------------------\n'  \
26201def6f0SMatthew Knepley    +emsg+'*********************************************************************************\n'
26301def6f0SMatthew Knepley    se = ''
264d7d3c4beSMatthew Knepley  except SystemExit, e:
265d7d3c4beSMatthew Knepley    if e.code is None or e.code == 0:
266d7d3c4beSMatthew Knepley      return
267fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
268b1dada7fSMatthew Knepley    +'           CONFIGURATION FAILURE  (Please send configure.log to petsc-maint@mcs.anl.gov)\n' \
269fe09c992SBarry Smith    +'*********************************************************************************\n'
270d7d3c4beSMatthew Knepley    se  = str(e)
271e9f3bb17SBarry Smith  except Exception, e:
272fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
273fe09c992SBarry Smith    +'          CONFIGURATION CRASH  (Please send configure.log to petsc-maint@mcs.anl.gov)\n' \
274fe09c992SBarry Smith    +'*********************************************************************************\n'
275e9f3bb17SBarry Smith    se  = str(e)
276e9f3bb17SBarry Smith
277e9f3bb17SBarry Smith  print msg
2789dd2fdb1SMatthew Knepley  if not framework is None:
2799dd2fdb1SMatthew Knepley    framework.logClear()
280e9f3bb17SBarry Smith    if hasattr(framework, 'log'):
281f6614063SBarry Smith      import traceback
282b1dada7fSMatthew Knepley      try:
283f24f64feSBarry Smith        framework.log.write(msg+se)
284f24f64feSBarry Smith        traceback.print_tb(sys.exc_info()[2], file = framework.log)
285da1d79b4SSatish Balay        move_configure_log(framework)
286b1dada7fSMatthew Knepley      except:
287b1dada7fSMatthew Knepley        pass
288e9f3bb17SBarry Smith      sys.exit(1)
2895a74f024SMatthew Knepley  else:
2905a74f024SMatthew Knepley    print se
2915a74f024SMatthew Knepley    import traceback
2925a74f024SMatthew Knepley    traceback.print_tb(sys.exc_info()[2])
293da1d79b4SSatish Balay  move_configure_log(framework)
2945d5a5a7bSMatthew Knepley
2955d5a5a7bSMatthew Knepleyif __name__ == '__main__':
296a030c540SBarry Smith  petsc_configure([])
297759acf64SBarry Smith
298