def build(self): if 'FASTR_RELEASE' not in os.environ: mx.log('FastR: set FASTR_RELEASE to update release project') return # copy the release directories output_dir = self.subject.dir fastr_dir = _fastr_suite.dir for d in ['bin', 'include', 'library', 'etc', 'share', 'doc']: target_dir = join(output_dir, d) if os.path.exists(target_dir): shutil.rmtree(target_dir) shutil.copytree(join(fastr_dir, d), target_dir) lib_fastr_dir = join(fastr_dir, 'lib') lib_output_dir = join(output_dir, 'lib') if os.path.exists(lib_output_dir): shutil.rmtree(lib_output_dir) os.mkdir(lib_output_dir) for f in os.listdir(lib_fastr_dir): source_file = join(lib_fastr_dir, f) target_file = join(lib_output_dir, f) if f != '.DS_Store': if os.path.islink(source_file): os.symlink(os.readlink(source_file), target_file) else: shutil.copy(source_file, target_file) # copyrights copyrights_dir = join(fastr_dir, 'mx.fastr', 'copyrights') with open(join(output_dir, 'COPYRIGHT'), 'w') as outfile: for copyright_file in os.listdir(copyrights_dir): if basename(copyright_file).endswith('copyright.star'): with open(join(copyrights_dir, copyright_file)) as infile: data = infile.read() outfile.write(data) # license/README shutil.copy(join(fastr_dir, 'LICENSE'), output_dir) shutil.copy(join(fastr_dir, 'README.md'), output_dir) # canonicalize R_HOME_DIR in bin/R bin_dir = join(output_dir, 'bin') rcmd = join(bin_dir, 'R') # R is the generic shell script (taken essentially verbatim from GNU R) with open(rcmd) as f: lines = f.readlines() with open(rcmd, 'w') as f: for line in lines: if line.startswith('R_HOME_DIR='): f.write(""" source="${BASH_SOURCE[0]}" while [ -h "$source" ] ; do prev_source="$source" source="$(readlink "$source")"; if [[ "$source" != /* ]]; then # if the link was relative, it was relative to where it came from dir="$( cd -P "$( dirname "$prev_source" )" && pwd )" source="$dir/$source" fi done r_bin="$( cd -P "$( dirname "$source" )" && pwd )" R_HOME_DIR="$( dirname "$r_bin" )" """) elif line.strip() == "#!/bin/sh": f.write("#!/usr/bin/env bash\n") else: f.write(line) # jar files for the launchers jars_dir = join(bin_dir, 'fastr_jars') if not os.path.exists(jars_dir): os.mkdir(jars_dir) # Copy all the jar files needed by the launchers for e in mx.classpath_entries('FASTR'): source_path = e.classpath_repr() if mx.is_cache_path(source_path): target_file_name = e.name.lower().replace('_', '-') + '.jar' else: target_file_name = basename(source_path) assert isfile(source_path) shutil.copy(source_path, join(jars_dir, target_file_name)) # create the classpath string classpath = [] for _, _, jars in os.walk(jars_dir): for jar in jars: classpath.append(join("$R_HOME/bin/fastr_jars", jar)) classpath_string = ":".join(classpath) # replace the mx exec scripts with native Java launchers, setting the classpath from above bin_exec_dir = join(bin_dir, 'exec') r_launcher = join(self.subject.dir, 'src', 'R_legacy') template_dict = {'CLASSPATH': classpath_string} self._template(r_launcher, join(bin_exec_dir, 'R'), template_dict) shutil.rmtree(join(bin_dir, 'execRextras')) rscript_launcher = join(self.subject.dir, 'src', 'Rscript_legacy') self._template(rscript_launcher, join(bin_dir, 'Rscript'), template_dict)
def build(self): # copy the release directories output_dir = self.subject.dir fastr_dir = _fastr_suite.dir for d in ['bin', 'include', 'library', 'etc', 'share', 'doc']: target_dir = join(output_dir, d) source_dir = join(fastr_dir, d) if os.path.exists(target_dir): shutil.rmtree(target_dir) shutil.copytree(source_dir, target_dir) lib_fastr_dir = join(fastr_dir, 'lib') lib_output_dir = join(output_dir, 'lib') if os.path.exists(lib_output_dir): shutil.rmtree(lib_output_dir) os.mkdir(lib_output_dir) for f in os.listdir(lib_fastr_dir): source_file = join(lib_fastr_dir, f) target_file = join(lib_output_dir, f) if f != '.DS_Store': if os.path.islink(source_file): os.symlink(os.readlink(source_file), target_file) else: shutil.copy(source_file, target_file) # copyrights copyrights_dir = join(fastr_dir, 'mx.fastr', 'copyrights') with open(join(output_dir, 'COPYRIGHT'), 'w') as outfile: for copyright_file in os.listdir(copyrights_dir): if basename(copyright_file).endswith('copyright.star'): with open(join(copyrights_dir, copyright_file)) as infile: data = infile.read() outfile.write(data) # license/README shutil.copy(join(fastr_dir, 'LICENSE'), output_dir) shutil.copy(join(fastr_dir, 'README.md'), output_dir) # jar files for the launchers bin_dir = join(output_dir, 'bin') jars_dir = join(bin_dir, 'fastr_jars') if not os.path.exists(jars_dir): os.mkdir(jars_dir) # Copy all the jar files needed by the launchers for e in mx.classpath_entries('FASTR'): source_path = e.classpath_repr() if mx.is_cache_path(source_path): target_file_name = e.name.lower().replace('_', '-') + '.jar' else: target_file_name = basename(source_path) assert isfile(source_path) shutil.copy(source_path, join(jars_dir, target_file_name)) # create the classpath string classpath = [] for _, _, jars in os.walk(jars_dir): for jar in jars: classpath.append(join("$R_HOME/bin/fastr_jars", jar)) classpath_string = ":".join(classpath) # replace the mx exec scripts with native Java launchers, setting the classpath from above bin_exec_dir = join(bin_dir, 'exec') r_launcher = join(self.subject.dir, 'src', 'R_launcher') template_dict = {'CLASSPATH': classpath_string} self._template(r_launcher, join(bin_exec_dir, 'R'), template_dict) shutil.rmtree(join(bin_dir, 'execRextras')) rscript_launcher = join(self.subject.dir, 'src', 'Rscript_launcher') self._template(rscript_launcher, join(bin_dir, 'Rscript'), template_dict)