xref: /petsc/config/configure.py (revision 1a7845074b6b73dcfc41fcb3580a8f5415d0da27)
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 '================================================================================='
62e6985bf0SSatish Balay      print ' *** Incomplete cygwin install detected . Either /usr/bin/make or /usr/bin/diff **'
63e6985bf0SSatish Balay      print ' *** is missing. Please rerun cygwin-setup and select module "make" **************'
64e6985bf0SSatish 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
1065d4be62bSBarry Smith  foundsudo = 0
1075d4be62bSBarry Smith  for l in range(0,len(sys.argv)):
1085d4be62bSBarry Smith    if sys.argv[l] == '--with-sudo=sudo':
1095d4be62bSBarry Smith      foundsudo = 1
1105d4be62bSBarry Smith
111ed6a7445SBarry Smith  for l in range(0,len(sys.argv)):
112c22cdea9SBarry Smith    name = sys.argv[l]
113637cc2ebSSatish Balay    if name.find('enable-') >= 0:
114193cd51eSMatthew Knepley      if name.find('=') == -1:
115193cd51eSMatthew Knepley        sys.argv[l] = name.replace('enable-','with-')+'=1'
116193cd51eSMatthew Knepley      else:
117193cd51eSMatthew Knepley        head, tail = name.split('=', 1)
118193cd51eSMatthew Knepley        sys.argv[l] = head.replace('enable-','with-')+'='+tail
119637cc2ebSSatish Balay    if name.find('disable-') >= 0:
120193cd51eSMatthew Knepley      if name.find('=') == -1:
121193cd51eSMatthew Knepley        sys.argv[l] = name.replace('disable-','with-')+'=0'
122193cd51eSMatthew Knepley      else:
123193cd51eSMatthew Knepley        head, tail = name.split('=', 1)
124193cd51eSMatthew Knepley        if tail == '1': tail = '0'
125193cd51eSMatthew Knepley        sys.argv[l] = head.replace('disable-','with-')+'='+tail
126637cc2ebSSatish Balay    if name.find('without-') >= 0:
127193cd51eSMatthew Knepley      if name.find('=') == -1:
128193cd51eSMatthew Knepley        sys.argv[l] = name.replace('without-','with-')+'=0'
129193cd51eSMatthew Knepley      else:
130193cd51eSMatthew Knepley        head, tail = name.split('=', 1)
131193cd51eSMatthew Knepley        if tail == '1': tail = '0'
132193cd51eSMatthew Knepley        sys.argv[l] = head.replace('without-','with-')+'='+tail
1335d4be62bSBarry Smith    if name.find('prefix=') >= 0 and not foundsudo:
1345d4be62bSBarry Smith      head, installdir = name.split('=', 1)
1355d4be62bSBarry Smith      if os.path.exists(installdir):
1365d4be62bSBarry Smith        if not os.access(installdir,os.W_OK):
1375d4be62bSBarry Smith          print 'You do not have write access to requested install directory given with --prefix='+installdir+' perhaps use --with-sudo=sudo also'
1385d4be62bSBarry Smith          sys.exit(3)
1395d4be62bSBarry Smith      else:
1405d4be62bSBarry Smith         try:
1415d4be62bSBarry Smith           os.mkdir(installdir)
1425d4be62bSBarry Smith         except:
1435d4be62bSBarry Smith           print 'You do not have write access to create install directory given with --prefix='+installdir+' perhaps use --with-sudo=sudo also'
1445d4be62bSBarry Smith           sys.exit(3)
1455d4be62bSBarry Smith
146c22cdea9SBarry Smith
147adc3e427SMatthew Knepley  # Check for sudo
148adc3e427SMatthew Knepley  if os.getuid() == 0:
149adc3e427SMatthew Knepley    print '================================================================================='
150adc3e427SMatthew Knepley    print '             *** Do not run configure as root, or using sudo. ***'
15167e28bfeSBarry Smith    print '             *** Use the --with-sudo=sudo option to have      ***'
15267e28bfeSBarry Smith    print '             *** installs of external packages done with sudo ***'
15367e28bfeSBarry Smith    print '             *** use only with --prefix= when installing in   ***'
15467e28bfeSBarry Smith    print '             *** system directories                           ***'
155adc3e427SMatthew Knepley    print '================================================================================='
156adc3e427SMatthew Knepley    sys.exit(3)
157adc3e427SMatthew Knepley
1589dabcff0SSatish Balay  # Check for broken cygwin
15985ef4d1eSSatish Balay  if chkbrokencygwin():
160ec1ee742SBarry Smith    print '================================================================================='
1617d670a3cSBarry Smith    print ' *** cygwin-1.5.11-1 detected. config/configure.py fails with this version   ***'
1621e42869aSSatish Balay    print ' *** Please upgrade to cygwin-1.5.12-1 or newer version. This can  ***'
1631e42869aSSatish Balay    print ' *** be done by running cygwin-setup, selecting "next" all the way.***'
164ec1ee742SBarry Smith    print '================================================================================='
1659dabcff0SSatish Balay    sys.exit(3)
166d65f3bddSMatthew Knepley
167cd8c7a90SSatish Balay  # Check if cygwin install is incomplete
168cd8c7a90SSatish Balay  chkincompletecygwin()
169cd8c7a90SSatish Balay
170d65f3bddSMatthew Knepley  # Disable threads on RHL9
171d65f3bddSMatthew Knepley  if rhl9():
172d65f3bddSMatthew Knepley    sys.argv.append('--useThreads=0')
173d65f3bddSMatthew Knepley    extraLogs.append('''\
174d65f3bddSMatthew Knepley================================================================================
175d65f3bddSMatthew Knepley   *** RHL9 detected. Threads do not work correctly with this distribution ***
176d65f3bddSMatthew Knepley    ****** Disabling thread usage for this run of config/configure.py *******
177d65f3bddSMatthew Knepley================================================================================''')
178fd0ecfceSSatish Balay
179fd0ecfceSSatish Balay  # Check for broken diff on Fedora8
180fd0ecfceSSatish Balay  if chkBrokenF8Diff():
181fd0ecfceSSatish Balay    print '================================================================================='
182fd0ecfceSSatish Balay    print ' *** Fedora 8 Linux with broken diffutils-2.8.1-17.fc8 detected. ****************'
183fd0ecfceSSatish Balay    print ' *** Please run "sudo yum update diffutils" to get the latest bugfixed version.**'
184fd0ecfceSSatish Balay    print '================================================================================='
185fd0ecfceSSatish Balay    sys.exit(3)
186fd0ecfceSSatish Balay
18785ef4d1eSSatish Balay  # Make sure cygwin-python is used on windows
18885ef4d1eSSatish Balay  if chkusingwindowspython():
18985ef4d1eSSatish Balay    print '================================================================================='
19085ef4d1eSSatish Balay    print ' *** Non-cygwin python detected. Please rerun config/configure.py with cygwin-python ***'
19185ef4d1eSSatish Balay    print '================================================================================='
19285ef4d1eSSatish Balay    sys.exit(3)
193d65f3bddSMatthew Knepley
19485ef4d1eSSatish Balay  # Threads don't work for cygwin & python-2.4, 2.5 etc..
19585ef4d1eSSatish Balay  if chkcygwinpythonver():
19671384062SSatish Balay    sys.argv.append('--useThreads=0')
197d65f3bddSMatthew Knepley    extraLogs.append('''\
198d65f3bddSMatthew Knepley================================================================================
19985ef4d1eSSatish Balay** Cygwin-python-2.4/2.5 detected. Threads do not work correctly with this version *
200d65f3bddSMatthew Knepley ********* Disabling thread usage for this run of config/configure.py **********
201d65f3bddSMatthew Knepley================================================================================''')
2029dabcff0SSatish Balay
20387282423SMatthew Knepley  # Should be run from the toplevel
204dbca6d9dSSatish Balay  configDir = os.path.abspath('config')
205f8833479SBarry Smith  bsDir     = os.path.join(configDir, 'BuildSystem')
206f8833479SBarry Smith  if not os.path.isdir(configDir):
2075d5a5a7bSMatthew Knepley    raise RuntimeError('Run configure from $PETSC_DIR, not '+os.path.abspath('.'))
20887282423SMatthew Knepley  if not os.path.isdir(bsDir):
209ec1ee742SBarry Smith    print '================================================================================='
210dbca6d9dSSatish Balay    print '''++ Could not locate BuildSystem in %s.''' % configDir
211dbca6d9dSSatish Balay    print '''++ Downloading it using "hg clone http://hg.mcs.anl.gov/petsc/BuildSystem %s"''' % bsDir
212ec1ee742SBarry Smith    print '================================================================================='
213dbca6d9dSSatish Balay    (status,output) = commands.getstatusoutput('hg clone http://petsc.cs.iit.edu/petsc/BuildSystem '+ bsDir)
2147d7624c9SBarry Smith    if status:
2157d7624c9SBarry Smith      if output.find('ommand not found') >= 0:
216ec1ee742SBarry Smith        print '================================================================================='
21759dc5438SMatthew Knepley        print '''** Unable to locate hg (Mercurial) to download BuildSystem; make sure hg is in your path'''
218ab21cac3SMatthew Knepley        print '''** or manually copy BuildSystem to $PETSC_DIR/config/BuildSystem from a machine where'''
21959dc5438SMatthew Knepley        print '''** you do have hg installed and can clone BuildSystem. '''
220ec1ee742SBarry Smith        print '================================================================================='
2217d7624c9SBarry Smith      elif output.find('Cannot resolve host') >= 0:
222ec1ee742SBarry Smith        print '================================================================================='
223d688700cSSatish Balay        print '''** Unable to download BuildSystem. You must be off the network.'''
224d688700cSSatish Balay        print '''** Connect to the internet and run config/configure.py again.'''
225ec1ee742SBarry Smith        print '================================================================================='
2267d7624c9SBarry Smith      else:
227ec1ee742SBarry Smith        print '================================================================================='
228d688700cSSatish Balay        print '''** Unable to download BuildSystem. Please send this message to petsc-maint@mcs.anl.gov'''
229ec1ee742SBarry Smith        print '================================================================================='
2307d7624c9SBarry Smith      print output
23187282423SMatthew Knepley      sys.exit(3)
2324f8a5b45SBarry Smith
23387282423SMatthew Knepley  sys.path.insert(0, bsDir)
234f8833479SBarry Smith  sys.path.insert(0, configDir)
235e69ef9dfSMatthew Knepley  import config.base
2365d5a5a7bSMatthew Knepley  import config.framework
237f56be888SMatthew Knepley  import cPickle
2384f8a5b45SBarry Smith
2392e22a60eSMatthew Knepley  # Disable shared libraries by default
2402e22a60eSMatthew Knepley  import nargs
2412e22a60eSMatthew Knepley  if nargs.Arg.findArgument('with-shared', sys.argv[1:]) is None:
2422e22a60eSMatthew Knepley    sys.argv.append('--with-shared=0')
2432e22a60eSMatthew Knepley
2449dd2fdb1SMatthew Knepley  framework = None
2459dd2fdb1SMatthew Knepley  try:
246*1a784507SMatthew Knepley    framework = config.framework.Framework(['--configModules=PETSc.Configure','--optionsModule=PETSc.compilerOptions']+sys.argv[1:], loadArgDB = 0)
247d65f3bddSMatthew Knepley    framework.setup()
248d65f3bddSMatthew Knepley    framework.logPrint('\n'.join(extraLogs))
249f24f64feSBarry Smith    framework.configure(out = sys.stdout)
250358ebc22SMatthew Knepley    framework.storeSubstitutions(framework.argDB)
251f56be888SMatthew Knepley    framework.argDB['configureCache'] = cPickle.dumps(framework)
2527cfd0b05SBarry Smith    import PETSc.packages
2537cfd0b05SBarry Smith    for i in framework.packages:
2547cfd0b05SBarry Smith      if hasattr(i,'postProcess'):
2557cfd0b05SBarry Smith        i.postProcess()
2567cfd0b05SBarry Smith    framework.logClear()
257eefa2c0fSBarry Smith    framework.closeLog()
258*1a784507SMatthew Knepley    if hasattr(framework, 'arch'):
259eefa2c0fSBarry Smith      import shutil
260eefa2c0fSBarry Smith      shutil.move(framework.logName,os.path.join(framework.arch,'conf',framework.logName))
261dd50d019SBarry Smith    return 0
262e69ef9dfSMatthew Knepley  except (RuntimeError, config.base.ConfigureSetupError), e:
2637d670a3cSBarry Smith    emsg = str(e)
26442351d26SSatish Balay    if not emsg.endswith('\n'): emsg = emsg+'\n'
265fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
266fe09c992SBarry Smith    +'         UNABLE to CONFIGURE with GIVEN OPTIONS    (see configure.log for details):\n' \
267fe09c992SBarry Smith    +'---------------------------------------------------------------------------------------\n'  \
2687d670a3cSBarry Smith    +emsg+'*********************************************************************************\n'
269e9f3bb17SBarry Smith    se = ''
2709dd2fdb1SMatthew Knepley  except (TypeError, ValueError), e:
2717d670a3cSBarry Smith    emsg = str(e)
27242351d26SSatish Balay    if not emsg.endswith('\n'): emsg = emsg+'\n'
273fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
274fe09c992SBarry Smith    +'                ERROR in COMMAND LINE ARGUMENT to config/configure.py \n' \
275fe09c992SBarry Smith    +'---------------------------------------------------------------------------------------\n'  \
2767d670a3cSBarry Smith    +emsg+'*********************************************************************************\n'
2771a02243aSBarry Smith    se = ''
27896dc2fe8SMatthew Knepley  except ImportError, e :
2797d670a3cSBarry Smith    emsg = str(e)
28042351d26SSatish Balay    if not emsg.endswith('\n'): emsg = emsg+'\n'
281fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
282fe09c992SBarry Smith    +'                     UNABLE to FIND MODULE for config/configure.py \n' \
283fe09c992SBarry Smith    +'---------------------------------------------------------------------------------------\n'  \
2847d670a3cSBarry Smith    +emsg+'*********************************************************************************\n'
28596dc2fe8SMatthew Knepley    se = ''
28601def6f0SMatthew Knepley  except OSError, e :
28701def6f0SMatthew Knepley    emsg = str(e)
28801def6f0SMatthew Knepley    if not emsg.endswith('\n'): emsg = emsg+'\n'
28901def6f0SMatthew Knepley    msg ='*********************************************************************************\n'\
29001def6f0SMatthew Knepley    +'                    UNABLE to EXECUTE BINARIES for config/configure.py \n' \
29101def6f0SMatthew Knepley    +'---------------------------------------------------------------------------------------\n'  \
29201def6f0SMatthew Knepley    +emsg+'*********************************************************************************\n'
29301def6f0SMatthew Knepley    se = ''
294d7d3c4beSMatthew Knepley  except SystemExit, e:
295d7d3c4beSMatthew Knepley    if e.code is None or e.code == 0:
296d7d3c4beSMatthew Knepley      return
297fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
298fe09c992SBarry Smith    +'           CONFIGURATION CRASH  (Please send configure.log to petsc-maint@mcs.anl.gov)\n' \
299fe09c992SBarry Smith    +'*********************************************************************************\n'
300d7d3c4beSMatthew Knepley    se  = str(e)
301e9f3bb17SBarry Smith  except Exception, e:
302fe09c992SBarry Smith    msg ='*********************************************************************************\n'\
303fe09c992SBarry Smith    +'          CONFIGURATION CRASH  (Please send configure.log to petsc-maint@mcs.anl.gov)\n' \
304fe09c992SBarry Smith    +'*********************************************************************************\n'
305e9f3bb17SBarry Smith    se  = str(e)
306e9f3bb17SBarry Smith
307e9f3bb17SBarry Smith  print msg
3089dd2fdb1SMatthew Knepley  if not framework is None:
3099dd2fdb1SMatthew Knepley    framework.logClear()
310e9f3bb17SBarry Smith    if hasattr(framework, 'log'):
311f6614063SBarry Smith      import traceback
312f24f64feSBarry Smith      framework.log.write(msg+se)
313f24f64feSBarry Smith      traceback.print_tb(sys.exc_info()[2], file = framework.log)
3142418bae5SMatthew Knepley      if os.path.isfile(framework.logName+'.bkp'):
3155a74f024SMatthew Knepley        if framework.debugIndent is None:
3165a74f024SMatthew Knepley          framework.debugIndent = '  '
3172418bae5SMatthew Knepley        framework.logPrintDivider()
3182418bae5SMatthew Knepley        framework.logPrintBox('Previous configure logs below', debugSection = None)
3192418bae5SMatthew Knepley        f = file(framework.logName+'.bkp')
3202418bae5SMatthew Knepley        framework.log.write(f.read())
3212418bae5SMatthew Knepley        f.close()
322e9f3bb17SBarry Smith      sys.exit(1)
3235a74f024SMatthew Knepley  else:
3245a74f024SMatthew Knepley    print se
3255a74f024SMatthew Knepley    import traceback
3265a74f024SMatthew Knepley    traceback.print_tb(sys.exc_info()[2])
3275d5a5a7bSMatthew Knepley
3285d5a5a7bSMatthew Knepleyif __name__ == '__main__':
329a030c540SBarry Smith  petsc_configure([])
330759acf64SBarry Smith
331