author Rich Burridge <>
Tue, 13 Nov 2012 08:19:05 -0800
changeset 1048 e82fa02a4d16
child 1053 accc15fa8762
permissions -rwxr-xr-x
15863968 Auto-generation of Userland gate list - Phase 1.
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or
# See the License for the specific language governing permissions
# and limitations under the License.
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
# Copyright (c) 2012, Oracle and/or it's affiliates.  All rights reserved.
# A simple program to generate (on stdout) the component.html web page 
# found at:

import getopt
import os
import sys

debug = False

# Initial HTML for the generated web page.
preamble = """
    <style type='text/css' media='screen'>
        @import '/css/demo_table.css';
        @import '/css/ColVis.css';
        @import '/css/ColReorder.css';

            tr.even:hover,  tr.even:hover td.sorting_1 ,
            tr.odd:hover,  tr.odd:hover td.sorting_1 {
                            background-color: gold;

    <script type='text/javascript' src='js/jquery.js'></script>
    <script type='text/javascript' src='js/jquery.dataTables.js'></script>
    <script type='text/javascript' src='js/ColReorder.js'></script>
    <script type='text/javascript' src='js/ColVis.js'></script>

        $(document).ready(function() {
                "sDom": 'C<"clear">Rlfrtip',
                bPaginate: true,
                bFilter: true,
                bSort: true,
                iDisplayLength: -1,
                aLengthMenu: [ [ 10, 50, -1], [ 10, 50, 'All'] ]

<h1>Userland Components</h1>
<table align='center' id='components'>
    <th>Gate Path</th>
    <th>ARC Case(s)</th>

# Final HTML for the generated web page.
postamble = """

# Return a sorted list of the directories containing one or more .p5m files.
def find_p5m_dirs(workspace):
    p5m_dirs = []
    for dir, _, files in os.walk(workspace + "/components"):
        for file in files:
            if file.endswith(".p5m"):

    return sorted(list(set(p5m_dirs)))

# Write out the initial HTML for the components.html web page.
def write_preamble():
    print preamble

# Generate an HTML table entry for all the information for the component
# in the given directory. This generates a file called 'component-report'
# under the components build directory.
def gen_reports(workspace, component_dir):
    if debug:
        print >> sys.stderr, "Processing %s" % component_dir

    makefiles = "-f Makefile -f %s/make-rules/component-report" % workspace
    targets = "clean component-hook"
    cmd = "cd %s; gmake COMPONENT_HOOK='gmake %s component-report' %s" % \
        (component_dir, makefiles, targets)

    lines = os.popen(cmd).readlines()

# Collect all the .../build/component-report files and write them to stdout.
def write_reports(p5m_dirs):
    for p5m_dir in p5m_dirs:
        report = "%s/build/component-report" % p5m_dir
        if debug:
            print >> sys.stderr, "Reading %s" % report
            fin = open(report, 'r')
            lines = fin.readlines()
            if debug:
                print >> sys.stderr, "Unable to read: %s" % report

# Write out the final HTML for the components.html web page.
def write_postamble():
    print postamble

# Write out a usage message showing valid options to this script.
def usage():
    print  >> sys.stderr, \
Usage: [OPTION...]

-d, --debug
      Turn on debugging

-w --workspace
      Location of the Userland workspace


if __name__ == "__main__":
    workspace = os.getenv('WS_TOP')

        opts, args = getopt.getopt(sys.argv[1:], "dw:",
            [ "debug", "workspace=" ])
    except getopt.GetoptError, err:
        print str(err)

    for opt, arg in opts:
        if opt in [ "-w", "--workspace" ]:
            workspace = arg
        elif opt in [ "-d", "--debug" ]:
            debug = True
            assert False, "unknown option"
    p5m_dirs = find_p5m_dirs(workspace)
    for p5m_dir in p5m_dirs:
        gen_reports(workspace, p5m_dir)