def clean (self): l_path = os.path.join (self._project_path, "EIFGENs", self._target) SystemLogger.info ("Cleaning Eiffel program at " + l_path) elocation.delete (l_path) l_path = os.path.dirname (l_path) if os.listdir (l_path) == []: elocation.delete (l_path)
def fix_makefiles (src_glob_raw, link_command): for orig in glob.iglob(os.path.expandvars (src_glob_raw)): SystemLogger.info ("Fixing makefile: " + orig) fixed = orig + ".tmp" with open (fixed, 'w') as fixed_file: with open (orig) as orig_file: for line in orig_file: fixed_file.write (line.replace ('LINKCMD = $(CC)', 'LINKCMD = ' + link_command)) elocation.delete (orig) elocation.move (fixed, orig)
def test_location(): elocation.move ("eve", "eve2") elocation.copy ("eve2", "eve3") elocation.delete ("eve3") elocation.move ("eve2", "eve") print (elocation.base_directory()) print (elocation.trunk_source()) print (elocation.eve_source()) print (elocation.eweasel()) print (elocation.nightly()) print (elocation.build()) print (elocation.eweasel_build())
def update_EiffelStudio(): SystemLogger.info("Updating EiffelStudio") if v_force_es_version != None: SystemLogger.warning("Forcing EiffelStudio version " + v_force_es_version) name, filename, version, url = get_nightly_build(d_ise_platform, d_archive_extension) current_version, current_path = get_installed_version() if version > current_version or (v_force_es_version != None and current_version != v_force_es_version): target_file = os.path.join(v_dir_eiffelstudio_base, filename) download_file(url, target_file) eutils.extract(target_file) elocation.move(os.path.join('.', name), os.path.join(v_dir_eiffelstudio_base, name + '_' + str(version))) elocation.delete(target_file) update_environment_variables() current_version = version SystemLogger.success("EiffelStudio version " + str(version) + " installed") else: update_environment_variables() SystemLogger.success("EiffelStudio is up-to-date at version " + str(current_version)) return current_version
def make_merge(): global v_dir_eve_source # set up parameters merge_path = os.path.realpath(v_dir_merge) v_dir_eve_source = os.path.join(merge_path, 'Src') os.environ['EIFFEL_SRC'] = v_dir_eve_source os.environ['ISE_LIBRARY'] = v_dir_eve_source # update dependencies update_EiffelStudio() # update repository try: elocation.delete(merge_path) esvn.update_repository(v_url_svn_eve, merge_path) except Exception as e1: SystemLogger.warning("Checkout failed. Trying one more time.") send_mail(v_email_merge_info, "[EVE] WARNING: checkout failed", "I will try again.") try: elocation.delete(merge_path) esvn.update_repository(v_url_svn_eve, merge_path) except Exception as e2: SystemLogger.error("Checkout failed, again...") send_mail(v_email_merge_info, "[EVE] ERROR: checkout failed again", "I give up...") sys.exit(0) # send email to block commits send_mail(v_email_merge_update, '[EVE] merge started', """Dear assistants, The eve branch is being synchronized with the trunk. Please do not commit to the eve branch until the synchronization is complete. Regards, EVE""") # merge trunk_revision = esvn.info_remote_revision_number(v_url_svn_trunk) last_merge_revision = esvn.last_merge_revision_number(v_url_svn_eve) esvn.merge(merge_path, v_url_svn_trunk, pysvn.Revision(pysvn.opt_revision_kind.number, last_merge_revision), pysvn.Revision(pysvn.opt_revision_kind.number, trunk_revision)) # wait for conflicts to be resolved success = not esvn.has_conflicts(merge_path) first = True while not success: if first: first = False SystemLogger.error("Merge has produced conflicts") send_mail(v_email_merge_info, "[EVE] WAITING: merge produced conflicts", "Resolve conflicts manually and then continue script.") else: SystemLogger.error("There are still conflits!") print ("---") print ("Press enter when conflicts are resolved.") input() success = not esvn.has_conflicts(merge_path) SystemLogger.success("Merge successful") # compile check_environment_variables() compile_runtime() compile_eve('bench') # wait for compilation to be successful success = is_eve_compilation_successful('bench') first = True while not success: if first: first = False SystemLogger.error("EVE compilation failed") send_mail(v_email_merge_info, "[EVE] WAITING: EVE compilation failed", "Solve compilation problems manually and then continue script.") else: SystemLogger.error("compilation still fails!") print ("---") print ("Press enter when compilation problems are resolved.") input() if not is_eve_compilation_successful('bench'): compile_runtime() compile_eve('bench') success = is_eve_compilation_successful('bench') SystemLogger.success("Compilation successful") # commit message = "<<Merged from trunk#" + str(trunk_revision) + ".>>" esvn.commit(merge_path, message) first = True esvn.update (merge_path, True) while esvn.info_local_revision_number(merge_path) <= trunk_revision and False: #??? if first: first = False SystemLogger.error("EVE commit failed") send_mail(v_email_merge_info, "[EVE] WAITING: commit failed", "Commit manually and then continue script.") else: SystemLogger.error("Local revision (" + str(esvn.info_local_revision_number(merge_path)) + ") still smaller than TRUNK (" + str(trunk_revision) + ")") print ("---") print ("Press enter when you have commited the repository manually.") print ("Commit message: " + message) input() esvn.update (merge_path, true) SystemLogger.success("Commit successful") # make delivery delivery_url = make_delivery() version, path = get_installed_version() # send email if delivery_url == None: send_mail(v_email_merge_update, "[EVE] merge completed with trunk#" + str(trunk_revision) + ".", """Dear assistants, The eve branch is now synchronized with trunk#""" + str(trunk_revision) + """ using EiffelStudio """ + str(version) + """. You can now update your checkout of eve and commit again. Regards, EVE""") send_mail(v_email_merge_info, "[EVE] Delivery creation failed", "See log for more information.") else: send_mail(v_email_merge_update, "[EVE] merge completed with trunk#" + str(trunk_revision) + " and new delivery available.", """Dear assistants, The eve branch is now synchronized with trunk#""" + str(trunk_revision) + """ using EiffelStudio """ + str(version) + """. You can now update your checkout of eve and commit again. A """ + d_ise_platform + """ delivery of EVE has been created and is available at """ + delivery_url + """ Regards, EVE""")
def make_delivery(): SystemLogger.info("Generating new delivery") eve_version = esvn.info_local_revision_number(v_dir_eve_source) #TODO delivery_name = 'eve_' + str(eve_version) delivery_path = os.path.realpath(os.path.join(v_dir_delivery, delivery_name)) # generate finalized version check_environment_variables() compile_runtime() update_version_number() finalize_eve('bench') revert_version_number() # copy EiffelStudio to delivery destination (this copies the runtime) elocation.copy(os.getenv("ISE_EIFFEL"), delivery_path) # copy finalized eve to delivery destination eve_exe_source = os.path.join(v_dir_eve_source, 'Eiffel', 'Ace', 'EIFGENs', 'bench', 'F_code', d_eve_exe_name) eve_exe_target = os.path.join(delivery_path, 'studio', 'spec', os.getenv("ISE_PLATFORM"), 'bin', d_eve_exe_name) elocation.copy(eve_exe_source, eve_exe_target) # AutoProof: copy update to base library source = os.path.join(v_dir_eve_source, 'library', 'base', 'eve') target = os.path.join(delivery_path, 'library', 'base', 'eve') elocation.copy(source, target) source = os.path.join(v_dir_eve_source, 'library', 'base', 'base2') target = os.path.join(delivery_path, 'library', 'base', 'base2') elocation.copy(source, target) source = os.path.join(v_dir_eve_source, 'library', 'base', 'mml') target = os.path.join(delivery_path, 'library', 'base', 'mml') elocation.copy(source, target) source = os.path.join(v_dir_eve_source, 'library', 'base', 'base-eve.ecf') target = os.path.join(delivery_path, 'library', 'base', 'base-eve.ecf') elocation.copy(source, target) # AutoProof: copy ecf for precompile source = os.path.join(v_dir_eve_source, 'Delivery', 'precomp', 'spec', 'platform', 'base-eve.ecf') target = os.path.join(delivery_path, 'precomp', 'spec', os.getenv("ISE_PLATFORM"), 'base-eve.ecf') elocation.copy(source, target) # AutoProof: copy Boogie files source = os.path.join(v_dir_eve_source, 'Delivery', 'studio', 'tools', 'autoproof') target = os.path.join(delivery_path, 'studio', 'tools', 'autoproof') elocation.copy(source, target) # copy Boogie to delivery destination boogie_target = os.path.join(delivery_path, 'studio', 'tools', 'boogie') elocation.copy(v_dir_boogie, boogie_target) # copy libraries to delivery destination source = os.path.join(v_dir_eve_source, 'library', 'fixing') target = os.path.join(delivery_path, 'library', 'fixing') elocation.copy(source, target) # TODO # copy install/run scripts to destination source = os.path.join(v_dir_eve_source, 'Delivery', 'run_eve.bat') target = os.path.join(delivery_path, 'run_eve.bat') elocation.copy(source, target) source = os.path.join(v_dir_eve_source, 'Delivery', 'run_eve.py') target = os.path.join(delivery_path, 'run_eve.py') elocation.copy(source, target) # generate zip archive archive_path = eutils.compress(delivery_path, delivery_name + "-" + d_ise_platform) delivery_file = os.path.join(v_dir_delivery, os.path.basename(archive_path)) elocation.move(archive_path, delivery_file) # clean up elocation.delete(delivery_path) SystemLogger.success("Delivery " + delivery_name + " finished") # upload zip to server result = None if os.path.exists(v_dir_delivery_remote): remote_file = os.path.join(v_dir_delivery_remote, os.path.basename(delivery_file)) elocation.copy(delivery_file, remote_file) SystemLogger.success("Delivery copied to remote location") result = v_remote_base_url + '/' + os.path.basename(delivery_file) else: if v_dir_delivery_remote != None: SystemLogger.error("Remote location (" + v_dir_delivery_remote + ") does not exist") return result
def compile_runtime(): builddir = os.path.join (elocation.build(), "runtime") build_libdir = None sourcedir = os.path.join (elocation.trunk_source(), "C") scriptdir = os.path.join (elocation.base_directory(), "scripts") shell_command = os.path.expandvars (d_shell_command_raw) # TODO: Incremental compilation. copy_files (os.path.join (scriptdir, "*lua*"), sourcedir) elocation.delete (os.path.join (sourcedir, "config.sh")) config_sh = os.environ ["ISE_PLATFORM"] old_path = os.environ ["PATH"] if config_sh == 'win64': os.environ ["PATH"] = os.path.dirname (shell_command) + ':' + old_path config_sh = 'windows-x86-64-' + os.environ ['ISE_C_COMPILER'] if config_sh == 'win32': os.environ ["PATH"] = dirname (shell_command) + ':' + old_path config_sh = 'windows-x86-' + os.environ ['ISE_C_COMPILER'] elocation.copy (os.path.expandvars (os.path.join (sourcedir, "CONFIGS", config_sh)), os.path.join (sourcedir, "config.sh")) run_command ([shell_command, "config_lua.SH"], sourcedir) run_command ([shell_command, "eif_config_h.SH"], sourcedir) run_command ([shell_command, "eif_size_h.SH"], os.path.join (sourcedir, "run-time")) copy_files (os.path.join (sourcedir, "*.h"), os.path.join (sourcedir, "run-time")) os.environ ['PATH'] = old_path if platform.system() == 'Windows': # Shell and Nmake based build system: run_command ([os.path.join(sourcedir, "Configure.bat"), "clean"], sourcedir) run_command ([os.path.join(sourcedir, "Configure.bat"), d_windows_runtime_flag, 'm'], sourcedir) l_config_location = os.path.expandvars (os.path.join("$ISE_EIFFEL", "studio", "config", "$ISE_PLATFORM", "$ISE_C_COMPILER")) copy_files (os.path.join (sourcedir, "config.sh"), l_config_location) build_libdir = os.path.join (sourcedir, 'run-time', 'LIB') # Premake based build system: # run_command ([os.path.join (sourcedir, 'premake4.exe'), "vs2010"], sourcedir) # run_command (['msbuild.exe', 'EiffelRunTime.sln', '/upgrade'], builddir) # run_command (["msbuild.exe", "EiffelRunTime.sln"], builddir) # build_libdir = os.path.join (builddir, 'spec', 'lib') else: # Shell and make based build system: # run_command (["make", "clobber"], sourcedir) # run_command (["./quick_configure"], sourcedir) # build_libdir = os.path.join (sourcedir, 'run-time') # Premake based build system: # NOTE: This is a workaround for a current problem: # Two files are called stack.c # We therefore create a symlink between these files. l_stack_ipc = os.path.join (sourcedir, "ipc", "shared", "stack_ipc.c") if not os.path.exists (l_stack_ipc): os.symlink (os.path.join (os.path.dirname (l_stack_ipc), "stack.c"), l_stack_ipc) if os.path.exists (os.path.join (builddir, "Makefile")): run_command (["make", "clean"], builddir) run_command (["premake4", "gmake"], sourcedir) #TODO: Get the correct link_command from config.sh (sharedlink Bash variable) fix_makefiles (os.path.join (builddir, "*_shared.make"), 'ld') make_command = ["make"] #make_command = make_command + ["config=release"] # Release #make_command = make_command + ["verbose=y"] # Verbose output run_command (make_command, builddir) copy_files (os.path.join (sourcedir, "config.sh"), d_target_includedir_raw) build_libdir = os.path.join (builddir, "spec", "lib") # Copy public header files and all run-times. copy_files (os.path.join (sourcedir, "run-time", "*.h"), d_target_includedir_raw) copy_files (os.path.join (sourcedir, "run-time", "eif_stack.decl"), d_target_includedir_raw) copy_files (os.path.join (sourcedir, "run-time", "eif_stack.interface"), d_target_includedir_raw) copy_files (os.path.join (build_libdir, "*finalized.*"), d_target_libdir_raw) copy_files (os.path.join (build_libdir, "*wkbench.*"), d_target_libdir_raw) # Compile the various C support libraries needed by Eiffel libraries. compile_libraries (d_platform_libs) compile_libraries (d_shared_libs)