xref: /petsc/config/configure.py (revision 01def6f0f7f1412434ed4c2cededdeffcdb5c7d8)
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
349dabcff0SSatish Balaydef chkcygwin():
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
4371384062SSatish Balaydef chkcygwinpython():
4471384062SSatish Balay  if os.path.exists('/usr/bin/cygcheck.exe'):
4571384062SSatish Balay    buf = os.popen('/usr/bin/cygcheck.exe -c python').read()
46c4b7e894SSatish Balay    if (buf.find('2.4') > -1) or (buf.find('2.5') > -1) or (buf.find('2.6') > -1):
4771384062SSatish Balay      return 1
4871384062SSatish Balay    else:
4971384062SSatish Balay      return 0
5071384062SSatish Balay  return 0
5171384062SSatish Balay
52836c2c52SSatish Balaydef rhl9():
53836c2c52SSatish Balay  try:
54594eb360SSatish Balay    file = open('/etc/redhat-release','r')
55836c2c52SSatish Balay  except:
56836c2c52SSatish Balay    return 0
57836c2c52SSatish Balay  try:
58836c2c52SSatish Balay    buf = file.read()
59836c2c52SSatish Balay    file.close()
60836c2c52SSatish Balay  except:
61836c2c52SSatish Balay    # can't read file - assume dangerous RHL9
62836c2c52SSatish Balay    return 1
63836c2c52SSatish Balay  if buf.find('Shrike') > -1:
64836c2c52SSatish Balay    return 1
65836c2c52SSatish Balay  else:
66836c2c52SSatish Balay    return 0
67836c2c52SSatish Balay
685d5a5a7bSMatthew Knepleydef petsc_configure(configure_options):
6959e9bfd6SSatish Balay  print '================================================================================='
7059e9bfd6SSatish Balay  print '             Configuring PETSc to compile on your system                         '
7159e9bfd6SSatish Balay  print '================================================================================='
7259e9bfd6SSatish Balay
73c43ea0feSSatish Balay  # Command line arguments take precedence (but don't destroy argv[0])
74c43ea0feSSatish Balay  sys.argv = sys.argv[:1] + configure_options + sys.argv[1:]
7559e9bfd6SSatish Balay  # check PETSC_ARCH
7659e9bfd6SSatish Balay  check_petsc_arch(sys.argv)
77d65f3bddSMatthew Knepley  extraLogs = []
785fb2c094SBarry Smith
79c22cdea9SBarry Smith  # support a few standard configure option types
80ed6a7445SBarry Smith  for l in range(0,len(sys.argv)):
81c22cdea9SBarry Smith    name = sys.argv[l]
82637cc2ebSSatish Balay    if name.find('enable-') >= 0:
83637cc2ebSSatish Balay      sys.argv[l] = name.replace('enable-','with-')
8442351d26SSatish Balay      if name.find('=') == -1: sys.argv[l] = sys.argv[l]+'=1'
85637cc2ebSSatish Balay    if name.find('disable-') >= 0:
86637cc2ebSSatish Balay      sys.argv[l] = name.replace('disable-','with-')
8742351d26SSatish Balay      if name.find('=') == -1: sys.argv[l] = sys.argv[l]+'=0'
88c22cdea9SBarry Smith      elif name.endswith('=1'): sys.argv[l].replace('=1','=0')
89637cc2ebSSatish Balay    if name.find('without-') >= 0:
90637cc2ebSSatish Balay      sys.argv[l] = name.replace('without-','with-')
9142351d26SSatish Balay      if name.find('=') == -1: sys.argv[l] = sys.argv[l]+'=0'
92c22cdea9SBarry Smith      elif name.endswith('=1'): sys.argv[l].replace('=1','=0')
93c22cdea9SBarry Smith
94adc3e427SMatthew Knepley  # Check for sudo
95adc3e427SMatthew Knepley  if os.getuid() == 0:
96adc3e427SMatthew Knepley    print '================================================================================='
97adc3e427SMatthew Knepley    print '             *** Do not run configure as root, or using sudo. ***'
9867e28bfeSBarry Smith    print '             *** Use the --with-sudo=sudo option to have      ***'
9967e28bfeSBarry Smith    print '             *** installs of external packages done with sudo ***'
10067e28bfeSBarry Smith    print '             *** use only with --prefix= when installing in   ***'
10167e28bfeSBarry Smith    print '             *** system directories                           ***'
102adc3e427SMatthew Knepley    print '================================================================================='
103adc3e427SMatthew Knepley    sys.exit(3)
104adc3e427SMatthew Knepley
1059dabcff0SSatish Balay  # Check for broken cygwin
1069dabcff0SSatish Balay  if chkcygwin():
107ec1ee742SBarry Smith    print '================================================================================='
1087d670a3cSBarry Smith    print ' *** cygwin-1.5.11-1 detected. config/configure.py fails with this version   ***'
1091e42869aSSatish Balay    print ' *** Please upgrade to cygwin-1.5.12-1 or newer version. This can  ***'
1101e42869aSSatish Balay    print ' *** be done by running cygwin-setup, selecting "next" all the way.***'
111ec1ee742SBarry Smith    print '================================================================================='
1129dabcff0SSatish Balay    sys.exit(3)
113d65f3bddSMatthew Knepley
114d65f3bddSMatthew Knepley  # Disable threads on RHL9
115d65f3bddSMatthew Knepley  if rhl9():
116d65f3bddSMatthew Knepley    sys.argv.append('--useThreads=0')
117d65f3bddSMatthew Knepley    extraLogs.append('''\
118d65f3bddSMatthew Knepley================================================================================
119d65f3bddSMatthew Knepley   *** RHL9 detected. Threads do not work correctly with this distribution ***
120d65f3bddSMatthew Knepley    ****** Disabling thread usage for this run of config/configure.py *******
121d65f3bddSMatthew Knepley================================================================================''')
122d65f3bddSMatthew Knepley
12371384062SSatish Balay  # Threads don't work for cygwin & python-2.4
12471384062SSatish Balay  if chkcygwinpython():
12571384062SSatish Balay    sys.argv.append('--useThreads=0')
126d65f3bddSMatthew Knepley    extraLogs.append('''\
127d65f3bddSMatthew Knepley================================================================================
128d65f3bddSMatthew Knepley** Cygwin-python-2.4 detected. Threads do not work correctly with this version *
129d65f3bddSMatthew Knepley ********* Disabling thread usage for this run of config/configure.py **********
130d65f3bddSMatthew Knepley================================================================================''')
1319dabcff0SSatish Balay
13287282423SMatthew Knepley  # Should be run from the toplevel
1335d5a5a7bSMatthew Knepley  pythonDir = os.path.abspath(os.path.join('python'))
13487282423SMatthew Knepley  bsDir     = os.path.join(pythonDir, 'BuildSystem')
13587282423SMatthew Knepley  if not os.path.isdir(pythonDir):
1365d5a5a7bSMatthew Knepley    raise RuntimeError('Run configure from $PETSC_DIR, not '+os.path.abspath('.'))
13787282423SMatthew Knepley  if not os.path.isdir(bsDir):
138ec1ee742SBarry Smith    print '================================================================================='
1399c4310d5SMatthew Knepley    print '''++ Could not locate BuildSystem in %s/python.''' % os.getcwd()
140ec1ef0a0SSatish Balay    print '''++ Downloading it using "hg clone http://hg.mcs.anl.gov/petsc/BuildSystem %s/python/BuildSystem"''' % os.getcwd()
141ec1ee742SBarry Smith    print '================================================================================='
142ec1ef0a0SSatish Balay    (status,output) = commands.getstatusoutput('hg clone http://hg.mcs.anl.gov/petsc/BuildSystem python/BuildSystem')
1437d7624c9SBarry Smith    if status:
1447d7624c9SBarry Smith      if output.find('ommand not found') >= 0:
145ec1ee742SBarry Smith        print '================================================================================='
14659dc5438SMatthew Knepley        print '''** Unable to locate hg (Mercurial) to download BuildSystem; make sure hg is in your path'''
147d688700cSSatish Balay        print '''** or manually copy BuildSystem to $PETSC_DIR/python/BuildSystem from a machine where'''
14859dc5438SMatthew Knepley        print '''** you do have hg installed and can clone BuildSystem. '''
149ec1ee742SBarry Smith        print '================================================================================='
1507d7624c9SBarry Smith      elif output.find('Cannot resolve host') >= 0:
151ec1ee742SBarry Smith        print '================================================================================='
152d688700cSSatish Balay        print '''** Unable to download BuildSystem. You must be off the network.'''
153d688700cSSatish Balay        print '''** Connect to the internet and run config/configure.py again.'''
154ec1ee742SBarry Smith        print '================================================================================='
1557d7624c9SBarry Smith      else:
156ec1ee742SBarry Smith        print '================================================================================='
157d688700cSSatish Balay        print '''** Unable to download BuildSystem. Please send this message to petsc-maint@mcs.anl.gov'''
158ec1ee742SBarry Smith        print '================================================================================='
1597d7624c9SBarry Smith      print output
16087282423SMatthew Knepley      sys.exit(3)
1614f8a5b45SBarry Smith
16287282423SMatthew Knepley  sys.path.insert(0, bsDir)
1635d5a5a7bSMatthew Knepley  sys.path.insert(0, pythonDir)
164e69ef9dfSMatthew Knepley  import config.base
1655d5a5a7bSMatthew Knepley  import config.framework
166f56be888SMatthew Knepley  import cPickle
1674f8a5b45SBarry Smith
1682e22a60eSMatthew Knepley  # Disable shared libraries by default
1692e22a60eSMatthew Knepley  import nargs
1702e22a60eSMatthew Knepley  if nargs.Arg.findArgument('with-shared', sys.argv[1:]) is None:
1712e22a60eSMatthew Knepley    sys.argv.append('--with-shared=0')
1722e22a60eSMatthew Knepley
1739dd2fdb1SMatthew Knepley  framework = None
1749dd2fdb1SMatthew Knepley  try:
175637cc2ebSSatish Balay    framework = config.framework.Framework(sys.argv[1:]+['--configModules=PETSc.Configure','--optionsModule=PETSc.compilerOptions'], loadArgDB = 0)
176d65f3bddSMatthew Knepley    framework.setup()
177d65f3bddSMatthew Knepley    framework.logPrint('\n'.join(extraLogs))
178f24f64feSBarry Smith    framework.configure(out = sys.stdout)
179358ebc22SMatthew Knepley    framework.storeSubstitutions(framework.argDB)
180f56be888SMatthew Knepley    framework.argDB['configureCache'] = cPickle.dumps(framework)
1817cfd0b05SBarry Smith    import PETSc.packages
1827cfd0b05SBarry Smith    for i in framework.packages:
1837cfd0b05SBarry Smith      if hasattr(i,'postProcess'):
1847cfd0b05SBarry Smith        i.postProcess()
1857cfd0b05SBarry Smith    framework.logClear()
186dd50d019SBarry Smith    return 0
187e69ef9dfSMatthew Knepley  except (RuntimeError, config.base.ConfigureSetupError), e:
1887d670a3cSBarry Smith    emsg = str(e)
18942351d26SSatish Balay    if not emsg.endswith('\n'): emsg = emsg+'\n'
190fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
191fe09c992SBarry Smith    +'         UNABLE to CONFIGURE with GIVEN OPTIONS    (see configure.log for details):\n' \
192fe09c992SBarry Smith    +'---------------------------------------------------------------------------------------\n'  \
1937d670a3cSBarry Smith    +emsg+'*********************************************************************************\n'
194e9f3bb17SBarry Smith    se = ''
1959dd2fdb1SMatthew Knepley  except (TypeError, ValueError), e:
1967d670a3cSBarry Smith    emsg = str(e)
19742351d26SSatish Balay    if not emsg.endswith('\n'): emsg = emsg+'\n'
198fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
199fe09c992SBarry Smith    +'                ERROR in COMMAND LINE ARGUMENT to config/configure.py \n' \
200fe09c992SBarry Smith    +'---------------------------------------------------------------------------------------\n'  \
2017d670a3cSBarry Smith    +emsg+'*********************************************************************************\n'
2021a02243aSBarry Smith    se = ''
20396dc2fe8SMatthew Knepley  except ImportError, e :
2047d670a3cSBarry Smith    emsg = str(e)
20542351d26SSatish Balay    if not emsg.endswith('\n'): emsg = emsg+'\n'
206fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
207fe09c992SBarry Smith    +'                     UNABLE to FIND MODULE for config/configure.py \n' \
208fe09c992SBarry Smith    +'---------------------------------------------------------------------------------------\n'  \
2097d670a3cSBarry Smith    +emsg+'*********************************************************************************\n'
21096dc2fe8SMatthew Knepley    se = ''
211*01def6f0SMatthew Knepley  except OSError, e :
212*01def6f0SMatthew Knepley    emsg = str(e)
213*01def6f0SMatthew Knepley    if not emsg.endswith('\n'): emsg = emsg+'\n'
214*01def6f0SMatthew Knepley    msg ='*********************************************************************************\n'\
215*01def6f0SMatthew Knepley    +'                    UNABLE to EXECUTE BINARIES for config/configure.py \n' \
216*01def6f0SMatthew Knepley    +'---------------------------------------------------------------------------------------\n'  \
217*01def6f0SMatthew Knepley    +emsg+'*********************************************************************************\n'
218*01def6f0SMatthew Knepley    se = ''
219d7d3c4beSMatthew Knepley  except SystemExit, e:
220d7d3c4beSMatthew Knepley    if e.code is None or e.code == 0:
221d7d3c4beSMatthew Knepley      return
222fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
223fe09c992SBarry Smith    +'           CONFIGURATION CRASH  (Please send configure.log to petsc-maint@mcs.anl.gov)\n' \
224fe09c992SBarry Smith    +'*********************************************************************************\n'
225d7d3c4beSMatthew Knepley    se  = str(e)
226e9f3bb17SBarry Smith  except Exception, e:
227fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
228fe09c992SBarry Smith    +'          CONFIGURATION CRASH  (Please send configure.log to petsc-maint@mcs.anl.gov)\n' \
229fe09c992SBarry Smith    +'*********************************************************************************\n'
230e9f3bb17SBarry Smith    se  = str(e)
231e9f3bb17SBarry Smith
232e9f3bb17SBarry Smith  print msg
2339dd2fdb1SMatthew Knepley  if not framework is None:
2349dd2fdb1SMatthew Knepley    framework.logClear()
235e9f3bb17SBarry Smith    if hasattr(framework, 'log'):
236f6614063SBarry Smith      import traceback
237f24f64feSBarry Smith      framework.log.write(msg+se)
238f24f64feSBarry Smith      traceback.print_tb(sys.exc_info()[2], file = framework.log)
2392418bae5SMatthew Knepley      if os.path.isfile(framework.logName+'.bkp'):
2405a74f024SMatthew Knepley        if framework.debugIndent is None:
2415a74f024SMatthew Knepley          framework.debugIndent = '  '
2422418bae5SMatthew Knepley        framework.logPrintDivider()
2432418bae5SMatthew Knepley        framework.logPrintBox('Previous configure logs below', debugSection = None)
2442418bae5SMatthew Knepley        f = file(framework.logName+'.bkp')
2452418bae5SMatthew Knepley        framework.log.write(f.read())
2462418bae5SMatthew Knepley        f.close()
247e9f3bb17SBarry Smith      sys.exit(1)
2485a74f024SMatthew Knepley  else:
2495a74f024SMatthew Knepley    print se
2505a74f024SMatthew Knepley    import traceback
2515a74f024SMatthew Knepley    traceback.print_tb(sys.exc_info()[2])
2525d5a5a7bSMatthew Knepley
2535d5a5a7bSMatthew Knepleyif __name__ == '__main__':
254a030c540SBarry Smith  petsc_configure([])
255759acf64SBarry Smith
256