Source code for flash.flmake.setup

# Python imports
import os
import sys
import re
import shutil
import types
import glob
import socket
import math
import json
import warnings

# local imports
# relative imports needed!
from .. import FLASH_SRC_DIR, _metadata
from ..utils import warning, message
from . import setup_parse
from . import setup_globals
from .setup_globals import gvars, SetupError
from .utils import dir_glob, determine_machine, search_paths, get_rel_path, \
     desc_cmd_metadata
from .lib_union import LibUnion
from .link_file_list import LinkFileList
from .setup_configuration import ConfigurationList
from .gen_files import generate_flash_defines, generate_makefile, \
     write_simulation_files, generate_pm3rp_defines, generate_buildstamp_generator

RUNTIME_FILES = ["flash.par", setup_globals.PM3_RP_FILENAME]

[docs]def base_setup_main(opts, rc, msg): """Does the heavy lifting for the setup command.""" global RUNTIME_FILES # this is not a threaded application sys.setcheckinterval(10000) cwdir = os.getcwd() # setup.py is FLASH_HOME/bin/setup.py # FLASH_HOME is the parent of directory having setup.py if FLASH_SRC_DIR: # New behaviour flash_home = FLASH_SRC_DIR else: # Old behavior flash_home = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0]))) # Initialize other related directory names gvars.init(flash_home) # parse the command line arguments. The effect of calling # this method is to set a lot of values in 'gvars' setup_parse.parse() # Proceed with other stuff machdir = determine_machine() # A class which encapsulates operations of unit collections warnings.simplefilter('ignore') # suppress the warnings in the config files unit_list = ConfigurationList() # Add local setup dir lsetdir = os.path.join(cwdir, gvars.project_setup_dir) if not os.path.isdir(lsetdir): os.mkdir(lsetdir) gvars.project_setup_dir = lsetdir # copy over the user specified units file if gvars.unitsfile: sname = os.path.join(gvars.flash_src_dir, gvars.unitsfile) tname = os.path.join(gvars.project_setup_dir, setup_globals.UNITS_FILENAME) shutil.copy(sname, tname) # generate and write an automatic "Units" file if gvars.auto: unit_list.generate_units_file() # read units file, satisfy requirement and all the good stuf unit_list.populate() # adjust values of command line options based on units used # this is the only place the setup script uses its knowledge # about Flash Units and what they do unit_list.adjust_opts() setup_parse.final() # create the object which does stuff relating to linking files link_list = LinkFileList(lsetdir) # Combine info from all Config files config_info = unit_list.get_config_info() # get Runtime Paramas info rp_info = unit_list.get_rp_info(config_info.max_plot_vars) # get info regarding all variables var_info = unit_list.get_var_info() # Add library options to config_info for key in gvars.with_libraries.keys(): if key not in config_info.library: config_info.library[key] = [] config_info.library[key].append(gvars.with_libraries[key]) # Now handle libraries depending on other libraries # ConfigInfo.lib_config_info is a dictionary mapping # libraries to their config information # also CLASS.libOrder is a list of pairs (libname, args) # This order is important due to linker invocation order config_info.lib_config_info = LibUnion(config_info.library) # write out lib data to setup_libraries config_info.lib_config_info.write_libraries() # only now is noClobber flag stable link_list.clean_setup_dir() # remove the success file try: os.unlink(setup_globals.SUCCESS_FILENAME) except OSError: pass # write Fortran code for RP support rp_info.write_code(config_info) # find files which should not be linked link_list.get_dont_link_list(unit_list.get_list(), config_info.linkif) # get_link_order does the fancy sorting of unitnames for unitname in unit_list.get_link_order(): link_list.link_files(unit_list.units[unitname].unitpath) link_list.link_files(os.path.join(gvars.flash_src_dir, 'sites')) # Link in the right version of the make file # attempt to find Makefile in FLASH root directory, otherwise link make file from sites makefile_path_root = os.path.join(flash_home, "Makefile.h" + gvars.makefileext) makefile_path_sites = os.path.join(machdir, "Makefile.h" + gvars.makefileext) if os.path.isfile(makefile_path_root): link_list.add_link(makefile_path_root, os.path.join(gvars.project_setup_dir, "Makefile.h")) print "Using Makefile.h: " + makefile_path_root else: link_list.add_link(makefile_path_sites, os.path.join(gvars.project_setup_dir, "Makefile.h")) print "Using Makefile.h: " + makefile_path_sites # functions in the simulations dir override earlier instances sim_dir = search_paths(gvars.simulations_path, gvars.simulation_name) sim_location = os.path.split(sim_dir)[0] link_list.link_files(sim_location) # functions from LINKIF statements override everything else, # assuming their conditions apply. link_list.do_linkif_overrides(unit_list.get_list(), config_info.linkif) # now is when we do the real link/copying link_list.really_link() # # Makefiles # test_src = os.path.join(gvars.flash_src_dir, 'tools', 'scripts', 'testing', 'precision_test', 'precision_test.F90') if os.path.isfile(test_src): shutil.copy(test_src, gvars.project_setup_dir) # FIXME merge with create_makefiles gvars.out.put('creating Makefiles for all units', setup_globals.INFO) unit_list.create_makefiles() gvars.out.put('generating buildstamp generator', setup_globals.INFO) generate_buildstamp_generator() gvars.out.put('copying release accessor function Makefile', setup_globals.INFO) shutil.copy(os.path.join(gvars.flash_src_dir, 'bin', 'make_release'), gvars.project_setup_dir) gvars.out.put('copying buildstats accessor function Makefile', setup_globals.INFO) shutil.copy(os.path.join(gvars.flash_src_dir, 'bin', 'make_bstats'), gvars.project_setup_dir) gvars.out.put('copying flashUnits accessor function Makefile', setup_globals.INFO) unit_list.generate_setup_flash_units() shutil.copy(os.path.join(gvars.flash_src_dir, 'bin', 'resetup'), gvars.project_setup_dir) gvars.out.put('copying Dependency generator', setup_globals.INFO) flist = ["setup_depends.py", "setup_addcdepends.py", "setup_reorder.py", "reorder.tpl"] for f in flist: shutil.copy(os.path.join(gvars.flash_src_dir, 'bin', f), gvars.project_setup_dir) gvars.out.put('generating Makefile', setup_globals.IMPINFO) # writes the Makefiles, Flash.h file, and simulation files. generate_makefile(config_info, machdir) generate_flash_defines(config_info) write_simulation_files(config_info) if (gvars.setup_vars.get("ParameshLibraryMode")): generate_pm3rp_defines(config_info) # Copy/link datafiles to object directory if gvars.portable: runtime_link_cmd = lambda real, link: shutil.copy2(real, link) else: cwd = os.getcwd() runtime_link_cmd = lambda real, link: os.symlink(os.path.abspath(real), link) # Fill runtuime files for wildcard in config_info.datafiles: if wildcard.startswith(gvars.project_simulations_dir): RUNTIME_FILES.extend([os.path.abspath(f) for f in glob.glob(wildcard)]) else: RUNTIME_FILES.extend(glob.glob(os.path.join(gvars.source_dir, wildcard))) RUNTIME_FILES = [f for f in RUNTIME_FILES if not f.endswith('.tpl')] for f in RUNTIME_FILES: src_file = os.path.join(sim_dir, f) dst_file = os.path.join(gvars.project_setup_dir, os.path.basename(f)) # special case certain entries if f == 'flash.par' and gvars.parfile: src_file = os.path.join(sim_dir, gvars.parfile) gvars.out.put("Copied {0} as flash.par".format(gvars.parfile), setup_globals.IMPINFO) elif f == setup_globals.PM3_RP_FILENAME: continue # link files if os.path.isfile(src_file) and not os.path.isfile(dst_file): runtime_link_cmd(src_file, dst_file) if RUNTIME_FILES: gvars.out.put('Copying data files: {0} copied'.format(len(RUNTIME_FILES)), setup_globals.IMPINFO) setup_parse.write_cmd_line() unit_list.write_setup_units_file() var_info.write_var_info() # rp stuff rp_info.write_rp_info() rp_info.write_default_par() print message('SUCCESS')
def setup_desc(opts, rc, msg): # Writes the flash description file for setup. desc = {'setup': desc_cmd_metadata()} desc_setup = desc['setup'] desc_setup['datafiles'] = [os.path.basename(f) for f in RUNTIME_FILES] desc_setup['reproducible'] = len(desc_setup['source_version']) != 0 and \ len(desc_setup['project_version']) != 0 if not desc_setup['reproducible']: print warning("Irreproducible: FLASH source and/or project dirs not " "under version control!") with open(gvars.desc_filename, 'w') as f: json.dump(desc, f, indent=2)
[docs]def main(opts, rc, msg): """Initializes a new simulation.""" base_setup_main(opts, rc, msg) setup_desc(opts, rc, msg)
[docs]def script_main(opts, rc, msg): """A version of setup main that closely mimics the the old setup script.""" #base_setup_main(opts, rc, msg) try: base_setup_main(opts, rc, msg) #pass except SetupError, inst: if inst.args: print inst.args[0] sys.exit(1) except KeyboardInterrupt: print '\nuser abort' sys.exit(2) except Exception as e: if hasattr(e, 'dumbuser'): print '\nUser Error!!!\n{0}'.format(e.message) else: print '\nA setup internal error has occured, if possible please email the following' print 'debugging info to flash-bugs@flash.uchicago.edu' print 'Arguments:', sys.argv print 'Python Version: {0}.{1}.{2}'.format(*sys.version_info[:3]) print 'Platform Details: {0}'.format(sys.platform) raise e
if __name__ == '__main__': main([], {}, "")