xref: /petsc/config/configure.py (revision e6985bf00bf1d1c6d14a5045758aa91bae6be9e1)
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
3485ef4d1eSSatish 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
4385ef4d1eSSatish Balaydef chkusingwindowspython():
4485ef4d1eSSatish Balay  if os.path.exists('/usr/bin/cygcheck.exe'):
4585ef4d1eSSatish Balay    if sys.platform != 'cygwin':
4685ef4d1eSSatish Balay      return 1
4785ef4d1eSSatish Balay  return 0
4885ef4d1eSSatish Balay
4985ef4d1eSSatish 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
58cd8c7a90SSatish Balaydef chkincompletecygwin():
59cd8c7a90SSatish Balay  if os.path.exists('/usr/bin/cygcheck.exe'):
60cd8c7a90SSatish Balay    if not os.path.exists('/usr/bin/make') or not os.path.exists('/usr/bin/diff'):
61cd8c7a90SSatish Balay      print '================================================================================='
62*e6985bf0SSatish Balay      print ' *** Incomplete cygwin install detected . Either /usr/bin/make or /usr/bin/diff **'
63*e6985bf0SSatish Balay      print ' *** is missing. Please rerun cygwin-setup and select module "make" **************'
64*e6985bf0SSatish Balay      print ' *** [This should install "make" and its dependencies like "diff"] ***************'
65cd8c7a90SSatish Balay      print '================================================================================='
66cd8c7a90SSatish Balay      sys.exit(3)
67cd8c7a90SSatish Balay  return 0
68cd8c7a90SSatish Balay
69836c2c52SSatish Balaydef rhl9():
70836c2c52SSatish Balay  try:
71594eb360SSatish Balay    file = open('/etc/redhat-release','r')
72836c2c52SSatish Balay  except:
73836c2c52SSatish Balay    return 0
74836c2c52SSatish Balay  try:
75836c2c52SSatish Balay    buf = file.read()
76836c2c52SSatish Balay    file.close()
77836c2c52SSatish Balay  except:
78836c2c52SSatish Balay    # can't read file - assume dangerous RHL9
79836c2c52SSatish Balay    return 1
80836c2c52SSatish Balay  if buf.find('Shrike') > -1:
81836c2c52SSatish Balay    return 1
82836c2c52SSatish Balay  else:
83836c2c52SSatish Balay    return 0
84836c2c52SSatish Balay
85fd0ecfceSSatish Balaydef chkBrokenF8Diff():
86fd0ecfceSSatish Balay  if os.path.exists('/bin/rpm'):
87fd0ecfceSSatish Balay    buf = os.popen('/bin/rpm -q diffutils').read()
88fd0ecfceSSatish Balay    if buf.find('diffutils-2.8.1-17.fc8') > -1:
89fd0ecfceSSatish Balay      return 1
90fd0ecfceSSatish Balay    else:
91fd0ecfceSSatish Balay      return 0
92fd0ecfceSSatish Balay
93fd0ecfceSSatish Balay
945d5a5a7bSMatthew Knepleydef petsc_configure(configure_options):
9559e9bfd6SSatish Balay  print '================================================================================='
9659e9bfd6SSatish Balay  print '             Configuring PETSc to compile on your system                         '
9759e9bfd6SSatish Balay  print '================================================================================='
9859e9bfd6SSatish Balay
99c43ea0feSSatish Balay  # Command line arguments take precedence (but don't destroy argv[0])
100c43ea0feSSatish Balay  sys.argv = sys.argv[:1] + configure_options + sys.argv[1:]
10159e9bfd6SSatish Balay  # check PETSC_ARCH
10259e9bfd6SSatish Balay  check_petsc_arch(sys.argv)
103d65f3bddSMatthew Knepley  extraLogs = []
1045fb2c094SBarry Smith
105c22cdea9SBarry Smith  # support a few standard configure option types
106ed6a7445SBarry Smith  for l in range(0,len(sys.argv)):
107c22cdea9SBarry Smith    name = sys.argv[l]
108637cc2ebSSatish Balay    if name.find('enable-') >= 0:
109637cc2ebSSatish Balay      sys.argv[l] = name.replace('enable-','with-')
11042351d26SSatish Balay      if name.find('=') == -1: sys.argv[l] = sys.argv[l]+'=1'
111637cc2ebSSatish Balay    if name.find('disable-') >= 0:
112637cc2ebSSatish Balay      sys.argv[l] = name.replace('disable-','with-')
11342351d26SSatish Balay      if name.find('=') == -1: sys.argv[l] = sys.argv[l]+'=0'
114c22cdea9SBarry Smith      elif name.endswith('=1'): sys.argv[l].replace('=1','=0')
115637cc2ebSSatish Balay    if name.find('without-') >= 0:
116637cc2ebSSatish Balay      sys.argv[l] = name.replace('without-','with-')
11742351d26SSatish Balay      if name.find('=') == -1: sys.argv[l] = sys.argv[l]+'=0'
118c22cdea9SBarry Smith      elif name.endswith('=1'): sys.argv[l].replace('=1','=0')
119c22cdea9SBarry Smith
120adc3e427SMatthew Knepley  # Check for sudo
121adc3e427SMatthew Knepley  if os.getuid() == 0:
122adc3e427SMatthew Knepley    print '================================================================================='
123adc3e427SMatthew Knepley    print '             *** Do not run configure as root, or using sudo. ***'
12467e28bfeSBarry Smith    print '             *** Use the --with-sudo=sudo option to have      ***'
12567e28bfeSBarry Smith    print '             *** installs of external packages done with sudo ***'
12667e28bfeSBarry Smith    print '             *** use only with --prefix= when installing in   ***'
12767e28bfeSBarry Smith    print '             *** system directories                           ***'
128adc3e427SMatthew Knepley    print '================================================================================='
129adc3e427SMatthew Knepley    sys.exit(3)
130adc3e427SMatthew Knepley
1319dabcff0SSatish Balay  # Check for broken cygwin
13285ef4d1eSSatish Balay  if chkbrokencygwin():
133ec1ee742SBarry Smith    print '================================================================================='
1347d670a3cSBarry Smith    print ' *** cygwin-1.5.11-1 detected. config/configure.py fails with this version   ***'
1351e42869aSSatish Balay    print ' *** Please upgrade to cygwin-1.5.12-1 or newer version. This can  ***'
1361e42869aSSatish Balay    print ' *** be done by running cygwin-setup, selecting "next" all the way.***'
137ec1ee742SBarry Smith    print '================================================================================='
1389dabcff0SSatish Balay    sys.exit(3)
139d65f3bddSMatthew Knepley
140cd8c7a90SSatish Balay  # Check if cygwin install is incomplete
141cd8c7a90SSatish Balay  chkincompletecygwin()
142cd8c7a90SSatish Balay
143d65f3bddSMatthew Knepley  # Disable threads on RHL9
144d65f3bddSMatthew Knepley  if rhl9():
145d65f3bddSMatthew Knepley    sys.argv.append('--useThreads=0')
146d65f3bddSMatthew Knepley    extraLogs.append('''\
147d65f3bddSMatthew Knepley================================================================================
148d65f3bddSMatthew Knepley   *** RHL9 detected. Threads do not work correctly with this distribution ***
149d65f3bddSMatthew Knepley    ****** Disabling thread usage for this run of config/configure.py *******
150d65f3bddSMatthew Knepley================================================================================''')
151fd0ecfceSSatish Balay
152fd0ecfceSSatish Balay  # Check for broken diff on Fedora8
153fd0ecfceSSatish Balay  if chkBrokenF8Diff():
154fd0ecfceSSatish Balay    print '================================================================================='
155fd0ecfceSSatish Balay    print ' *** Fedora 8 Linux with broken diffutils-2.8.1-17.fc8 detected. ****************'
156fd0ecfceSSatish Balay    print ' *** Please run "sudo yum update diffutils" to get the latest bugfixed version.**'
157fd0ecfceSSatish Balay    print '================================================================================='
158fd0ecfceSSatish Balay    sys.exit(3)
159fd0ecfceSSatish Balay
16085ef4d1eSSatish Balay  # Make sure cygwin-python is used on windows
16185ef4d1eSSatish Balay  if chkusingwindowspython():
16285ef4d1eSSatish Balay    print '================================================================================='
16385ef4d1eSSatish Balay    print ' *** Non-cygwin python detected. Please rerun config/configure.py with cygwin-python ***'
16485ef4d1eSSatish Balay    print '================================================================================='
16585ef4d1eSSatish Balay    sys.exit(3)
166d65f3bddSMatthew Knepley
16785ef4d1eSSatish Balay  # Threads don't work for cygwin & python-2.4, 2.5 etc..
16885ef4d1eSSatish Balay  if chkcygwinpythonver():
16971384062SSatish Balay    sys.argv.append('--useThreads=0')
170d65f3bddSMatthew Knepley    extraLogs.append('''\
171d65f3bddSMatthew Knepley================================================================================
17285ef4d1eSSatish Balay** Cygwin-python-2.4/2.5 detected. Threads do not work correctly with this version *
173d65f3bddSMatthew Knepley ********* Disabling thread usage for this run of config/configure.py **********
174d65f3bddSMatthew Knepley================================================================================''')
1759dabcff0SSatish Balay
17687282423SMatthew Knepley  # Should be run from the toplevel
1775d5a5a7bSMatthew Knepley  pythonDir = os.path.abspath(os.path.join('python'))
17887282423SMatthew Knepley  bsDir     = os.path.join(pythonDir, 'BuildSystem')
17987282423SMatthew Knepley  if not os.path.isdir(pythonDir):
1805d5a5a7bSMatthew Knepley    raise RuntimeError('Run configure from $PETSC_DIR, not '+os.path.abspath('.'))
18187282423SMatthew Knepley  if not os.path.isdir(bsDir):
182ec1ee742SBarry Smith    print '================================================================================='
1839c4310d5SMatthew Knepley    print '''++ Could not locate BuildSystem in %s/python.''' % os.getcwd()
184ec1ef0a0SSatish Balay    print '''++ Downloading it using "hg clone http://hg.mcs.anl.gov/petsc/BuildSystem %s/python/BuildSystem"''' % os.getcwd()
185ec1ee742SBarry Smith    print '================================================================================='
186ec1ef0a0SSatish Balay    (status,output) = commands.getstatusoutput('hg clone http://hg.mcs.anl.gov/petsc/BuildSystem python/BuildSystem')
1877d7624c9SBarry Smith    if status:
1887d7624c9SBarry Smith      if output.find('ommand not found') >= 0:
189ec1ee742SBarry Smith        print '================================================================================='
19059dc5438SMatthew Knepley        print '''** Unable to locate hg (Mercurial) to download BuildSystem; make sure hg is in your path'''
191d688700cSSatish Balay        print '''** or manually copy BuildSystem to $PETSC_DIR/python/BuildSystem from a machine where'''
19259dc5438SMatthew Knepley        print '''** you do have hg installed and can clone BuildSystem. '''
193ec1ee742SBarry Smith        print '================================================================================='
1947d7624c9SBarry Smith      elif output.find('Cannot resolve host') >= 0:
195ec1ee742SBarry Smith        print '================================================================================='
196d688700cSSatish Balay        print '''** Unable to download BuildSystem. You must be off the network.'''
197d688700cSSatish Balay        print '''** Connect to the internet and run config/configure.py again.'''
198ec1ee742SBarry Smith        print '================================================================================='
1997d7624c9SBarry Smith      else:
200ec1ee742SBarry Smith        print '================================================================================='
201d688700cSSatish Balay        print '''** Unable to download BuildSystem. Please send this message to petsc-maint@mcs.anl.gov'''
202ec1ee742SBarry Smith        print '================================================================================='
2037d7624c9SBarry Smith      print output
20487282423SMatthew Knepley      sys.exit(3)
2054f8a5b45SBarry Smith
20687282423SMatthew Knepley  sys.path.insert(0, bsDir)
2075d5a5a7bSMatthew Knepley  sys.path.insert(0, pythonDir)
208e69ef9dfSMatthew Knepley  import config.base
2095d5a5a7bSMatthew Knepley  import config.framework
210f56be888SMatthew Knepley  import cPickle
2114f8a5b45SBarry Smith
2122e22a60eSMatthew Knepley  # Disable shared libraries by default
2132e22a60eSMatthew Knepley  import nargs
2142e22a60eSMatthew Knepley  if nargs.Arg.findArgument('with-shared', sys.argv[1:]) is None:
2152e22a60eSMatthew Knepley    sys.argv.append('--with-shared=0')
2162e22a60eSMatthew Knepley
2179dd2fdb1SMatthew Knepley  framework = None
2189dd2fdb1SMatthew Knepley  try:
219637cc2ebSSatish Balay    framework = config.framework.Framework(sys.argv[1:]+['--configModules=PETSc.Configure','--optionsModule=PETSc.compilerOptions'], loadArgDB = 0)
220d65f3bddSMatthew Knepley    framework.setup()
221d65f3bddSMatthew Knepley    framework.logPrint('\n'.join(extraLogs))
222f24f64feSBarry Smith    framework.configure(out = sys.stdout)
223358ebc22SMatthew Knepley    framework.storeSubstitutions(framework.argDB)
224f56be888SMatthew Knepley    framework.argDB['configureCache'] = cPickle.dumps(framework)
2257cfd0b05SBarry Smith    import PETSc.packages
2267cfd0b05SBarry Smith    for i in framework.packages:
2277cfd0b05SBarry Smith      if hasattr(i,'postProcess'):
2287cfd0b05SBarry Smith        i.postProcess()
2297cfd0b05SBarry Smith    framework.logClear()
230dd50d019SBarry Smith    return 0
231e69ef9dfSMatthew Knepley  except (RuntimeError, config.base.ConfigureSetupError), e:
2327d670a3cSBarry Smith    emsg = str(e)
23342351d26SSatish Balay    if not emsg.endswith('\n'): emsg = emsg+'\n'
234fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
235fe09c992SBarry Smith    +'         UNABLE to CONFIGURE with GIVEN OPTIONS    (see configure.log for details):\n' \
236fe09c992SBarry Smith    +'---------------------------------------------------------------------------------------\n'  \
2377d670a3cSBarry Smith    +emsg+'*********************************************************************************\n'
238e9f3bb17SBarry Smith    se = ''
2399dd2fdb1SMatthew Knepley  except (TypeError, ValueError), e:
2407d670a3cSBarry Smith    emsg = str(e)
24142351d26SSatish Balay    if not emsg.endswith('\n'): emsg = emsg+'\n'
242fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
243fe09c992SBarry Smith    +'                ERROR in COMMAND LINE ARGUMENT to config/configure.py \n' \
244fe09c992SBarry Smith    +'---------------------------------------------------------------------------------------\n'  \
2457d670a3cSBarry Smith    +emsg+'*********************************************************************************\n'
2461a02243aSBarry Smith    se = ''
24796dc2fe8SMatthew Knepley  except ImportError, e :
2487d670a3cSBarry Smith    emsg = str(e)
24942351d26SSatish Balay    if not emsg.endswith('\n'): emsg = emsg+'\n'
250fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
251fe09c992SBarry Smith    +'                     UNABLE to FIND MODULE for config/configure.py \n' \
252fe09c992SBarry Smith    +'---------------------------------------------------------------------------------------\n'  \
2537d670a3cSBarry Smith    +emsg+'*********************************************************************************\n'
25496dc2fe8SMatthew Knepley    se = ''
25501def6f0SMatthew Knepley  except OSError, e :
25601def6f0SMatthew Knepley    emsg = str(e)
25701def6f0SMatthew Knepley    if not emsg.endswith('\n'): emsg = emsg+'\n'
25801def6f0SMatthew Knepley    msg ='*********************************************************************************\n'\
25901def6f0SMatthew Knepley    +'                    UNABLE to EXECUTE BINARIES for config/configure.py \n' \
26001def6f0SMatthew Knepley    +'---------------------------------------------------------------------------------------\n'  \
26101def6f0SMatthew Knepley    +emsg+'*********************************************************************************\n'
26201def6f0SMatthew Knepley    se = ''
263d7d3c4beSMatthew Knepley  except SystemExit, e:
264d7d3c4beSMatthew Knepley    if e.code is None or e.code == 0:
265d7d3c4beSMatthew Knepley      return
266fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
267fe09c992SBarry Smith    +'           CONFIGURATION CRASH  (Please send configure.log to petsc-maint@mcs.anl.gov)\n' \
268fe09c992SBarry Smith    +'*********************************************************************************\n'
269d7d3c4beSMatthew Knepley    se  = str(e)
270e9f3bb17SBarry Smith  except Exception, e:
271fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
272fe09c992SBarry Smith    +'          CONFIGURATION CRASH  (Please send configure.log to petsc-maint@mcs.anl.gov)\n' \
273fe09c992SBarry Smith    +'*********************************************************************************\n'
274e9f3bb17SBarry Smith    se  = str(e)
275e9f3bb17SBarry Smith
276e9f3bb17SBarry Smith  print msg
2779dd2fdb1SMatthew Knepley  if not framework is None:
2789dd2fdb1SMatthew Knepley    framework.logClear()
279e9f3bb17SBarry Smith    if hasattr(framework, 'log'):
280f6614063SBarry Smith      import traceback
281f24f64feSBarry Smith      framework.log.write(msg+se)
282f24f64feSBarry Smith      traceback.print_tb(sys.exc_info()[2], file = framework.log)
2832418bae5SMatthew Knepley      if os.path.isfile(framework.logName+'.bkp'):
2845a74f024SMatthew Knepley        if framework.debugIndent is None:
2855a74f024SMatthew Knepley          framework.debugIndent = '  '
2862418bae5SMatthew Knepley        framework.logPrintDivider()
2872418bae5SMatthew Knepley        framework.logPrintBox('Previous configure logs below', debugSection = None)
2882418bae5SMatthew Knepley        f = file(framework.logName+'.bkp')
2892418bae5SMatthew Knepley        framework.log.write(f.read())
2902418bae5SMatthew Knepley        f.close()
291e9f3bb17SBarry Smith      sys.exit(1)
2925a74f024SMatthew Knepley  else:
2935a74f024SMatthew Knepley    print se
2945a74f024SMatthew Knepley    import traceback
2955a74f024SMatthew Knepley    traceback.print_tb(sys.exc_info()[2])
2965d5a5a7bSMatthew Knepley
2975d5a5a7bSMatthew Knepleyif __name__ == '__main__':
298a030c540SBarry Smith  petsc_configure([])
299759acf64SBarry Smith
300