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