| 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: |
| base = get_base_path() |
| # module name; base filepath; files (line-separated); empty line (to signify end of stream) |
| files = '%s\n%s\n' % (name, base) + '\n'.join(['%s/%s' % (base, s) for s in srcs]) + '\n\n' |
| |
| 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 = [ ':' + name + '-checkstyle-files', |
| '//tools/build/conf:onos-java-header', |
| '//tools/build/conf:onos-build-conf', ], |
| 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)', |
| ], |
| #TODO test_rule_timeout_ms seems to be ignored on Linux |
| test_rule_timeout_ms = 45000, |
| 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 sonar( |
| name, |
| test = False |
| ): |
| |
| cmd = '; '.join([ 'rm -f $OUT', |
| 'printf "%(src_base)s = " >> $OUT', |
| '%(srcs)s >> $OUT', |
| 'echo "%(binary_base)s = %(classes)s" >> $OUT', |
| 'printf "%(lib_base)s = " >> $OUT', |
| '%(libraries)s >> $OUT' |
| ]) % { |
| 'srcs' : "echo $(srcs :%s) | sed 's/ /,/g'" % name, |
| 'classes' : ("$(bin_dir :%s#non-osgi)" if not test else "$(bin_dir :%s)") % name, |
| 'libraries' : "echo $(classpath :%s) | sed 's/:/,/g'" % name, |
| 'src_base' : 'sonar.sources' if not test else 'sonar.tests', |
| 'binary_base' : 'sonar.java.binaries' if not test else 'sonar.java.test.binaries', |
| 'lib_base' : 'sonar.java.libraries' if not test else 'sonar.java.test.libraries' |
| } |
| # FIXME do we need to specify dep here or with the expander cover it? |
| genrule( |
| name = name + "-sonar", |
| cmd = cmd, |
| out = 'sonar-project.properties' |
| ) |
| |
| 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 = '', |
| embedded_dependencies = '', |
| bundle_classpath = '', |
| export_packages = '!.,!*.impl.*,!*.internal.*,*', |
| package_name_root = 'org.onosproject', |
| include_resources = {}, |
| web_context = NONE, |
| api_title = None, |
| api_version = NONE, |
| api_package = NONE, |
| api_description = NONE, |
| resources = NONE, |
| resources_root = None, |
| tests = None, |
| do_javadocs = True, |
| do_checkstyle = True, |
| **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 |
| |
| mvn_coords = group_id + ':' + name + ':' + version |
| |
| onos_jar( |
| name = name, |
| # FIXME webapp path hard coded here probably is not right |
| srcs = srcs + glob(['src/main/webapp/**'], excludes = ['src/main/webapp/tests/**']), |
| deps = deps, |
| visibility = visibility, |
| resources = resources, |
| resources_root = resources_root, |
| bundle_name = name, |
| group_id = group_id, |
| bundle_version = version, |
| bundle_license = license, |
| bundle_description = description, |
| import_packages = import_packages, |
| export_packages = export_packages, |
| include_resources = include_resources, |
| dynamicimport_packages = dynamicimport_packages, |
| embedded_dependencies = embedded_dependencies, |
| bundle_classpath = bundle_classpath, |
| web_context = web_context, |
| api_title = api_title, |
| api_version = api_version, |
| api_package = api_package, |
| api_description = api_description, |
| tests = tests, |
| maven_coords = mvn_coords, |
| **kwargs |
| ) |
| |
| ### Checkstyle |
| if do_checkstyle: |
| checkstyle( |
| name = name, |
| srcs = srcs, |
| ) |
| |
| if do_javadocs: |
| 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 = ':' + 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, |
| ) |
| sonar( |
| name = name, |
| ) |
| |
| def osgi_jar_with_tests( |
| name = None, |
| deps = [], |
| group_id = ONOS_GROUP_ID, |
| version = ONOS_VERSION, |
| test_srcs = None, |
| test_deps = [ '//lib:TEST' ], |
| test_resources = None, |
| test_resources_root = None, |
| visibility = [ 'PUBLIC' ], |
| **kwargs |
| ): |
| |
| if name is None: |
| name = _get_name() |
| |
| 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']) |
| |
| mvn_coords = group_id + ':' + name + ':jar:tests:' + version |
| |
| if test_srcs: |
| java_test( |
| name = name + '-tests', |
| srcs = test_srcs, |
| deps = deps + |
| test_deps + |
| [':' + name + '#non-osgi'], |
| resources = test_resources, |
| resources_root = test_resources_root, |
| maven_coords = mvn_coords, |
| visibility = visibility, |
| ) |
| |
| checkstyle( |
| name = name + '-tests', |
| srcs = test_srcs, |
| ) |
| |
| sonar( |
| name = name + '-tests', |
| test = True |
| ) |
| |
| osgi_jar(name = name, |
| deps = deps, |
| group_id = group_id, |
| version = version, |
| visibility = visibility, |
| tests = [':' + name + '-tests'], |
| **kwargs) |
| else: |
| osgi_jar(name = name, |
| deps = deps, |
| group_id = group_id, |
| version = version, |
| visibility = visibility, |
| **kwargs) |
| |
| def tar_file( |
| name, |
| srcs, |
| other_tars = [], |
| flat = False, |
| root = None, |
| out = None, |
| visibility = [ 'PUBLIC' ], |
| ): |
| |
| cmds = [ 'mkdir -p $TMP/%(root_dir)s', |
| 'cp -R -L $SRCDIR/* $TMP/%(root_dir)s' ] |
| for t in other_tars: |
| cmds += [ 'tar -zxf $(location %s)' % t + ' -C $TMP/%(root_dir)s' ] |
| |
| if flat: |
| cmds += [ 'find $TMP/%(root_dir)s -type f -exec mv {} $TMP/%(root_dir)s \;', |
| 'find $TMP/%(root_dir)s/* -type d -d -exec rmdir {} \;' ] |
| |
| cmds += [ 'tar -C $TMP -zcf $OUT %(root_dir)s' ] |
| |
| cmd = ' && '.join(cmds) % { |
| 'root_dir': root if root is not None else name |
| } |
| |
| genrule( |
| name = name, |
| srcs = srcs, |
| bash = cmd, |
| out = out if out is not None else ( root if root is not None else name ) + '.tar.gz', |
| visibility = visibility, |
| ) |
| |
| def only_lib_dep_pom( |
| name, |
| src, |
| out, |
| version = ONOS_VERSION, |
| onosGroupId = ONOS_GROUP_ID, |
| visibility = [ 'PUBLIC' ], |
| ): |
| |
| cmd = 'grep -v \<module\> ' + src + ' | sed "s#<modules>#<modules><module>lib</module>#" >$OUT' |
| |
| genrule( |
| name = name, |
| srcs = [ src ], |
| bash = cmd, |
| out = out, |
| visibility = visibility, |
| maven_coords = onosGroupId + ':onos:pom:' + version, |
| ) |
| |
| def pass_thru_pom( |
| name, |
| src, |
| out, |
| artifactId, |
| version = ONOS_VERSION, |
| onosGroupId = ONOS_GROUP_ID, |
| visibility = [ 'PUBLIC' ], |
| ): |
| |
| cmd = 'cp ' + src + ' $OUT' |
| |
| genrule( |
| name = name, |
| srcs = [ src ], |
| bash = cmd, |
| out = out, |
| visibility = visibility, |
| maven_coords = onosGroupId + ':' + artifactId + ':pom:' + version, |
| ) |