xref: /petsc/config/configure.py (revision 85ef4d1e3e511eae7c11720e1708d24746707214)
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
75d5a5a7bSMatthew Knepley
84b8aa89bSBarry Smith
9378f148eSBarry Smithif not hasattr(sys, 'version_info') or not sys.version_info[1] >= 2 or not sys.version_info[0] >= 2:
10495ffa62SBarry Smith  print '**** You must have Python version 2.2 or higher to run config/configure.py ******'
11495ffa62SBarry Smith  print '*           Python is easy to install for end users or sys-admin.               *'
1232077d6dSBarry Smith  print '*                   http://www.python.org/download/                             *'
1332077d6dSBarry Smith  print '*                                                                               *'
14495ffa62SBarry Smith  print '*            You CANNOT configure PETSc without Python                          *'
15495ffa62SBarry Smith  print '*    http://www.mcs.anl.gov/petsc/petsc-as/documentation/installation.html      *'
1632077d6dSBarry Smith  print '*********************************************************************************'
17b26a8723SBarry Smith  sys.exit(4)
182fb34ac0SMatthew Knepley
1959e9bfd6SSatish Balaydef check_petsc_arch(opts):
20c43ea0feSSatish Balay  # If PETSC_ARCH not specified - use script name (if not configure.py)
21c43ea0feSSatish Balay  found = 0
2259e9bfd6SSatish Balay  for name in opts:
23c43ea0feSSatish Balay    if name.find('PETSC_ARCH=') >= 0:
24c43ea0feSSatish Balay      found = 1
2559e9bfd6SSatish Balay      break
2659e9bfd6SSatish Balay  # If not yet specified - use the filename of script
27c43ea0feSSatish Balay  if not found:
2859e9bfd6SSatish Balay      filename = os.path.basename(sys.argv[0])
297eed1879SBarry Smith      if not filename.startswith('configure') and not filename.startswith('reconfigure'):
30637cc2ebSSatish Balay        useName = 'PETSC_ARCH='+os.path.splitext(os.path.basename(sys.argv[0]))[0]
3159e9bfd6SSatish Balay        opts.append(useName)
3259e9bfd6SSatish Balay  return
334b8aa89bSBarry Smith
34*85ef4d1eSSatish Balaydef chkbrokencygwin():
359dabcff0SSatish Balay  if os.path.exists('/usr/bin/cygcheck.exe'):
369dabcff0SSatish Balay    buf = os.popen('/usr/bin/cygcheck.exe -c cygwin').read()
379dabcff0SSatish Balay    if buf.find('1.5.11-1') > -1:
389dabcff0SSatish Balay      return 1
399dabcff0SSatish Balay    else:
409dabcff0SSatish Balay      return 0
419dabcff0SSatish Balay  return 0
429dabcff0SSatish Balay
43*85ef4d1eSSatish Balaydef chkusingwindowspython():
44*85ef4d1eSSatish Balay  if os.path.exists('/usr/bin/cygcheck.exe'):
45*85ef4d1eSSatish Balay    if sys.platform != 'cygwin':
46*85ef4d1eSSatish Balay      return 1
47*85ef4d1eSSatish Balay  return 0
48*85ef4d1eSSatish Balay
49*85ef4d1eSSatish Balaydef chkcygwinpythonver():
5071384062SSatish Balay  if os.path.exists('/usr/bin/cygcheck.exe'):
5171384062SSatish Balay    buf = os.popen('/usr/bin/cygcheck.exe -c python').read()
52c4b7e894SSatish Balay    if (buf.find('2.4') > -1) or (buf.find('2.5') > -1) or (buf.find('2.6') > -1):
5371384062SSatish Balay      return 1
5471384062SSatish Balay    else:
5571384062SSatish Balay      return 0
5671384062SSatish Balay  return 0
5771384062SSatish Balay
58836c2c52SSatish Balaydef rhl9():
59836c2c52SSatish Balay  try:
60594eb360SSatish Balay    file = open('/etc/redhat-release','r')
61836c2c52SSatish Balay  except:
62836c2c52SSatish Balay    return 0
63836c2c52SSatish Balay  try:
64836c2c52SSatish Balay    buf = file.read()
65836c2c52SSatish Balay    file.close()
66836c2c52SSatish Balay  except:
67836c2c52SSatish Balay    # can't read file - assume dangerous RHL9
68836c2c52SSatish Balay    return 1
69836c2c52SSatish Balay  if buf.find('Shrike') > -1:
70836c2c52SSatish Balay    return 1
71836c2c52SSatish Balay  else:
72836c2c52SSatish Balay    return 0
73836c2c52SSatish Balay
745d5a5a7bSMatthew Knepleydef petsc_configure(configure_options):
7559e9bfd6SSatish Balay  print '================================================================================='
7659e9bfd6SSatish Balay  print '             Configuring PETSc to compile on your system                         '
7759e9bfd6SSatish Balay  print '================================================================================='
7859e9bfd6SSatish Balay
79c43ea0feSSatish Balay  # Command line arguments take precedence (but don't destroy argv[0])
80c43ea0feSSatish Balay  sys.argv = sys.argv[:1] + configure_options + sys.argv[1:]
8159e9bfd6SSatish Balay  # check PETSC_ARCH
8259e9bfd6SSatish Balay  check_petsc_arch(sys.argv)
83d65f3bddSMatthew Knepley  extraLogs = []
845fb2c094SBarry Smith
85c22cdea9SBarry Smith  # support a few standard configure option types
86ed6a7445SBarry Smith  for l in range(0,len(sys.argv)):
87c22cdea9SBarry Smith    name = sys.argv[l]
88637cc2ebSSatish Balay    if name.find('enable-') >= 0:
89637cc2ebSSatish Balay      sys.argv[l] = name.replace('enable-','with-')
9042351d26SSatish Balay      if name.find('=') == -1: sys.argv[l] = sys.argv[l]+'=1'
91637cc2ebSSatish Balay    if name.find('disable-') >= 0:
92637cc2ebSSatish Balay      sys.argv[l] = name.replace('disable-','with-')
9342351d26SSatish Balay      if name.find('=') == -1: sys.argv[l] = sys.argv[l]+'=0'
94c22cdea9SBarry Smith      elif name.endswith('=1'): sys.argv[l].replace('=1','=0')
95637cc2ebSSatish Balay    if name.find('without-') >= 0:
96637cc2ebSSatish Balay      sys.argv[l] = name.replace('without-','with-')
9742351d26SSatish Balay      if name.find('=') == -1: sys.argv[l] = sys.argv[l]+'=0'
98c22cdea9SBarry Smith      elif name.endswith('=1'): sys.argv[l].replace('=1','=0')
99c22cdea9SBarry Smith
100adc3e427SMatthew Knepley  # Check for sudo
101adc3e427SMatthew Knepley  if os.getuid() == 0:
102adc3e427SMatthew Knepley    print '================================================================================='
103adc3e427SMatthew Knepley    print '             *** Do not run configure as root, or using sudo. ***'
10467e28bfeSBarry Smith    print '             *** Use the --with-sudo=sudo option to have      ***'
10567e28bfeSBarry Smith    print '             *** installs of external packages done with sudo ***'
10667e28bfeSBarry Smith    print '             *** use only with --prefix= when installing in   ***'
10767e28bfeSBarry Smith    print '             *** system directories                           ***'
108adc3e427SMatthew Knepley    print '================================================================================='
109adc3e427SMatthew Knepley    sys.exit(3)
110adc3e427SMatthew Knepley
1119dabcff0SSatish Balay  # Check for broken cygwin
112*85ef4d1eSSatish Balay  if chkbrokencygwin():
113ec1ee742SBarry Smith    print '================================================================================='
1147d670a3cSBarry Smith    print ' *** cygwin-1.5.11-1 detected. config/configure.py fails with this version   ***'
1151e42869aSSatish Balay    print ' *** Please upgrade to cygwin-1.5.12-1 or newer version. This can  ***'
1161e42869aSSatish Balay    print ' *** be done by running cygwin-setup, selecting "next" all the way.***'
117ec1ee742SBarry Smith    print '================================================================================='
1189dabcff0SSatish Balay    sys.exit(3)
119d65f3bddSMatthew Knepley
120d65f3bddSMatthew Knepley  # Disable threads on RHL9
121d65f3bddSMatthew Knepley  if rhl9():
122d65f3bddSMatthew Knepley    sys.argv.append('--useThreads=0')
123d65f3bddSMatthew Knepley    extraLogs.append('''\
124d65f3bddSMatthew Knepley================================================================================
125d65f3bddSMatthew Knepley   *** RHL9 detected. Threads do not work correctly with this distribution ***
126d65f3bddSMatthew Knepley    ****** Disabling thread usage for this run of config/configure.py *******
127d65f3bddSMatthew Knepley================================================================================''')
128*85ef4d1eSSatish Balay  # Make sure cygwin-python is used on windows
129*85ef4d1eSSatish Balay  if chkusingwindowspython():
130*85ef4d1eSSatish Balay    print '================================================================================='
131*85ef4d1eSSatish Balay    print ' *** Non-cygwin python detected. Please rerun config/configure.py with cygwin-python ***'
132*85ef4d1eSSatish Balay    print '================================================================================='
133*85ef4d1eSSatish Balay    sys.exit(3)
134d65f3bddSMatthew Knepley
135*85ef4d1eSSatish Balay  # Threads don't work for cygwin & python-2.4, 2.5 etc..
136*85ef4d1eSSatish Balay  if chkcygwinpythonver():
13771384062SSatish Balay    sys.argv.append('--useThreads=0')
138d65f3bddSMatthew Knepley    extraLogs.append('''\
139d65f3bddSMatthew Knepley================================================================================
140*85ef4d1eSSatish Balay** Cygwin-python-2.4/2.5 detected. Threads do not work correctly with this version *
141d65f3bddSMatthew Knepley ********* Disabling thread usage for this run of config/configure.py **********
142d65f3bddSMatthew Knepley================================================================================''')
1439dabcff0SSatish Balay
14487282423SMatthew Knepley  # Should be run from the toplevel
1455d5a5a7bSMatthew Knepley  pythonDir = os.path.abspath(os.path.join('python'))
14687282423SMatthew Knepley  bsDir     = os.path.join(pythonDir, 'BuildSystem')
14787282423SMatthew Knepley  if not os.path.isdir(pythonDir):
1485d5a5a7bSMatthew Knepley    raise RuntimeError('Run configure from $PETSC_DIR, not '+os.path.abspath('.'))
14987282423SMatthew Knepley  if not os.path.isdir(bsDir):
150ec1ee742SBarry Smith    print '================================================================================='
1519c4310d5SMatthew Knepley    print '''++ Could not locate BuildSystem in %s/python.''' % os.getcwd()
152ec1ef0a0SSatish Balay    print '''++ Downloading it using "hg clone http://hg.mcs.anl.gov/petsc/BuildSystem %s/python/BuildSystem"''' % os.getcwd()
153ec1ee742SBarry Smith    print '================================================================================='
154ec1ef0a0SSatish Balay    (status,output) = commands.getstatusoutput('hg clone http://hg.mcs.anl.gov/petsc/BuildSystem python/BuildSystem')
1557d7624c9SBarry Smith    if status:
1567d7624c9SBarry Smith      if output.find('ommand not found') >= 0:
157ec1ee742SBarry Smith        print '================================================================================='
15859dc5438SMatthew Knepley        print '''** Unable to locate hg (Mercurial) to download BuildSystem; make sure hg is in your path'''
159d688700cSSatish Balay        print '''** or manually copy BuildSystem to $PETSC_DIR/python/BuildSystem from a machine where'''
16059dc5438SMatthew Knepley        print '''** you do have hg installed and can clone BuildSystem. '''
161ec1ee742SBarry Smith        print '================================================================================='
1627d7624c9SBarry Smith      elif output.find('Cannot resolve host') >= 0:
163ec1ee742SBarry Smith        print '================================================================================='
164d688700cSSatish Balay        print '''** Unable to download BuildSystem. You must be off the network.'''
165d688700cSSatish Balay        print '''** Connect to the internet and run config/configure.py again.'''
166ec1ee742SBarry Smith        print '================================================================================='
1677d7624c9SBarry Smith      else:
168ec1ee742SBarry Smith        print '================================================================================='
169d688700cSSatish Balay        print '''** Unable to download BuildSystem. Please send this message to petsc-maint@mcs.anl.gov'''
170ec1ee742SBarry Smith        print '================================================================================='
1717d7624c9SBarry Smith      print output
17287282423SMatthew Knepley      sys.exit(3)
1734f8a5b45SBarry Smith
17487282423SMatthew Knepley  sys.path.insert(0, bsDir)
1755d5a5a7bSMatthew Knepley  sys.path.insert(0, pythonDir)
176e69ef9dfSMatthew Knepley  import config.base
1775d5a5a7bSMatthew Knepley  import config.framework
178f56be888SMatthew Knepley  import cPickle
1794f8a5b45SBarry Smith
1802e22a60eSMatthew Knepley  # Disable shared libraries by default
1812e22a60eSMatthew Knepley  import nargs
1822e22a60eSMatthew Knepley  if nargs.Arg.findArgument('with-shared', sys.argv[1:]) is None:
1832e22a60eSMatthew Knepley    sys.argv.append('--with-shared=0')
1842e22a60eSMatthew Knepley
1859dd2fdb1SMatthew Knepley  framework = None
1869dd2fdb1SMatthew Knepley  try:
187637cc2ebSSatish Balay    framework = config.framework.Framework(sys.argv[1:]+['--configModules=PETSc.Configure','--optionsModule=PETSc.compilerOptions'], loadArgDB = 0)
188d65f3bddSMatthew Knepley    framework.setup()
189d65f3bddSMatthew Knepley    framework.logPrint('\n'.join(extraLogs))
190f24f64feSBarry Smith    framework.configure(out = sys.stdout)
191358ebc22SMatthew Knepley    framework.storeSubstitutions(framework.argDB)
192f56be888SMatthew Knepley    framework.argDB['configureCache'] = cPickle.dumps(framework)
1937cfd0b05SBarry Smith    import PETSc.packages
1947cfd0b05SBarry Smith    for i in framework.packages:
1957cfd0b05SBarry Smith      if hasattr(i,'postProcess'):
1967cfd0b05SBarry Smith        i.postProcess()
1977cfd0b05SBarry Smith    framework.logClear()
198dd50d019SBarry Smith    return 0
199e69ef9dfSMatthew Knepley  except (RuntimeError, config.base.ConfigureSetupError), e:
2007d670a3cSBarry Smith    emsg = str(e)
20142351d26SSatish Balay    if not emsg.endswith('\n'): emsg = emsg+'\n'
202fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
203fe09c992SBarry Smith    +'         UNABLE to CONFIGURE with GIVEN OPTIONS    (see configure.log for details):\n' \
204fe09c992SBarry Smith    +'---------------------------------------------------------------------------------------\n'  \
2057d670a3cSBarry Smith    +emsg+'*********************************************************************************\n'
206e9f3bb17SBarry Smith    se = ''
2079dd2fdb1SMatthew Knepley  except (TypeError, ValueError), e:
2087d670a3cSBarry Smith    emsg = str(e)
20942351d26SSatish Balay    if not emsg.endswith('\n'): emsg = emsg+'\n'
210fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
211fe09c992SBarry Smith    +'                ERROR in COMMAND LINE ARGUMENT to config/configure.py \n' \
212fe09c992SBarry Smith    +'---------------------------------------------------------------------------------------\n'  \
2137d670a3cSBarry Smith    +emsg+'*********************************************************************************\n'
2141a02243aSBarry Smith    se = ''
21596dc2fe8SMatthew Knepley  except ImportError, e :
2167d670a3cSBarry Smith    emsg = str(e)
21742351d26SSatish Balay    if not emsg.endswith('\n'): emsg = emsg+'\n'
218fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
219fe09c992SBarry Smith    +'                     UNABLE to FIND MODULE for config/configure.py \n' \
220fe09c992SBarry Smith    +'---------------------------------------------------------------------------------------\n'  \
2217d670a3cSBarry Smith    +emsg+'*********************************************************************************\n'
22296dc2fe8SMatthew Knepley    se = ''
22301def6f0SMatthew Knepley  except OSError, e :
22401def6f0SMatthew Knepley    emsg = str(e)
22501def6f0SMatthew Knepley    if not emsg.endswith('\n'): emsg = emsg+'\n'
22601def6f0SMatthew Knepley    msg ='*********************************************************************************\n'\
22701def6f0SMatthew Knepley    +'                    UNABLE to EXECUTE BINARIES for config/configure.py \n' \
22801def6f0SMatthew Knepley    +'---------------------------------------------------------------------------------------\n'  \
22901def6f0SMatthew Knepley    +emsg+'*********************************************************************************\n'
23001def6f0SMatthew Knepley    se = ''
231d7d3c4beSMatthew Knepley  except SystemExit, e:
232d7d3c4beSMatthew Knepley    if e.code is None or e.code == 0:
233d7d3c4beSMatthew Knepley      return
234fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
235fe09c992SBarry Smith    +'           CONFIGURATION CRASH  (Please send configure.log to petsc-maint@mcs.anl.gov)\n' \
236fe09c992SBarry Smith    +'*********************************************************************************\n'
237d7d3c4beSMatthew Knepley    se  = str(e)
238e9f3bb17SBarry Smith  except Exception, e:
239fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
240fe09c992SBarry Smith    +'          CONFIGURATION CRASH  (Please send configure.log to petsc-maint@mcs.anl.gov)\n' \
241fe09c992SBarry Smith    +'*********************************************************************************\n'
242e9f3bb17SBarry Smith    se  = str(e)
243e9f3bb17SBarry Smith
244e9f3bb17SBarry Smith  print msg
2459dd2fdb1SMatthew Knepley  if not framework is None:
2469dd2fdb1SMatthew Knepley    framework.logClear()
247e9f3bb17SBarry Smith    if hasattr(framework, 'log'):
248f6614063SBarry Smith      import traceback
249f24f64feSBarry Smith      framework.log.write(msg+se)
250f24f64feSBarry Smith      traceback.print_tb(sys.exc_info()[2], file = framework.log)
2512418bae5SMatthew Knepley      if os.path.isfile(framework.logName+'.bkp'):
2525a74f024SMatthew Knepley        if framework.debugIndent is None:
2535a74f024SMatthew Knepley          framework.debugIndent = '  '
2542418bae5SMatthew Knepley        framework.logPrintDivider()
2552418bae5SMatthew Knepley        framework.logPrintBox('Previous configure logs below', debugSection = None)
2562418bae5SMatthew Knepley        f = file(framework.logName+'.bkp')
2572418bae5SMatthew Knepley        framework.log.write(f.read())
2582418bae5SMatthew Knepley        f.close()
259e9f3bb17SBarry Smith      sys.exit(1)
2605a74f024SMatthew Knepley  else:
2615a74f024SMatthew Knepley    print se
2625a74f024SMatthew Knepley    import traceback
2635a74f024SMatthew Knepley    traceback.print_tb(sys.exc_info()[2])
2645d5a5a7bSMatthew Knepley
2655d5a5a7bSMatthew Knepleyif __name__ == '__main__':
266a030c540SBarry Smith  petsc_configure([])
267759acf64SBarry Smith
268