onos.bucklet 8.25 KB
import random

DEBUG_ARG='JAVA_TOOL_OPTIONS="-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=5005,suspend=y"'
FORCE_INSTALL=True
NONE='NONE'

SRC = 'src/main/java/**/'
TEST = 'src/test/java/**/'
RESOURCES_ROOT = 'src/main/resources/'
TEST_RESOURCES_ROOT = 'src/test/resources/'

include_defs('//onos.defs')

def _get_name():
    base_path = get_base_path()
    return ONOS_ARTIFACT_BASE + base_path.replace('/', '-') #TODO Unix-separator

def checkstyle(
    name,
    srcs = None,
    jar_target = None,
    ):

    if srcs and jar_target:
        base = get_base_path()
        files = '%s\n%s\n' % (name, base) + '\n'.join(['%s/%s' % (base, s) for s in srcs])

        genrule(
                name = name + '-checkstyle-files',
                bash = "echo '%s' > $OUT" % files,
                srcs = srcs,
                out = 'checkstyle-files.txt',
        )

        sh_test(
                name = name + '-checkstyle',
                test = '//tools/build/conf:start-buck-daemon',
                deps = [ jar_target ],
                args = [
                    '$(location //tools/build/conf:buck-daemon-jar)',
                    'checkstyle',
                    '$(location :' + name + '-checkstyle-files)',
                    '$(location //tools/build/conf:checkstyle-xml)',
                    '$(location //tools/build/conf:suppressions-xml)',
                    ],
                test_rule_timeout_ms = 20000,
                labels = [ 'checkstyle' ],
        )

def java_doc(
    name,
    title,
    pkgs,
    paths,
    srcs = [],
    deps = [],
    visibility = [],
    do_it_wrong = False,
  ):
  if do_it_wrong:
    sourcepath = paths
  else:
    sourcepath = ['$SRCDIR/' + n for n in paths]

  if len(srcs) != 0:
    cmd = ' '.join([
        'while ! test -f .buckconfig; do cd ..; done;',
        'javadoc',
        '-tag onos.rsModel:a:"onos model"',
        '-quiet',
        '-protected',
        '-encoding UTF-8',
        '-charset UTF-8',
        '-notimestamp',
        '-windowtitle "' + title + '"',
        '-link http://docs.oracle.com/javase/8/docs/api',
        '-subpackages ',
        ':'.join(pkgs),
        '-sourcepath ',
        ':'.join(sourcepath),
        ' -classpath ',
        ':'.join(['$(classpath %s)' % n for n in deps]),
        '-d $TMP',
      ]) + ';jar cf $OUT -C $TMP .'

    genrule(
      name = name,
      cmd = cmd,
      srcs = srcs,
      out = name + '.jar',
      visibility = visibility,
)


def osgi_jar(
    name = None,
    srcs = None,
    group_id = ONOS_GROUP_ID,
    version = ONOS_VERSION,
    deps = [],
    visibility = ['PUBLIC'],
    license = 'NONE',
    description = '',
    debug = False,
    import_packages = '*',
    dynamicimport_packages = '',
    export_packages = '*',
    package_name_root = 'org.onosproject',
    include_resources = NONE,
    web_context = NONE,
    api_title = NONE,
    api_version = NONE,
    api_package = NONE,
    api_description = NONE,
    resources = NONE,
    resources_root = None,
    **kwargs
    ):

  # if name and _get_name() != name:
  #     print _get_name(), '!=', name
  if name is None:
      name = _get_name()

  if srcs is None:
      srcs = glob([SRC + '/*.java'])

  if resources == NONE and resources_root is not None:
      resources = glob([resources_root + '**'])
  elif resources == NONE:
      resources = glob([RESOURCES_ROOT + '**'])

  if resources and not resources_root:
      resources_root = RESOURCES_ROOT

  if api_title != NONE:
      r = 'WEB-INF/classes/apidoc/swagger.json=bin/swagger.json'
      include_resources = include_resources + ',' + r if include_resources != NONE else r

  bare_jar_name = name + '-jar'
  osgi_jar_name = name + '-osgi'
  mvn_coords = group_id + ':' + name + ':' + version


  onos_jar(
      name = bare_jar_name,
      srcs = srcs,
      deps = deps,
      visibility = [], #intentially, not visible
      resources = resources,
      resources_root = resources_root,
      web_context = web_context,
      api_title = api_title,
      api_version = api_version,
      api_package = api_package,
      api_description = api_description,
      **kwargs
  )

  cp = ':'.join(['$(classpath %s)' % c for c in deps]) if deps else '""'

  args = ( '$(location :%s)' % bare_jar_name, #input jar
           '$OUT',                            #output jar
           cp,                                #classpath
           name,                              #bundle name
           group_id,                          #group id
           version,                           #version
           license,                           #license url
           "'%s'" % import_packages,          #packages to import
           "'%s'" % export_packages,          #packages to export
           include_resources,                 #custom includes to classpath
           web_context,                       #web context (REST API only)
           "'%s'" % dynamicimport_packages,   #DynamicImport-Package
           description,                       #description
          )

  #TODO stage_jar is a horrendous hack
  stage_jar = 'pushd $SRCDIR; mkdir bin; cd bin; jar xf $(location :%s); ls; popd; ' % bare_jar_name
  wrap_jar = '$(exe //utils/osgiwrap:osgi-jar) ' + ' '.join(args)
  bash = stage_jar + wrap_jar
  if debug:
    bash = stage_jar + DEBUG_ARG + ' ' + wrap_jar
    print bash

  # FIXME: make sure that /swagger.json gets filtered
  genrule(
    name = osgi_jar_name,
    bash = bash,
    out = '%s-%s.jar' % (name, version), #FIXME add version to jar file
    srcs =  glob(['src/main/webapp/**']),
    visibility = [], #intentially, not visible
  )

  # TODO we really should shade the jar with maven flavor
  prebuilt_jar(
    name = name,
    maven_coords = mvn_coords,
    binary_jar = ':' + osgi_jar_name,
    visibility = visibility,
  )

  ### Checkstyle
  checkstyle(
      name = name + '-checkstyle-files',
      srcs = srcs,
      jar_target = ':'+ bare_jar_name,
  )

  java_doc(
       name = name + '-javadoc',
       title = 'Java Docs',
       pkgs = [ package_name_root ],
       paths = [ 'src/main/java' ],
       srcs = srcs,
       deps = deps,
       visibility = visibility,
       do_it_wrong = False,
  )

  # TODO add project config for intellij
  # project_config(
  #   src_target = ':' + bare_jar_name,
  #   src_roots = [ 'src/main/java' ],
  #   test_target = ':' + name + '-tests',
  #   test_roots = [ 'src/test/java' ],
  # )

  ### .m2 Install
  mvn_cmd = ' '.join(( 'mvn install:install-file',
                       '-Dfile=$(location :%s)' % name,
                       '-DgroupId=%s' % group_id,
                       '-DartifactId=%s' % name,
                       '-Dversion=%s' % version,
                       '-Dpackaging=jar' ))
  cmd = mvn_cmd + ' > $OUT'
  if FORCE_INSTALL:
    # Add a random number to the command to force this rule to run.
    # TODO We should make this configurable from CLI, perhaps with a flag.
    cmd = 'FOO=%s ' % random.random() + cmd
  genrule(
    name = name + '-install',
    bash = cmd,
    out = 'install.log',
    visibility = visibility,
  )

def osgi_jar_with_tests(
        name = None,
        deps = [],
        test_srcs = None,
        test_deps = [ '//lib:TEST' ],
        test_resources = None,
        test_resources_root = None,
        visibility = [ 'PUBLIC' ],
        **kwargs
    ):

  if name is None:
      name = _get_name()

  osgi_jar(name = name,
           deps = deps,
           visibility = visibility,
           **kwargs)

  if test_resources and not test_resources_root:
      test_resources_root = TEST_RESOURCES_ROOT
  if test_resources_root and not test_resources:
      test_resources = glob([test_resources_root + '**'])
  if not test_resources and not test_resources_root:
      test_resources = glob([TEST_RESOURCES_ROOT + '**'])
      if test_resources:
        test_resources_root = TEST_RESOURCES_ROOT

  if test_srcs is None:
      test_srcs = glob([TEST + '/*.java'])

  java_test(
    name = name + '-tests',
    srcs = test_srcs,
    deps = deps +
           test_deps +
           [':' + name + '-jar'],
    source_under_test = [':' + name + '-jar'],
    resources = test_resources,
    resources_root = test_resources_root,
    visibility = visibility
  )

  checkstyle(
      name = name + '-tests',
      srcs = test_srcs,
      jar_target = ':' + name + '-tests',
  )

  #FIXME need to run checkstyle on test sources