OpenCores
URL https://opencores.org/ocsvn/c0or1k/c0or1k/trunk

Subversion Repositories c0or1k

[/] [c0or1k/] [trunk/] [configure.py] - Rev 5

Compare with Previous | Blame | View Log

#! /usr/bin/env python2.6
# -*- mode: python; coding: utf-8; -*-
import os, sys, shelve, shutil
from os.path import join
from config.projpaths import *
from config.configuration import *
from scripts.baremetal.baremetal_generator import *
from scripts.kernel.generate_kernel_cinfo import *
from scripts.cml.generate_container_cml import *
from optparse import OptionParser
 
#
# Rarely required. Only required when:
# The number of containers defined in the ruleset are not enough.
# E.g. you want 16 containers instead of 4.
# You want to start from scratch and set _all_ the parameters yourself.
#
def autogen_rules_file(options, args):
    # Prepare default if arch not supplied
    if not options.arch:
        print "No arch supplied (-a), using `arm' as default."
        options.arch = "or1k"
 
    # Prepare default if number of containers not supplied
    if not options.ncont:
        options.ncont = 4
        print "Max container count not supplied (-n), using %d as default." % options.ncont
 
    return generate_container_cml(options.arch, options.ncont)
 
 
def cml2_header_to_symbols(cml2_header, config):
    with file(cml2_header) as header_file:
        for line in header_file:
            pair = config.line_to_name_value(line)
            if pair is not None:
                name, value = pair
                config.get_all(name, value)
                config.get_cpu(name, value)
                config.get_arch(name, value)
                config.get_subarch(name, value)
                config.get_platform(name, value)
                config.get_ncpu(name, value)
                config.get_ncontainers(name, value)
                config.get_container_parameters(name, value)
                config.get_toolchain(name, value)
 
def cml2_update_config_h(config_h_path, config):
    with open(config_h_path, "a") as config_h:
        config_h.write("#define __ARCH__ " + config.arch + '\n')
        config_h.write("#define __PLATFORM__ " + config.platform + '\n')
        config_h.write("#define __SUBARCH__ " + config.subarch + '\n')
        config_h.write("#define __CPU__ " + config.cpu + '\n')
 
def configure_kernel(cml_file):
    config = configuration()
 
    if not os.path.exists(BUILDDIR):
        os.mkdir(BUILDDIR)
 
    cml2_configure(cml_file)
 
 
 
# Parse options + autogenerate cml rule file if necessary.
def build_parse_options():
    autogen_true = 0
    usage = "usage: %prog [options] arg"
    parser = OptionParser(usage)
 
    parser.add_option("-a", "--arch", type = "string", dest = "arch",
                      help = "Use configuration file for architecture")
    parser.add_option("-n", "--num-containers", type = "int", dest = "ncont",
                      help = "Maximum number of containers that will be "
                             "made available in configuration")
    parser.add_option("-c", "--configure-first", action = "store_true", dest = "config",
                      help = "Tells the build script to run configurator first")
    parser.add_option("-f", "--use-file", dest = "cml_file",
                      help = "Supply user-defined cml file "
                             "(Use only if you want to override default)")
    parser.add_option("-r", "--reset-config", action = "store_true",
                      default = False, dest = "reset_config",
                      help = "Reset configuration file settings "
                             "(If you had configured before and changing the "
                             "rule file, this will reset existing values to default)")
    parser.add_option("-s", "--save-old-config", action = "store_true",
                      default = False, dest = "backup_config",
                      help = "Backs up old configuration file settings to a .saved file"
                             "(Subsequent calls would overwrite. Only meaningful with -r)")
    parser.add_option("-p", "--print-config", action = "store_true",
                      default = False, dest = "print_config",
                      help = "Prints out configuration settings"
                             "(Symbol values and container parameters are printed)")
    parser.add_option("-q", "--quite", action="store_true", dest="quite", default = False,
                      help = "Enable quite mode"
                             "(will not be presented with a configuration screen)")
 
 
    (options, args) = parser.parse_args()
 
    if options.cml_file and options.reset_config:
        parser.error("options -f and -r are mutually exclusive")
        exit()
 
    # -f or -r or -n or -a implies -c
    if options.cml_file or options.ncont or options.arch or options.reset_config \
       or not os.path.exists(BUILDDIR) or not os.path.exists(CONFIG_SHELVE_DIR):
        options.config = 1
 
    return options, args
 
 
def configure_system(options, args):
    #
    # Configure only if we are told to do so.
    #
    if not options.config:
        return
 
    if not os.path.exists(BUILDDIR):
        os.mkdir(BUILDDIR)
 
    #
    # If we have an existing config file or one supplied in options
    # and we're not forced to autogenerate, we use the config file.
    #
    # Otherwise we autogenerate a ruleset and compile it, and create
    # a configuration file from it from scratch.
    #
    if (options.cml_file or os.path.exists(CML2_CONFIG_FILE)) \
            and not options.reset_config:
        if options.cml_file:
            cml2_config_file = options.cml_file
        else:
            cml2_config_file = CML2_CONFIG_FILE
 
        #
        # If we have a valid config file but not a rules file,
        # we still need to autogenerate the rules file.
        #
        if not os.path.exists(CML2_COMPILED_RULES):
            rules_file = autogen_rules_file(options, args)
 
            # Compile rules file.
            os.system(CML2TOOLSDIR + '/cmlcompile.py -o ' + \
                      CML2_COMPILED_RULES + ' ' + rules_file)
 
        #
        # If there was an existing config file in default cml path
        # and -s was supplied, save it.
        #
        if os.path.exists(CML2_CONFIG_FILE) and options.backup_config:
            shutil.copy(CML2_CONFIG_FILE, CML2_CONFIG_FILE_SAVED)
 
        if options.quite:
                # Create configuration from existing file
                os.system(CML2TOOLSDIR + '/cmlconfigure.py -b -o ' + \
                        CML2_CONFIG_FILE + ' -i ' + cml2_config_file + \
                        ' ' + CML2_COMPILED_RULES)
        else:
                # Create configuration from existing file
                os.system(CML2TOOLSDIR + '/cmlconfigure.py -c -o ' + \
                        CML2_CONFIG_FILE + ' -i ' + cml2_config_file + \
                        ' ' + CML2_COMPILED_RULES)
 
    else:
        rules_file = autogen_rules_file(options, args)
 
        # Compile rules file.
        os.system(CML2TOOLSDIR + '/cmlcompile.py -o ' + \
                  CML2_COMPILED_RULES + ' ' + rules_file)
 
        # Create configuration from scratch
        os.system(CML2TOOLSDIR + '/cmlconfigure.py -c -o ' + \
                  CML2_CONFIG_FILE + ' ' + CML2_COMPILED_RULES)
 
    # After configure, if user might have chosen to quit without saving
    if not os.path.exists(CML2_CONFIG_FILE):
        print "Exiting without saving configuration."
        sys.exit()
 
    # Create header file
    os.system(TOOLSDIR + '/cml2header.py -o ' + \
              CML2_CONFIG_H + ' -i ' + CML2_CONFIG_FILE)
 
    # The rest:
    if not os.path.exists(os.path.dirname(CONFIG_H)):
        os.mkdir(os.path.dirname(CONFIG_H))
 
    shutil.copy(CML2_CONFIG_H, CONFIG_H)
 
    config = configuration()
    cml2_header_to_symbols(CML2_CONFIG_H, config)
    cml2_update_config_h(CONFIG_H, config)
 
    configuration_save(config)
 
    # Generate baremetal container files if new ones defined
    baremetal_cont_gen = BaremetalContGenerator()
    baremetal_cont_gen.baremetal_container_generate(config)
 
   # Print out the configuration if asked
    if options.print_config:
        config.config_print()
 
    return config
 
# Generate kernel cinfo structure for container definitions
def generate_cinfo():
    config = configuration_retrieve()
    generate_kernel_cinfo(config, KERNEL_CINFO_PATH)
 
if __name__ == "__main__":
    opts, args = build_parse_options()
 
    # We force configuration when calling this script
    # whereas build.py can provide it as an option
    opts.config = 1
 
    configure_system(opts, args)
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.