X-Git-Url: https://git.ralfj.de/mass-build.git/blobdiff_plain/b82c0cdbd36ccfbdff73f65616f30f7d22f9083b..7cc4b869c9189b01675fae5b8ff9e478c04ec68b:/kdebuildpy.py diff --git a/kdebuildpy.py b/kdebuildpy.py index 720c96b..99267e8 100755 --- a/kdebuildpy.py +++ b/kdebuildpy.py @@ -11,9 +11,9 @@ parser.add_argument("-c, --config", parser.add_argument("--reconfigure", action="store_true", dest="reconfigure", help="Force configuration to be run") -parser.add_argument("--phases", choices=["update", "configure", "compile"], nargs='*', metavar='PHASE', - dest="phases", default=["update", "configure", "compile"], - help="For each module, run the given phases in the given order. Possible phases are: update, configure, compile") +parser.add_argument("--no-update", + action="store_false", dest="update", + help="Do not update modules before compilation") parser.add_argument("--resume-from", metavar='MODULE', dest="resume_from", help="Resume building from the given repository") @@ -22,30 +22,39 @@ parser.add_argument("modules", metavar='MODULE', nargs='*', args = parser.parse_args() # load config -config = imp.load_source('config', args.config) +config = imp.load_source('config', args.config).__dict__ +os.remove(args.config+'c') # remove compiled python file +projects = OrderedDict() # all projects +workProjects = [] # projects we work on -# template for a KDE project: combine git/svn with cmake -def sourceFolder(module): - return os.path.join(module['in-folder'], module['name']) -def buildFolder(module): - return os.path.join(config.buildDir, sourceFolder(module)) - -class KDEGitProject(vcs.Git, build_system.CMake): - def __init__(self, module): - vcs.Git.__init__(self, sourceFolder(module),'kde:'+module['name'], module['version']) - build_system.CMake.__init__(self, sourceFolder(module), buildFolder(module), config) - self.name = module['name'] - -class KDESVNProject(vcs.SVN, build_system.CMake): - def __init__(self, module): - vcs.SVN.__init__(self, sourceFolder(module), 'svn://svn.kde.org/home/kde/'+module['svn-path']) - build_system.CMake.__init__(self, sourceFolder(module), buildFolder(module), config) +# an entire Project +class Project: + def __init__(self, config, folder, module): + self.folder = folder self.name = module['name'] - -moduleTypes = { - 'kde+git': KDEGitProject, - 'kde+svn': KDESVNProject -} + # VCS + vcsName = module['vcs'] + if vcsName == 'git': + self.vcs = vcs.Git(self.sourceFolder(), module['url'], module['version']) + elif vcsName == 'svn': + self.vcs = vcs.SVN(self.sourceFolder(), module['url'], module.get('versionName')) + else: + raise Exception("Unknown VCS type "+vcsName) + # build system + if config.get('buildDeb', False): + self.buildSystem = build_system.AutoDebuild(self.sourceFolder(), self.buildFolder(), module, self.vcs, config) + else: + buildSystemName = module['buildSystem'] + if buildSystemName == 'cmake': + self.buildSystem = build_system.CMake(self.sourceFolder(), self.buildFolder(), module, config) + else: + raise Exception("Unknown build system type "+buildSystemName) + + def sourceFolder(self): + return os.path.join(self.folder, self.name) + + def buildFolder(self): + return os.path.join(config['buildDir'], self.sourceFolder()) # return the position of the given item in the list def findInList(list, item): @@ -54,17 +63,18 @@ def findInList(list, item): return i raise Exception("%s not found in list" % str(item)) -# collect list of projects (separate run, since the actual compilation will change the working directory!) -projects = OrderedDict() -for module in config.modules: - if module['name'] in projects: - raise Exception("Duplicate module name "+module['name']) - if not module['type'] in moduleTypes: - raise Exception("Invalid module type "+module['type']) - projects[module['name']] = moduleTypes[module['type']](module) # create module of proper type +# populate list of projects +def loadProjects(config, modules, folder=''): + for module in modules: + if 'folder' in module: # a subpath + loadProjects(config, module['modules'], os.path.join(folder, module['folder'])) + else: # a proper project + if module['name'] in projects: + raise Exception("Duplicate module name "+module['name']) + projects[module['name']] = Project(config, folder, module) # now check what we have to do -workProjects = [] +loadProjects(config, config['modules']) if args.modules: if args.resume_from is not None: raise Exception("Can not use --resume-from and manually specify modules") @@ -72,7 +82,8 @@ if args.modules: if not module in projects: raise Exception("Project %s does not exist" % module) workProjects.append(projects[module]) -elif args.resume_from is None: workProjects = projects.values() # all the projects +elif args.resume_from is None: + workProjects = projects.values() # all the projects else: if not args.resume_from in projects: raise Exception("Project %s does not exist" % args.resume_from) @@ -83,16 +94,12 @@ else: # and do it! for project in workProjects: try: - for phase in args.phases: - if phase == 'update': - project.update() - elif phase == 'configure': - project.configure(force=args.reconfigure) - elif phase == 'compile': - project.build() - project.install() - else: - raise Exception("Invalid phase "+phase) + if args.update: + print "Updating module",project.sourceFolder() + project.vcs.update() + print "Building module",project.sourceFolder() + project.buildSystem.build(reconfigure=args.reconfigure) + print except (subprocess.CalledProcessError, KeyboardInterrupt) as e: print >> sys.stderr print >> sys.stderr