def uninstall(deploy, target, build, name, toolchain = False): globals()['technicolor'] = yawn.get(name) if not technicolor.production: console.error('*NOT* going to remove everything!') return # Start with clean envs env.set(target, build) # Setup the prefixes env.native.prefix = fs.join(deploy, 'Toolchain', target) env.current.prefix = fs.join(deploy, target) # And tmp dirs # env.native.tmp = fs.join(roottmp, 'Toolchain') # env.current.tmp = fs.join(roottmp, target) path = __find(technicolor.production, env.native if toolchain else env.current, ignoresystem = True) if path: console.info("Found tracks of it. Removing production. %s" % path) fs.remove(path) else: console.error("The requested monade is NOT installed. Doing nothing.")
def install(rootsrc, roottmp, deploy, target, build, name, toolchain = False, clean = False, cleanarchive = False, debug = False, static = False): globals()['technicolor'] = yawn.get(name) # If already done, for this target, during *this* session, silently pass - avoid verbose dependency checking and recursive references # (yeah, I'm looking at you goddamn pkgconfig) if (not toolchain) and (target in technicolor.done): return console.header("Target: %s - Build: %s - Yawn: %s (version %s - license %s)" % (target, build, technicolor.name, technicolor.version, technicolor.license), 1) # Start with clean envs env.set(target, build) # Setup the prefixes # XXX this totally sucks ass. Toolchain of a package may in turn depend on a specific tool, which makes it compiled into the Toolchain/Darwin directory # anyway... debug = not (not debug or (debug == "false")) static = not (not static or (static == "false")) env.native.prefix = fs.join(deploy, 'Toolchain', toolchain if toolchain else target) env.current.prefix = fs.join(deploy, target, 'debug' if debug else 'release', 'static' if static else 'dynamic') # And tmp dirs env.native.tmp = fs.join(roottmp, 'Toolchain', toolchain if toolchain else target) env.current.tmp = fs.join(roottmp, target, 'debug' if debug else 'release', 'static' if static else 'dynamic') # And src dirs env.native.src = fs.join(rootsrc, 'Toolchain', toolchain if toolchain else target) env.current.src = fs.join(rootsrc, target) console.header('Searching for it') if technicolor.production and __find(technicolor.production, env.native if toolchain else env.current, target != build): console.info("The requested monade seems to be already compiled and installed. Will do nothing.") technicolor.done[target] = True return else: console.info("Will build") console.header("Building tools") # Walk tool dependencies first and build them if need be for depname in technicolor.toolchain: # If we already are compiling a tool, forward the original toolchain value. If not, that will be the target forwardtoolchaintarget = toolchain if toolchain else target install(rootsrc, roottmp, deploy, build, build, depname, forwardtoolchaintarget, clean, cleanarchive) console.info('Done with tools') console.header('Building dependencies') # Get back to the original yawn now - XXX EXTREMELY bad design globals()['technicolor'] = yawn.get(name) # Walk dependencies and build them if need be for depname in technicolor.depends: # If we already are compiling a tool, forward the original toolchain value. If not, that will be the target forwardtoolchaintarget = toolchain if toolchain else False install(rootsrc, roottmp, deploy, target, build, depname, forwardtoolchaintarget, clean, cleanarchive, debug, static) console.info('Done with dependencies') # Get back to the original yawn now - XXX EXTREMELY bad design globals()['technicolor'] = yawn.get(name) env.set(target, build) env.current.debug = True if debug else False env.current.static = True if static else False env.native.prefix = fs.join(deploy, 'Toolchain', toolchain if toolchain else target) env.current.prefix = fs.join(deploy, target, 'debug' if debug else 'release', 'static' if static else 'dynamic') env.native.tmp = fs.join(roottmp, 'Toolchain', toolchain if toolchain else target) env.current.tmp = fs.join(roottmp, target, 'debug' if debug else 'release', 'static' if static else 'dynamic') env.native.src = fs.join(rootsrc, 'Toolchain', toolchain if toolchain else target) env.current.src = fs.join(rootsrc, target) console.header("Back onto Target: %s - Build: %s - Yawn: %s (version %s - license %s)" % (target, build, technicolor.name, technicolor.version, technicolor.license), 1) if not technicolor.url: console.warn('This is a dummy package with no url. Just passing by.') return # Load the python script file # sys.path.insert(0, 'monades') # currentjob = __import__('%s' % name) exec('from technicolor import %s as currentjob' % technicolor.name) # Ensure the package is here console.header('Getting remote stuff here') globals()['environ'] = env.native if toolchain else env.current # Set current directory now to source directory environ.pwd = fs.join(environ.src, technicolor.local) if technicolor.fetch(environ.src, cleanarchive): console.header("Got remote package, applying patches now.") technicolor.patch(environ.pwd, target) technicolor.copy(environ.pwd) if 'preprocess' in dir(currentjob): console.header('Preprocessing') currentjob.preprocess() else: console.warn('NO preprocessing specified for this monade. Going on.') else: console.warn("Output directory already exist. NOT getting package again and NOT running pre hook. If this is not acceptable, rm %s" % environ.pwd) # Ensure target dir are there to avoid complaints fs.makedir(fs.join(environ.prefix, 'lib')) fs.makedir(fs.join(environ.prefix, 'bin')) fs.makedir(fs.join(environ.prefix, 'include')) # Switch current directory now to temp directory environ.pwd = fs.join(environ.tmp, technicolor.local) if not fs.exists(environ.pwd): fs.makedir(environ.pwd) if 'configure' in dir(currentjob): # Exec console.header('Configure') currentjob.configure() else: console.warn('NO configure instructions specified for this monade! Going on.') if clean: if 'clean' in dir(currentjob): # Exec console.header('Clean') currentjob.clean() else: console.warn('NO clean instructions specified for this monade! Going on.') if 'make' in dir(currentjob): # Exec console.header('Make') currentjob.make() else: console.warn('NO make instructions specified for this monade! Going on.') # XXX switch this to deploy directory? console.header('Post-processing!', 1) if 'postprocess' in dir(currentjob): currentjob.postprocess() else: console.warn('NO post-process instructions specified for this monade! Going on.') technicolor.done[target] = True