def isstd(self): ## FIXME: This is an ugly hack because mac uses ## somewhat wonky makefiles if 'mac-pb' in sysinfo.family_list: return 0 amfl = string.lower(self.amf()) return bldreg.get("standard_makefile", amfl, 0)
def isstd(self): ## FIXME: This is an ugly hack because mac uses ## somewhat wonky makefiles if 'mac-pb' in sysinfo.family_list: return 0 amfl=string.lower(self.amf()) return bldreg.get("standard_makefile",amfl,0)
def module_from_file(file): if module_from_file_cache.has_key(file): return module_from_file_cache[file] module = file parts = [] root = [ ":", ".", "", "..","/","\\"] while 1: tmp = os.path.split(module) parts.append(tmp[1]) if tmp[0] in root: break root.append(tmp[0]) module = tmp[0] parts.reverse() mparts = [] while parts: module=string.join(parts, "/") id=bldreg.get("bifmodule_path_to_id",string.lower(module),None) if id: module_from_file_cache[file]=id return id parts=parts[:-1] return None
def module_from_file(file): if module_from_file_cache.has_key(file): return module_from_file_cache[file] module = file parts = [] root = [":", ".", "", "..", "/", "\\"] while 1: tmp = os.path.split(module) parts.append(tmp[1]) if tmp[0] in root: break root.append(tmp[0]) module = tmp[0] parts.reverse() mparts = [] while parts: module = string.join(parts, "/") id = bldreg.get("bifmodule_path_to_id", string.lower(module), None) if id: module_from_file_cache[file] = id return id parts = parts[:-1] return None
def GetPath(sdk_name): """This returns the path to a named SDK""" path = bldreg.get("sdk",string.lower(sdk_name),None) if not path: path=os.environ.get(sdk_name, os.environ.get(string.upper(sdk_name))) return path
def GetPath(sdk_name): """This returns the path to a named SDK""" path = bldreg.get("sdk", string.lower(sdk_name), None) if not path: path = os.environ.get(sdk_name, os.environ.get(string.upper(sdk_name))) return path
def GetModuleDependencies(project, modname=None): try: return project.__recursive_dependency_check_done__ except: if modname == None: module_directory = project.module_directory() modname = module_from_file(module_directory) if not modname: return {} done = {modname: 1} bifdeps = [modname] for d in bifdeps: for n in bldreg.get("bifmodule_deplist", d, []): if not done.has_key(n): bifdeps.append(n) done[n] = 1 project.__recursive_dependency_check_done__ = done #print "dependencies %s => %s" % (repr(modname), repr(done)) return done
def GetModuleDependencies(project, modname = None): try: return project.__recursive_dependency_check_done__ except: if modname == None: module_directory = project.module_directory() modname = module_from_file(module_directory) if not modname: return {} done = { modname:1 } bifdeps = [ modname ] for d in bifdeps: for n in bldreg.get("bifmodule_deplist",d,[]): if not done.has_key(n): bifdeps.append(n) done[n]=1 project.__recursive_dependency_check_done__ = done #print "dependencies %s => %s" % (repr(modname), repr(done)) return done
def CheckModuleSourceDependencies_rel(platform, project, type, paths): # I feel nice, so we check aginainst the recursive tree of # dependencies rather than against just the dependencies in this # module... /Hubbe module_directory = project.module_directory() modname = module_from_file(module_directory) if not modname: return try: done = project.__recursive_source_dependency_check_done__ except: done = GetModuleDependencies(project, modname).copy() bifdeps = done.keys() for d in bifdeps: for n in bldreg.get("bifmodule_source_deplist", d, []): if not done.has_key(n): bifdeps.append(n) done[n] = 1 project.__recursive_source_dependency_check_done__ = done warnings_printed = globals().get("__umake_warnings_printed_cache__", {}) for path in paths: m = module_from_file_rel(project, path) if m: if not done.has_key(m): w = modname + ":" + m if not warnings_printed.has_key(w): print "Warning: Missing BIF source dep %s (%s %s)" % ( repr(m), type, path) warnings_printed[w] = 1 globals()["__umake_warnings_printed_cache__"] = warnings_printed
def CheckModuleSourceDependencies_rel(platform, project, type, paths): # I feel nice, so we check aginainst the recursive tree of # dependencies rather than against just the dependencies in this # module... /Hubbe module_directory = project.module_directory() modname = module_from_file(module_directory) if not modname: return try: done = project.__recursive_source_dependency_check_done__ except: done = GetModuleDependencies(project, modname).copy() bifdeps = done.keys() for d in bifdeps: for n in bldreg.get("bifmodule_source_deplist",d,[]): if not done.has_key(n): bifdeps.append(n) done[n]=1 project.__recursive_source_dependency_check_done__ = done warnings_printed = globals().get("__umake_warnings_printed_cache__",{}) for path in paths: m = module_from_file_rel(project, path) if m: if not done.has_key(m): w = modname +":" + m if not warnings_printed.has_key(w): print "Warning: Missing BIF source dep %s (%s %s)" % (repr(m), type, path) warnings_printed[w]=1 globals()["__umake_warnings_printed_cache__"]=warnings_printed
def WriteDLLTab(platform, project, plugin_list): """Write the dlltab.cpp file, and include it in the project source list. The dlltab.cpp file defines a global function table used by pnmisc/dllaccess.cpp for loading staticly linked plugins.""" externsection = [] tablesection = [] dlltypesection = [] includes = [ ] header1 = """ /* This file is generated automatically. Please do not edit. */ """ structs = """ typedef struct DLLMAP { const char * dllName; const char * entryPoint; int pluginType; void * funcptr; } DLLMAP; extern const DLLMAP g_dllMap []; typedef struct DLLTYPEMAP { const char * dllName; int pluginType; } DLLTYPEMAP; extern const DLLTYPEMAP g_dllTypeMap[]; """ for target in plugin_list: ## retrieve the dll type from the registry try: dll_type = bldreg.get_value('dll_type', target) except KeyError: umake_lib.fatal('cannot find [dll_type] for target %s in registry' % (target)) if dll_type == 'codec': my_type = 'DLLTYPE_CODEC' elif dll_type == 'common': my_type = 'DLLTYPE_COMMON' else: my_type = 'DLLTYPE_PLUGIN' dlltypesection.append('\t{ "%s", %s },' % (target, my_type)) ## retrieve the dll entrypoints from the registry try: exported_functions = bldreg.get_value('export', target) except KeyError: umake_lib.fatal('cannot find exported functions for target %s in registry' % (target)) exported_function_list = string.split(exported_functions, ',') for symbol in exported_function_list: tmp = bldreg.get("export_protos", target+"::"+symbol, ["", None, None]) if type(tmp) == types.StringType: tmp = [ tmp, None, None ] args, include, path = tmp if include and include not in includes: includes.append(include) if path: project.AddModuleIncludes(path) externsection.append('STDAPI entrypoint_for_%s_%s (%s);' % (target, symbol, args)) tablesection.append( '\t{"%s", "%s", %s, (void*)entrypoint_for_%s_%s},' % ( target, symbol, my_type, target, symbol)) ## add the static target to the library list try: target_lib = bldreg.get_value('targets', target) except KeyError: umake_lib.fatal('cannot rfind [targets] path for target %s in registry' % (target)) handle = bldreg.get("file_to_handle", target_lib, None) if handle: project.AddModuleLibraries(handle) else: umake_lib.warning("codegen couldn't find which module created '%s'" % target_lib) target_lib = os.path.join(project.src_root_path, target_lib) project.AddLibraries(target_lib) ## FIXME: these should not be hardcoded! includes.append("dllacces.h") includes.append("dllpath.h") dlltab = open("dlltab.cpp", "w") def emit(x = "", tab = dlltab) : tab.write(x + "\n") emit(header1) for i in includes: emit('#include "%s"' % i) emit(structs) emit() emit(string.joinfields(externsection, "\n")) emit() emit() emit("const DLLTYPEMAP g_dllTypeMap[] = {") emit(string.joinfields(dlltypesection, "\n")) emit("\t{NULL, 0}\n};") emit("const DLLMAP g_dllMap[] = {") emit(string.joinfields(tablesection, "\n")) emit("\t{NULL, NULL, 0, NULL}\n};\n") ## have dlltab.cpp automagicly added to the source list project.AddSources("dlltab.cpp")
def compile_remotely(self, dir): global client_manager if not client_manager: client_manager = ClientManager() dir = os.getcwd() run_nmake = 0 cc = 0 chaingang.chdir_lock.release() unlocked = 1 try: ## Get a host to compile on import bfclient import bprotocol self.mtime_cache = {} amf = self.amf() amfl = string.lower(amf) std = self.isstd() ## DEBUG #print "STD[%s]=%d" % (amf, std) cc = client_manager.get(std) if not cc.is_self(): #print "GOT REMOTE" t1 = time.time() client = cc.clientdata.client.sock file_hash = {} src_root = bldreg.get("build", "path", None) src_root = os.path.normpath(os.path.join(dir, src_root)) if src_root[-1] != os.sep: src_root = src_root + os.sep to_do = 0 makefiles = [amf] for amf in makefiles: file_hash[amf] = 1 amfl = string.lower(amf) alias = bldreg.get("alias", amfl, None) if alias: makefiles.extend(alias) else: path, file = os.path.split(amf) (t, SR, relpath) = \ self.parse_makefile(os.path.join(src_root, path), file, file_hash, src_root) to_do = to_do + t t2 = time.time() #print "Makefiles parsed in %f seconds" % (t2 - t1) if not to_do: #print "NOTHING TO DO" return (0, "") ## Nothing to do else: #print "Archiving files..." archive_path = os.path.join(dir, "remotefiles.rna") new_list = [] for f in file_hash.keys(): mt = self.mtime(os.path.join(dir, f)) if cc.files.get(f) != mt: cc.files[f] = mt new_list.append(f) import archive archive.RNA(archive_path, src_root, 0).Archive(new_list) t3 = time.time() #print "Archive done in %f seconds, building " % (t3 - t2) message = bprotocol.Message("BUILD") message.SetAttrib("system_id", os.environ.get("SYSTEM_ID")) message.SetAttrib("chdir", relpath) message.SetAttrib("target", "make") message.SetAttrib("cmd", "nmake /nologo /i SUBMAKEFLAGS=/i") client.SendMessage2(message, open(archive_path, "rb")) msg = client.WaitForMessage2() status = int(msg.attrib["retcode"]) t4 = time.time() #print "Compile done in %f seconds, status=%d" % (t4-t3, status) message = bprotocol.Message("GET FILE") message.SetAttrib("path", "remote-result.rna") client.SendMessage2(message) msg = client.WaitForMessage2() results = os.path.join(dir, "remote-result.rna") client.RecieveFile(msg, open(results, "wb")) client_manager.release(cc) cc = 0 ## Get a localhost lock for the rest of this compile #if status != 0: # cc=client_manager.get(0,1) cc = client_manager.get(0, 1) chaingang.chdir_lock.acquire() unlocked = 0 os.chdir(dir) t5 = time.time() #print "Fetched file in %f seconds" % (t5-t4) archive.RNA(results, src_root, 0, 0).Extract() t6 = time.time() #print "Decompress done in %f seconds" % (t6-t5) #if status == 0: # return (0,"") return self.make_objects2() if cc and cc.is_self(): #print "GOT SELF" if unlocked: chaingang.chdir_lock.acquire() unlocked = 0 os.chdir(dir) #return self.low_make_all() return Compile.make_objects(self) finally: if cc: client_manager.release(cc) if unlocked: chaingang.chdir_lock.acquire() os.chdir(dir)
def compile_remotely(self, dir): global client_manager if not client_manager: client_manager=ClientManager() dir=os.getcwd() run_nmake=0 cc=0 chaingang.chdir_lock.release() unlocked=1 try: ## Get a host to compile on import bfclient import bprotocol self.mtime_cache={} amf=self.amf() amfl=string.lower(amf) std=self.isstd() ## DEBUG #print "STD[%s]=%d" % (amf, std) cc=client_manager.get(std) if not cc.is_self(): #print "GOT REMOTE" t1=time.time() client=cc.clientdata.client.sock file_hash = {} src_root=bldreg.get("build","path", None) src_root=os.path.normpath(os.path.join(dir, src_root)) if src_root[-1] != os.sep: src_root = src_root + os.sep to_do=0 makefiles = [amf] for amf in makefiles: file_hash[amf]=1 amfl=string.lower(amf) alias=bldreg.get("alias",amfl,None) if alias: makefiles.extend(alias) else: path, file = os.path.split(amf) (t, SR, relpath) = \ self.parse_makefile(os.path.join(src_root, path), file, file_hash, src_root) to_do=to_do+t t2=time.time() #print "Makefiles parsed in %f seconds" % (t2 - t1) if not to_do: #print "NOTHING TO DO" return (0,"") ## Nothing to do else: #print "Archiving files..." archive_path=os.path.join(dir,"remotefiles.rna") new_list=[] for f in file_hash.keys(): mt=self.mtime(os.path.join(dir, f)) if cc.files.get(f) != mt: cc.files[f]=mt new_list.append(f) import archive archive.RNA( archive_path, src_root, 0).Archive(new_list) t3=time.time() #print "Archive done in %f seconds, building " % (t3 - t2) message=bprotocol.Message("BUILD") message.SetAttrib("system_id",os.environ.get("SYSTEM_ID")) message.SetAttrib("chdir", relpath) message.SetAttrib("target", "make") message.SetAttrib("cmd", "nmake /nologo /i SUBMAKEFLAGS=/i") client.SendMessage2(message, open(archive_path,"rb")) msg=client.WaitForMessage2() status=int(msg.attrib["retcode"]) t4=time.time() #print "Compile done in %f seconds, status=%d" % (t4-t3, status) message=bprotocol.Message("GET FILE") message.SetAttrib("path","remote-result.rna") client.SendMessage2(message) msg=client.WaitForMessage2() results=os.path.join(dir,"remote-result.rna") client.RecieveFile(msg, open(results, "wb")) client_manager.release(cc) cc=0 ## Get a localhost lock for the rest of this compile #if status != 0: # cc=client_manager.get(0,1) cc=client_manager.get(0,1) chaingang.chdir_lock.acquire() unlocked=0 os.chdir(dir) t5=time.time() #print "Fetched file in %f seconds" % (t5-t4) archive.RNA( results, src_root, 0, 0).Extract() t6=time.time() #print "Decompress done in %f seconds" % (t6-t5) #if status == 0: # return (0,"") return self.make_objects2() if cc and cc.is_self(): #print "GOT SELF" if unlocked: chaingang.chdir_lock.acquire() unlocked=0 os.chdir(dir) #return self.low_make_all() return Compile.make_objects(self) finally: if cc: client_manager.release(cc) if unlocked: chaingang.chdir_lock.acquire() os.chdir(dir)
def __init__(self): self.bif_data_cache=None ## remember the working directory so the build ## system doesn't get confused by keyboard interrupts self.working_path = os.getcwd() self.cvs_tag = bldreg.get_value_default('build','cvs_tag',"") self.cvs_date = bldreg.get_value_default('build','cvs_date',"") ## default branch to build try: build_branch = os.environ["BUILD_BRANCH"] except KeyError: build_branch = "helix" self.build_branch = bldreg.get_value_default( "build", "branch", build_branch) ## get a list of possible build branches update=1 if ( bldreg.get("build","last_cvs_date",None) == self.cvs_date and bldreg.get("build","last_cvs_tag",None) == self.cvs_tag and bldreg.get("build","last_branch",None) == self.build_branch): update=2 self.branch_list = branchlist.BranchList(self.cvs_tag, self.cvs_date, update) self.profile_list = None ## Default command line self.history = bldreg.get_value_default('build','history', []) self.flags = bldreg.get_value_default('build', 'arguments', None) self.targets = bldreg.get_value_default('build', 'targets', None) self.profile = bldreg.get_value_default('build','profile', None) if not self.profile or not self.targets or self.flags == None: bif_data = self.GetBIF() if not bif_data: ## An old branch self.build_branch = "RealMedia" bif_data = self.GetBIF() if not bif_data: branches = self.branch_list.get_list() if not branches: print "No BIF branches found, please configure your .buildrc!" sys.exit(1) self.build_branch=branches[0] bif_data = self.GetBIF() if not bif_data: print "No BIF files found, please configure your .buildrc!" sys.exit(1) if not self.profile: self.profile = bif_data.default_profile if not self.profile: self.profile = "default" bldreg.set_value('build','profile',self.profile) if not self.targets: self.targets = string.split(bif_data.default_target) if not self.targets: self.targets = [ "splay" ] bldreg.set_value('build','targets',self.targets) if self.flags == None: self.flags = [] flags = string.split(bif_data.default_options) for flag in flags: flag = "-t"+flag if flag not in self.flags: self.flags.append(flag) bldreg.set_value('build','arguments',self.flags) if not self.profile: self.profile="default" self.menu = [ (self.BIFMenuOption, self.SetBIFBranch), (self.TargetMenuOption, self.SetTarget), (self.ProfileMenuOption, self.SetProfile), (self.BuildMenuOption, self.Build), ("Toggle make depend & makefiles (-e -n)", self.Toggle, "-e","-n"), ("Toggle release (-trelease)", self.Toggle, "-trelease"), ("Toggle 'make clean' (-c)", self.Toggle, "-c"), ("Toggle clobber (Dangerous!) (-C)", self.Toggle, "-C"), ("Toggle halt-on-error (-p green)", self.Toggle, "-p","green"), ("Toggle verbose mode (-v)", self.Toggle, "-v"), ("Toggle static build (-tnodll)", self.Toggle, "-tnodll"), ("Checkout source for selected target now", self.CheckoutSource), (self.TagMenuOption, self.SetTag), ("Help Page (full help in build/doc/index.html)", self.Help)]
def __init__(self): self.bif_data_cache = None ## remember the working directory so the build ## system doesn't get confused by keyboard interrupts self.working_path = os.getcwd() self.cvs_tag = bldreg.get_value_default('build', 'cvs_tag', "") self.cvs_date = bldreg.get_value_default('build', 'cvs_date', "") ## default branch to build try: build_branch = os.environ["BUILD_BRANCH"] except KeyError: build_branch = "helix" self.build_branch = bldreg.get_value_default("build", "branch", build_branch) ## get a list of possible build branches update = 1 if (bldreg.get("build", "last_cvs_date", None) == self.cvs_date and bldreg.get("build", "last_cvs_tag", None) == self.cvs_tag and bldreg.get("build", "last_branch", None) == self.build_branch): update = 2 self.branch_list = branchlist.BranchList(self.cvs_tag, self.cvs_date, update) self.profile_list = None ## Default command line self.history = bldreg.get_value_default('build', 'history', []) self.flags = bldreg.get_value_default('build', 'arguments', None) self.targets = bldreg.get_value_default('build', 'targets', None) self.profile = bldreg.get_value_default('build', 'profile', None) if not self.profile or not self.targets or self.flags == None: bif_data = self.GetBIF() if not bif_data: ## An old branch self.build_branch = "RealMedia" bif_data = self.GetBIF() if not bif_data: branches = self.branch_list.get_list() if not branches: print "No BIF branches found, please configure your .buildrc!" sys.exit(1) self.build_branch = branches[0] bif_data = self.GetBIF() if not bif_data: print "No BIF files found, please configure your .buildrc!" sys.exit(1) if not self.profile: self.profile = bif_data.default_profile if not self.profile: self.profile = "default" bldreg.set_value('build', 'profile', self.profile) if not self.targets: self.targets = string.split(bif_data.default_target) if not self.targets: self.targets = ["splay"] bldreg.set_value('build', 'targets', self.targets) if self.flags == None: self.flags = [] flags = string.split(bif_data.default_options) for flag in flags: flag = "-t" + flag if flag not in self.flags: self.flags.append(flag) bldreg.set_value('build', 'arguments', self.flags) if not self.profile: self.profile = "default" self.menu = [ (self.BIFMenuOption, self.SetBIFBranch), (self.TargetMenuOption, self.SetTarget), (self.ProfileMenuOption, self.SetProfile), (self.BuildMenuOption, self.Build), ("Toggle make depend & makefiles (-e -n)", self.Toggle, "-e", "-n"), ("Toggle release (-trelease)", self.Toggle, "-trelease"), ("Toggle 'make clean' (-c)", self.Toggle, "-c"), ("Toggle clobber (Dangerous!) (-C)", self.Toggle, "-C"), ("Toggle halt-on-error (-p green)", self.Toggle, "-p", "green"), ("Toggle verbose mode (-v)", self.Toggle, "-v"), ("Toggle static build (-tnodll)", self.Toggle, "-tnodll"), ("Checkout source for selected target now", self.CheckoutSource), (self.TagMenuOption, self.SetTag), ("Help Page (full help in build/doc/index.html)", self.Help) ]