xref: /petsc/config/configure.py (revision eefa2c0f591e445456ed7a4a4a34d0ec8da21980)
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
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
865d4be62bSBarry Smith  foundsudo = 0
875d4be62bSBarry Smith  for l in range(0,len(sys.argv)):
885d4be62bSBarry Smith    if sys.argv[l] == '--with-sudo=sudo':
895d4be62bSBarry Smith      foundsudo = 1
905d4be62bSBarry Smith
91ed6a7445SBarry Smith  for l in range(0,len(sys.argv)):
92c22cdea9SBarry Smith    name = sys.argv[l]
93637cc2ebSSatish Balay    if name.find('enable-') >= 0:
94193cd51eSMatthew Knepley      if name.find('=') == -1:
95193cd51eSMatthew Knepley        sys.argv[l] = name.replace('enable-','with-')+'=1'
96193cd51eSMatthew Knepley      else:
97193cd51eSMatthew Knepley        head, tail = name.split('=', 1)
98193cd51eSMatthew Knepley        sys.argv[l] = head.replace('enable-','with-')+'='+tail
99637cc2ebSSatish Balay    if name.find('disable-') >= 0:
100193cd51eSMatthew Knepley      if name.find('=') == -1:
101193cd51eSMatthew Knepley        sys.argv[l] = name.replace('disable-','with-')+'=0'
102193cd51eSMatthew Knepley      else:
103193cd51eSMatthew Knepley        head, tail = name.split('=', 1)
104193cd51eSMatthew Knepley        if tail == '1': tail = '0'
105193cd51eSMatthew Knepley        sys.argv[l] = head.replace('disable-','with-')+'='+tail
106637cc2ebSSatish Balay    if name.find('without-') >= 0:
107193cd51eSMatthew Knepley      if name.find('=') == -1:
108193cd51eSMatthew Knepley        sys.argv[l] = name.replace('without-','with-')+'=0'
109193cd51eSMatthew Knepley      else:
110193cd51eSMatthew Knepley        head, tail = name.split('=', 1)
111193cd51eSMatthew Knepley        if tail == '1': tail = '0'
112193cd51eSMatthew Knepley        sys.argv[l] = head.replace('without-','with-')+'='+tail
1135d4be62bSBarry Smith    if name.find('prefix=') >= 0 and not foundsudo:
1145d4be62bSBarry Smith      head, installdir = name.split('=', 1)
1155d4be62bSBarry Smith      if os.path.exists(installdir):
1165d4be62bSBarry Smith        if not os.access(installdir,os.W_OK):
1175d4be62bSBarry Smith          print 'You do not have write access to requested install directory given with --prefix='+installdir+' perhaps use --with-sudo=sudo also'
1185d4be62bSBarry Smith          sys.exit(3)
1195d4be62bSBarry Smith        else:
1205d4be62bSBarry Smith          try:
1215d4be62bSBarry Smith            os.mkdir(installdir)
1225d4be62bSBarry Smith          except:
1235d4be62bSBarry Smith            print 'You do not have write access to create install directory given with --prefix='+installdir+' perhaps use --with-sudo=sudo also'
1245d4be62bSBarry Smith            sys.exit(3)
1255d4be62bSBarry Smith
126c22cdea9SBarry Smith
127adc3e427SMatthew Knepley  # Check for sudo
128adc3e427SMatthew Knepley  if os.getuid() == 0:
129adc3e427SMatthew Knepley    print '================================================================================='
130adc3e427SMatthew Knepley    print '             *** Do not run configure as root, or using sudo. ***'
13167e28bfeSBarry Smith    print '             *** Use the --with-sudo=sudo option to have      ***'
13267e28bfeSBarry Smith    print '             *** installs of external packages done with sudo ***'
13367e28bfeSBarry Smith    print '             *** use only with --prefix= when installing in   ***'
13467e28bfeSBarry Smith    print '             *** system directories                           ***'
135adc3e427SMatthew Knepley    print '================================================================================='
136adc3e427SMatthew Knepley    sys.exit(3)
137adc3e427SMatthew Knepley
1389dabcff0SSatish Balay  # Check for broken cygwin
13985ef4d1eSSatish Balay  if chkbrokencygwin():
140ec1ee742SBarry Smith    print '================================================================================='
1417d670a3cSBarry Smith    print ' *** cygwin-1.5.11-1 detected. config/configure.py fails with this version   ***'
1421e42869aSSatish Balay    print ' *** Please upgrade to cygwin-1.5.12-1 or newer version. This can  ***'
1431e42869aSSatish Balay    print ' *** be done by running cygwin-setup, selecting "next" all the way.***'
144ec1ee742SBarry Smith    print '================================================================================='
1459dabcff0SSatish Balay    sys.exit(3)
146d65f3bddSMatthew Knepley
147d65f3bddSMatthew Knepley  # Disable threads on RHL9
148d65f3bddSMatthew Knepley  if rhl9():
149d65f3bddSMatthew Knepley    sys.argv.append('--useThreads=0')
150d65f3bddSMatthew Knepley    extraLogs.append('''\
151d65f3bddSMatthew Knepley================================================================================
152d65f3bddSMatthew Knepley   *** RHL9 detected. Threads do not work correctly with this distribution ***
153d65f3bddSMatthew Knepley    ****** Disabling thread usage for this run of config/configure.py *******
154d65f3bddSMatthew Knepley================================================================================''')
15585ef4d1eSSatish Balay  # Make sure cygwin-python is used on windows
15685ef4d1eSSatish Balay  if chkusingwindowspython():
15785ef4d1eSSatish Balay    print '================================================================================='
15885ef4d1eSSatish Balay    print ' *** Non-cygwin python detected. Please rerun config/configure.py with cygwin-python ***'
15985ef4d1eSSatish Balay    print '================================================================================='
16085ef4d1eSSatish Balay    sys.exit(3)
161d65f3bddSMatthew Knepley
16285ef4d1eSSatish Balay  # Threads don't work for cygwin & python-2.4, 2.5 etc..
16385ef4d1eSSatish Balay  if chkcygwinpythonver():
16471384062SSatish Balay    sys.argv.append('--useThreads=0')
165d65f3bddSMatthew Knepley    extraLogs.append('''\
166d65f3bddSMatthew Knepley================================================================================
16785ef4d1eSSatish Balay** Cygwin-python-2.4/2.5 detected. Threads do not work correctly with this version *
168d65f3bddSMatthew Knepley ********* Disabling thread usage for this run of config/configure.py **********
169d65f3bddSMatthew Knepley================================================================================''')
1709dabcff0SSatish Balay
17187282423SMatthew Knepley  # Should be run from the toplevel
172dbca6d9dSSatish Balay  configDir = os.path.abspath('config')
173f8833479SBarry Smith  bsDir     = os.path.join(configDir, 'BuildSystem')
174f8833479SBarry Smith  if not os.path.isdir(configDir):
1755d5a5a7bSMatthew Knepley    raise RuntimeError('Run configure from $PETSC_DIR, not '+os.path.abspath('.'))
17687282423SMatthew Knepley  if not os.path.isdir(bsDir):
177ec1ee742SBarry Smith    print '================================================================================='
178dbca6d9dSSatish Balay    print '''++ Could not locate BuildSystem in %s.''' % configDir
179dbca6d9dSSatish Balay    print '''++ Downloading it using "hg clone http://hg.mcs.anl.gov/petsc/BuildSystem %s"''' % bsDir
180ec1ee742SBarry Smith    print '================================================================================='
181dbca6d9dSSatish Balay    (status,output) = commands.getstatusoutput('hg clone http://petsc.cs.iit.edu/petsc/BuildSystem '+ bsDir)
1827d7624c9SBarry Smith    if status:
1837d7624c9SBarry Smith      if output.find('ommand not found') >= 0:
184ec1ee742SBarry Smith        print '================================================================================='
18559dc5438SMatthew Knepley        print '''** Unable to locate hg (Mercurial) to download BuildSystem; make sure hg is in your path'''
186ab21cac3SMatthew Knepley        print '''** or manually copy BuildSystem to $PETSC_DIR/config/BuildSystem from a machine where'''
18759dc5438SMatthew Knepley        print '''** you do have hg installed and can clone BuildSystem. '''
188ec1ee742SBarry Smith        print '================================================================================='
1897d7624c9SBarry Smith      elif output.find('Cannot resolve host') >= 0:
190ec1ee742SBarry Smith        print '================================================================================='
191d688700cSSatish Balay        print '''** Unable to download BuildSystem. You must be off the network.'''
192d688700cSSatish Balay        print '''** Connect to the internet and run config/configure.py again.'''
193ec1ee742SBarry Smith        print '================================================================================='
1947d7624c9SBarry Smith      else:
195ec1ee742SBarry Smith        print '================================================================================='
196d688700cSSatish Balay        print '''** Unable to download BuildSystem. Please send this message to petsc-maint@mcs.anl.gov'''
197ec1ee742SBarry Smith        print '================================================================================='
1987d7624c9SBarry Smith      print output
19987282423SMatthew Knepley      sys.exit(3)
2004f8a5b45SBarry Smith
20187282423SMatthew Knepley  sys.path.insert(0, bsDir)
202f8833479SBarry Smith  sys.path.insert(0, configDir)
203e69ef9dfSMatthew Knepley  import config.base
2045d5a5a7bSMatthew Knepley  import config.framework
205f56be888SMatthew Knepley  import cPickle
2064f8a5b45SBarry Smith
2072e22a60eSMatthew Knepley  # Disable shared libraries by default
2082e22a60eSMatthew Knepley  import nargs
2092e22a60eSMatthew Knepley  if nargs.Arg.findArgument('with-shared', sys.argv[1:]) is None:
2102e22a60eSMatthew Knepley    sys.argv.append('--with-shared=0')
2112e22a60eSMatthew Knepley
2129dd2fdb1SMatthew Knepley  framework = None
2139dd2fdb1SMatthew Knepley  try:
214637cc2ebSSatish Balay    framework = config.framework.Framework(sys.argv[1:]+['--configModules=PETSc.Configure','--optionsModule=PETSc.compilerOptions'], loadArgDB = 0)
215d65f3bddSMatthew Knepley    framework.setup()
216d65f3bddSMatthew Knepley    framework.logPrint('\n'.join(extraLogs))
217f24f64feSBarry Smith    framework.configure(out = sys.stdout)
218358ebc22SMatthew Knepley    framework.storeSubstitutions(framework.argDB)
219f56be888SMatthew Knepley    framework.argDB['configureCache'] = cPickle.dumps(framework)
2207cfd0b05SBarry Smith    import PETSc.packages
2217cfd0b05SBarry Smith    for i in framework.packages:
2227cfd0b05SBarry Smith      if hasattr(i,'postProcess'):
2237cfd0b05SBarry Smith        i.postProcess()
2247cfd0b05SBarry Smith    framework.logClear()
225*eefa2c0fSBarry Smith    framework.closeLog()
226*eefa2c0fSBarry Smith    import shutil
227*eefa2c0fSBarry Smith    shutil.move(framework.logName,os.path.join(framework.arch,'conf',framework.logName))
228dd50d019SBarry Smith    return 0
229e69ef9dfSMatthew Knepley  except (RuntimeError, config.base.ConfigureSetupError), e:
2307d670a3cSBarry Smith    emsg = str(e)
23142351d26SSatish Balay    if not emsg.endswith('\n'): emsg = emsg+'\n'
232fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
233fe09c992SBarry Smith    +'         UNABLE to CONFIGURE with GIVEN OPTIONS    (see configure.log for details):\n' \
234fe09c992SBarry Smith    +'---------------------------------------------------------------------------------------\n'  \
2357d670a3cSBarry Smith    +emsg+'*********************************************************************************\n'
236e9f3bb17SBarry Smith    se = ''
2379dd2fdb1SMatthew Knepley  except (TypeError, ValueError), e:
2387d670a3cSBarry Smith    emsg = str(e)
23942351d26SSatish Balay    if not emsg.endswith('\n'): emsg = emsg+'\n'
240fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
241fe09c992SBarry Smith    +'                ERROR in COMMAND LINE ARGUMENT to config/configure.py \n' \
242fe09c992SBarry Smith    +'---------------------------------------------------------------------------------------\n'  \
2437d670a3cSBarry Smith    +emsg+'*********************************************************************************\n'
2441a02243aSBarry Smith    se = ''
24596dc2fe8SMatthew Knepley  except ImportError, e :
2467d670a3cSBarry Smith    emsg = str(e)
24742351d26SSatish Balay    if not emsg.endswith('\n'): emsg = emsg+'\n'
248fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
249fe09c992SBarry Smith    +'                     UNABLE to FIND MODULE for config/configure.py \n' \
250fe09c992SBarry Smith    +'---------------------------------------------------------------------------------------\n'  \
2517d670a3cSBarry Smith    +emsg+'*********************************************************************************\n'
25296dc2fe8SMatthew Knepley    se = ''
25301def6f0SMatthew Knepley  except OSError, e :
25401def6f0SMatthew Knepley    emsg = str(e)
25501def6f0SMatthew Knepley    if not emsg.endswith('\n'): emsg = emsg+'\n'
25601def6f0SMatthew Knepley    msg ='*********************************************************************************\n'\
25701def6f0SMatthew Knepley    +'                    UNABLE to EXECUTE BINARIES for config/configure.py \n' \
25801def6f0SMatthew Knepley    +'---------------------------------------------------------------------------------------\n'  \
25901def6f0SMatthew Knepley    +emsg+'*********************************************************************************\n'
26001def6f0SMatthew Knepley    se = ''
261d7d3c4beSMatthew Knepley  except SystemExit, e:
262d7d3c4beSMatthew Knepley    if e.code is None or e.code == 0:
263d7d3c4beSMatthew Knepley      return
264fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
265fe09c992SBarry Smith    +'           CONFIGURATION CRASH  (Please send configure.log to petsc-maint@mcs.anl.gov)\n' \
266fe09c992SBarry Smith    +'*********************************************************************************\n'
267d7d3c4beSMatthew Knepley    se  = str(e)
268e9f3bb17SBarry Smith  except Exception, e:
269fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
270fe09c992SBarry Smith    +'          CONFIGURATION CRASH  (Please send configure.log to petsc-maint@mcs.anl.gov)\n' \
271fe09c992SBarry Smith    +'*********************************************************************************\n'
272e9f3bb17SBarry Smith    se  = str(e)
273e9f3bb17SBarry Smith
274e9f3bb17SBarry Smith  print msg
2759dd2fdb1SMatthew Knepley  if not framework is None:
2769dd2fdb1SMatthew Knepley    framework.logClear()
277e9f3bb17SBarry Smith    if hasattr(framework, 'log'):
278f6614063SBarry Smith      import traceback
279f24f64feSBarry Smith      framework.log.write(msg+se)
280f24f64feSBarry Smith      traceback.print_tb(sys.exc_info()[2], file = framework.log)
2812418bae5SMatthew Knepley      if os.path.isfile(framework.logName+'.bkp'):
2825a74f024SMatthew Knepley        if framework.debugIndent is None:
2835a74f024SMatthew Knepley          framework.debugIndent = '  '
2842418bae5SMatthew Knepley        framework.logPrintDivider()
2852418bae5SMatthew Knepley        framework.logPrintBox('Previous configure logs below', debugSection = None)
2862418bae5SMatthew Knepley        f = file(framework.logName+'.bkp')
2872418bae5SMatthew Knepley        framework.log.write(f.read())
2882418bae5SMatthew Knepley        f.close()
289e9f3bb17SBarry Smith      sys.exit(1)
2905a74f024SMatthew Knepley  else:
2915a74f024SMatthew Knepley    print se
2925a74f024SMatthew Knepley    import traceback
2935a74f024SMatthew Knepley    traceback.print_tb(sys.exc_info()[2])
2945d5a5a7bSMatthew Knepley
2955d5a5a7bSMatthew Knepleyif __name__ == '__main__':
296a030c540SBarry Smith  petsc_configure([])
297759acf64SBarry Smith
298