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