diff options
author | Andrej Shadura <andrew.shadura@collabora.co.uk> | 2019-03-10 12:04:58 +0000 |
---|---|---|
committer | Andrej Shadura <andrew.shadura@collabora.co.uk> | 2019-03-10 12:05:06 +0000 |
commit | 07265d9a8896f6c3e9f01ce2a1e680732acbf6f1 (patch) | |
tree | c4d54abb92b4cf6f7445aaada2ce228f10b75905 | |
parent | 578e0e3628707cb2b12bceca9720c47b87065a96 (diff) | |
parent | a2745feeed463e34362f5517a8e60b11882ca0d4 (diff) |
Merge branches master and buster
-rw-r--r-- | debian/changelog | 11 | ||||
-rw-r--r-- | debian/control | 1 | ||||
-rw-r--r-- | debian/javahelper.manpages | 1 | ||||
-rwxr-xr-x | debian/rules | 1 | ||||
-rwxr-xr-x | jh_build | 465 | ||||
-rw-r--r-- | jh_build.1 | 32 |
6 files changed, 295 insertions, 216 deletions
diff --git a/debian/changelog b/debian/changelog index dd6c957..0a8ec79 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,14 @@ +javatools (0.72.3) UNRELEASED; urgency=medium + + * Team upload. + + [ Niels Thykier ] + * Rewrite jh_build into a proper debhelper command enabling it + to understand "-N". + * Remove obsolete Suggests on cvs, gawk and tofrodos. + + -- Niels Thykier <niels@thykier.net> Wed, 02 Jan 2019 08:35:39 +0000 + javatools (0.72.2) unstable; urgency=medium * Team upload. diff --git a/debian/control b/debian/control index 32178d1..85ee119 100644 --- a/debian/control +++ b/debian/control @@ -39,7 +39,6 @@ Depends: libarchive-zip-perl (>= 1.30-6~), ${misc:Depends}, ${perl:Depends} -Suggests: cvs, gawk, tofrodos Description: Helper scripts for packaging Java programs Javahelper contains several scripts which help in packaging Java programs. diff --git a/debian/javahelper.manpages b/debian/javahelper.manpages index ec5a534..e18ebd5 100644 --- a/debian/javahelper.manpages +++ b/debian/javahelper.manpages @@ -1,4 +1,3 @@ -jh_build.1 jh_depends.1 jh_makepkg.1 jh_repack.1 diff --git a/debian/rules b/debian/rules index ca2b144..74aa99e 100755 --- a/debian/rules +++ b/debian/rules @@ -24,6 +24,7 @@ override_dh_auto_build: jh_lib.sh $(POD2MAN) jh_setupenvironment tmp/jh_setupenvironment.1 $(POD2MAN) jh_compilefeatures tmp/jh_compilefeatures.1 $(POD2MAN) jh_exec tmp/jh_exec.1 + $(POD2MAN) jh_build tmp/jh_build.1 $(POD2MAN) jh_linkjars tmp/jh_linkjars.1 $(POD2MAN) jh_manifest tmp/jh_manifest.1 $(POD2MAN) jh_classpath tmp/jh_classpath.1 @@ -1,191 +1,292 @@ -#!/bin/bash -- - -EXECDIRS="bin usr/bin usr/games" - -set -e -. /usr/share/javahelper/jh_lib.sh - -syntax() -{ - echo -e "Usage: jh_build [options] [<jar> <src>]" - echo -e "Options:" - echo -e "\t-h --help: show this text" - echo -e "\t-V --version: show the version" - echo -e "\t-q --quiet: don't print the build commands as they are executed" - echo -e "\t-m<class> --main=<class>: Use this class as the main class" - echo -e "\t-j<java-home> --java-home=<java-home>: Set the JAVA_HOME variable" - echo -e "\t-o<javac-opts> --javacopts=<javac-opts>: Options to the Java compiler" - echo -e "\t--clean: clean the build tree" - echo -e "\t-N --no-javadoc: Disable building javadoc" - echo -e "\t-J --javadoc: Enable building javadoc" - echo -e "\t--javadoc-opts=<javadoc-opts>: Options to javadoc" - echo -e "Environment Variables:" - echo -e "\tJAVA_HOME: path to the JDK to use" - echo -e "\tCLASSPATH: classpath to compile with and set in the manifest" - echo -e "\tJH_JAR_EXTRA: extra files to be included in the jar" - exit 1 +#!/use/bin/perl + +=head1 NAME + +jh_build - compile java sources in the absence of a (useful) upstream build system + +=cut + +use strict; +use warnings; +use Cwd qw(realpath); + +# Value to pass to -source/-target by default +use constant DEFAULT_JAVA_RELEASE => '1.7'; + +use Debian::Debhelper::Dh_Lib; +use Debian::Javahelper::Java qw(write_manifest_fd); +use Debian::Javahelper::Manifest qw(MAIN_SECTION); + + +=head1 SYNOPSIS + +B<jh_build> [S<I<debhelper options>>] + +B<jh_build> [S<I<debhelper options>>] S<I<jarfile>> S<I<source>> [... S<I<source>>] + +=head1 DESCRIPTION + + + +=head1 FILES + +=over 4 + +=item debian/javabuild + +A file consisting of each build to perform. One build per line +where each line consists of: + + I<jarfile> I<source> [... I<source>] + +Where I<jarfile> is the name of the jar file to be built and I<source> is +a source file or directory containing source files. + +=back + +=head1 OPTIONS + +=over 4 + +=item B<--main-class=>I<main-class> + +Set the B<Main-Class> attribute in the manifest of the generated jar file(s) to I<main-class>. +This makes B<java -jar I<generated-jar-file>> run that class. + +=item B<--java-home=>I<home> + +Use I<home> as B<JAVA_HOME> (overrides the B<JAVA_HOME> environment variable). + +=item B<-J>, B<--javadoc>, B<-N>, B<--no-javadoc> + +Whether or not to build javadoc for the jar files. The default is to +generate javadoc along with the jar files. + +The B<-N> is the short variant of B<--no-javadoc>. + +=item B<-o> I<options>, B<--javacopts=>I<options> + +Pass I<options> to javac (when invoking javac). The I<options> value +is a space-separate list of options (remember to quote the argument to avoid the shell +interpreting the value). + +=item B<--javadoc-opts=>I<options> + +Pass I<options> to javadoc (when invoking javadoc). The I<options> value +is a space-separate list of options (remember to quote the argument to avoid the shell +interpreting the value). + +=item B<--clean> + +If passed, B<jh_build> will clean up after itself. This is called by +L<jh_clean(1)> and using L<jh_clean(1)> is recommended over calling +B<jh_build> with B<--clean> directly. + +=back + +=head1 ENVIRONMENT + +=over 4 + +=item B<JAVA_HOME> + +If set (and B<--java-home> is omitted), it determines the location of the java home +for finding the L<javac(1)> compiler, L<javadoc(1)> compiler and the L<jar(1)> utility. + +If the environment variable is unset and B<--java-home> is omitted, then the default +java home is F</usr/lib/jvm/default-java> + +=item CLASSPATH + +If set, this is the classpath used during compilation of the source code. + +=item JH_JAR_EXTRA + +A space separated list of extra files or directories to include in the generated jar file(s). + +Can be omitted if no extra files need to be included. + +=back + +=cut + +my $JAVA_HOME = $ENV{'JAVA_HOME'}; +my $CLASSPATH_ORIG = $ENV{'CLASSPATH'}; +my $CLASSPATH = $CLASSPATH_ORIG; +my @JH_JAR_EXTRA; +my $build_javadoc = 1; +my (@javac_opts, @javadoc_opts, $main_class, $do_clean); +my (@JAVAC, @JAVADOC, @JAR, @CLASSPATHDOCS, @builds); + +$CLASSPATH =~ tr/:/ / if defined($CLASSPATH_ORIG); +@JH_JAR_EXTRA = split(' ', $ENV{'JH_JAR_EXTRA'}) if @JH_JAR_EXTRA; + +init(options => { + 'main|m=s' => \$main_class, + 'java-home|j=s' => \$JAVA_HOME, + 'javadoc|J!' => $build_javadoc, + 'N' => sub { $build_javadoc = 0; }, + 'clean' => \$do_clean, + # Space-separated list of options + 'javacopts|o=s' => sub { @javadoc_opts = split(' ', $_[1])}, + 'javadoc-opts=s' => sub { @javadoc_opts = split(' ', $_[1])}, +}); + +if ($do_clean) { + my @files; + complex_doit('rm -fr debian/_jh_manifest* debian/_jh_build*'); + if (-f 'debian/javabuild') { + @files = map { $_->[0] } filedoublearray('debian/javabuild'); + rm_files(@files); + } + exit(0); } -ARGS="q quiet m main j java-home o javacopts J javadoc N no-javadoc O javadoc-opts clean" parseargs "$@" - -if [ -n "`getarg clean`" ]; then - rm -rf debian/_jh_manifest* debian/_jh_build* - if [ -f debian/javabuild ]; then - rm -f `awk '{print $1}' < debian/javabuild` - fi - exit 0 -fi - -if [ -n "`getarg j java-home`" ]; then - JAVA_HOME="`getarg j java-home`" -elif [ -z "$JAVA_HOME" ]; then - if [ -d /usr/lib/jvm/default-java ]; then - JAVA_HOME=/usr/lib/jvm/default-java - else - JAVA_HOME=invalid - fi -fi - -JH_JAVAC_OPTS="`getarg o javacopts`" -JH_JAVADOC_OPTS="`getarg O javadoc-opts`" - -if ! grep -- -encoding <<< "$JH_JAVAC_OPTS" &>/dev/null; then - # Use ISO8859-1 as the default encoding to avoid unmappable character errors - JH_JAVAC_OPTS="-encoding ISO8859-1 $JH_JAVAC_OPTS" -fi - -if ! grep -- --release <<< "$JH_JAVAC_OPTS" &>/dev/null; then - if ! grep -- -source <<< "$JH_JAVAC_OPTS" &>/dev/null; then - if ! grep -- -target <<< "$JH_JAVAC_OPTS" &>/dev/null; then - JH_JAVAC_OPTS="-source 1.7 -target 1.7 $JH_JAVAC_OPTS" - else - JH_JAVAC_OPTS="-source 1.7 $JH_JAVAC_OPTS" - fi - fi -fi - -if ! grep -- --release <<< "$JH_JAVAC_OPTS" &>/dev/null; then - if ! grep -- -source <<< "$JH_JAVADOC_OPTS" &>/dev/null; then - JH_JAVADOC_OPTS="-source 1.7 $JH_JAVADOC_OPTS" - fi -fi - -if ! grep -- -notimestamp <<< "$JH_JAVADOC_OPTS" &>/dev/null; then - JH_JAVADOC_OPTS="-notimestamp $JH_JAVADOC_OPTS" -fi - -if ! grep -- -encoding <<< "$JH_JAVADOC_OPTS" &>/dev/null; then - JH_JAVADOC_OPTS="-encoding ISO8859-1 $JH_JAVADOC_OPTS" -fi - -function dobuild() -{ - - jarfile="$1" - shift - ext="`basename "$jarfile" .jar`" - srcdirs=() - srcfiles=() - while [ -n "$1" ]; do - if [ -f "$1" ]; then - srcfiles+=("$1") - elif [ -d "$1" ]; then - srcdirs+=("$1") - else - echo "Ignoring $1 because it does not exist" - fi - shift - done - - if [ "$JAVA_HOME" == "invalid" ]; then - echo "Cannot find any JAVA_HOME: aborting" 1>&2 - exit 1 - fi - - rm -f debian/_jh_manifest.$ext - ( - if [ -n "$CLASSPATH" ]; then - echo -n "Class-Path: " - echo $CLASSPATH | sed 's/:/ /g' - fi - if [ -n "`getarg m main`" ]; then - echo "Main-Class: `getarg m main`" - echo "Debian-Java-Home: $JAVA_HOME" - fi - ) | perl -p -e 's/(.{72})(?=.)/$1\n /go' >> debian/_jh_manifest.$ext - # (NB: see D::JH::Java::write_manifest_section_fd on the regex above) - - CLASSPATHDOCS="`for i in $(grep-dctrl --no-field-names --show-field Build-Depends,Build-Depends-Indep -F source "$pkg" debian/control | tr , ' ' | sed 's/([^)]*)//g') ; do dpkg -L $i 2>/dev/null | grep /usr/share/doc/.*/api$; done | sed 's/^/-link /' | xargs`" - - mkdir -p debian/_jh_build.$ext - if [ -n "$srcdirs" ]; then - - if [ -z "`getarg q quiet`" ]; then - echo find "${srcdirs[@]}" -name '*.java' -and -type f -print0 '|' xargs -s 512000 -0 $JAVAC -g -cp $CLASSPATH:debian/_jh_build.$ext -d debian/_jh_build.$ext $JH_JAVAC_OPTS "${srcfiles[@]}" - fi - - find "${srcdirs[@]}" -name '*.java' -and -type f -print0 | xargs -s 512000 -0 $JAVAC -g -cp $CLASSPATH:debian/_jh_build.$ext -d debian/_jh_build.$ext $JH_JAVAC_OPTS "${srcfiles[@]}" - - if [ -n "`getarg J javadoc`" ] || [ -z "`getarg N no-javadoc`" ]; then - if [ -z "`getarg q quiet`" ]; then - echo find "${srcdirs[@]}" -name '*.java' -and -type f -print0 '|' xargs -s 512000 -0 $JAVADOC $CLASSPATHDOCS -classpath $CLASSPATH:debian/_jh_build.$ext -d debian/_jh_build.javadoc/api -quiet $JH_JAVADOC_OPTS "${srcfiles[@]}" - fi - - find "${srcdirs[@]}" -name '*.java' -and -type f -print0 | xargs -s 512000 -0 $JAVADOC $CLASSPATHDOCS -classpath $CLASSPATH:debian/_jh_build.$ext -d debian/_jh_build.javadoc/api -quiet $JH_JAVADOC_OPTS "${srcfiles[@]}" - fi - - elif [ -n "$srcfiles" ]; then - - if [ -z "`getarg q quiet`" ]; then - echo $JAVAC -g -cp $CLASSPATH:debian/_jh_build.$ext -d debian/_jh_build.$ext $JH_JAVAC_OPTS "${srcfiles[@]}" - fi - - $JAVAC -g -cp $CLASSPATH:debian/_jh_build.$ext -d debian/_jh_build.$ext $JH_JAVAC_OPTS "${srcfiles[@]}" - - if [ -n "`getarg J javadoc`" ] || [ -z "`getarg N no-javadoc`" ]; then - if [ -z "`getarg q quiet`" ]; then - echo $JAVADOC $CLASSPATHDOCS -classpath $CLASSPATH:debian/_jh_build.$ext -d debian/_jh_build.javadoc/api -quiet $JH_JAVADOC_OPTS "${srcfiles[@]}" - fi - $JAVADOC $CLASSPATHDOCS -classpath $CLASSPATH:debian/_jh_build.$ext -d debian/_jh_build.javadoc/api -quiet $JH_JAVADOC_OPTS "${srcfiles[@]}" - fi - - else - exit 0 - fi - - touch "$jarfile" - jarpath="`readlink -f "$jarfile"`" - - ( - cd debian/_jh_build.$ext; - if [ -z "`getarg q quiet`" ]; then - echo $JAR cfm "$jarpath" ../_jh_manifest.$ext * - fi - $JAR cfm "$jarpath" ../_jh_manifest.$ext * - ) - if [ -n "$JH_JAR_EXTRA" ]; then - if [ -z "`getarg q quiet`" ]; then - echo $JAR uf "$jarpath" $JH_JAR_EXTRA - fi - $JAR uf "$jarpath" $JH_JAR_EXTRA - fi +sub _has_java_option { + my ($opt_ref, $option_name) = @_; + for my $arg (@{$opt_ref}) { + return 1 if $arg eq $option_name; + } + return 0; +} +sub _default_java_option { + my ($opt_ref, $option_name, $default_value) = @_; + return if _has_java_option($opt_ref, $option_name); + if (defined($default_value)) { + # -source <version> + push(@{$opt_ref}, $option_name, $default_value); + } else { + # -notimestamp + push(@{$opt_ref}, $option_name); + } + return; } -JAVAC="${JAVA_HOME}/bin/javac" -JAVADOC="${JAVA_HOME}/bin/javadoc -locale en_US" -JAR="${JAVA_HOME}/bin/jar" +# Use ISO8859-1 as the default encoding to avoid unmappable character errors +_default_java_option(\@javac_opts, '-encoding', 'ISO8859-1'); +_default_java_option(\@javadoc_opts, '-encoding', 'ISO8859-1'); + +if (not _has_java_option(\@javac_opts, '--release') and not _has_java_option(\@javac_opts, '-source')) { + # If neither --release nor -source is set, then set -source (and -target if also absent) + if (not _has_java_option(\@javac_opts, '-target')) { + push(@javac_opts, '-source', DEFAULT_JAVA_RELEASE, '-target', DEFAULT_JAVA_RELEASE); + } else { + push(@javac_opts, '-source', DEFAULT_JAVA_RELEASE); + } +} + +if (not _has_java_option(\@javadoc_opts, '--release')) { + _default_java_option(\@javadoc_opts, '-source', DEFAULT_JAVA_RELEASE); +} + +_default_java_option(\@javadoc_opts, '-notimestamp'); + + +sub do_build { + my ($jarfile, @sources) = @_; + my (@srcdirs, @srcfiles); + my $basename = basename($jarfile); + my $ext = $basename; + $ext =~ s/[.]jar$//; + + for my $source (@sources) { + if (-f $source) { + push(@srcfiles, $source); + } elsif (-d _) { + push(@srcdirs, $source); + } else { + warning("Ignoring $source because it does not exist"); + } + } + rm_files("debian/_jh_manifest.${ext}"); + if ($main_class or defined($CLASSPATH)) { + my $manifest = Debian::Javahelper::Manifest->new; + my $main_section = $manifest->get_section(MAIN_SECTION); + if (defined($CLASSPATH)) { + $main_section->set_value('Class-Path', $CLASSPATH); + } + if ($main_class) { + $main_section->set_value('Main-Class', $main_class); + $main_section->set_value('Debian-Java-Home', $JAVA_HOME); + } + open(my $fd, '>', "debian/_jh_manifest.$ext") or error("open(debian/_jh_manifest.$ext) failed: $!"); + write_manifest_fd($manifest, $fd, "debian/_jh_manifest.$ext"); + close($fd) or error("close(debian/_jh_manifest.$ext) failed: $!"); + } + + install_dir("debian/_jh_build.$ext"); + + if (@srcdirs) { + my $dirs_escaped = escape_shell(@srcdirs); + my $files_escaped = escape_shell(@srcfiles); + complex_doit(qq{find $dirs_escaped -name '*.java' -and -type f -print0 | xargs -s 512000 -0 @JAVAC -g -cp ${CLASSPATH_ORIG}:debian/_jh_build.$ext -d debian/_jh_build.$ext @javac_opts $files_escaped}); + if ($build_javadoc) { + complex_doit(qq{find $dirs_escaped -name '*.java' -and -type f -print0 | xargs -s 512000 -0 @JAVADOC @CLASSPATHDOCS -classpath ${CLASSPATH_ORIG}:debian/_jh_build.$ext -d debian/_jh_build.javadoc/api -quiet $JH_JAVADOC_OPTS $files_escaped}); + } + + } elsif (@srcfiles) { + doit(@JAVAC, '-g', '-cp', "${CLASSPATH_ORIG}:_jh_build.$ext", '-d', "debian/_jh_build.$ext", '-quiet', @javac_opts, @srcfiles); + if ($build_javadoc) { + doit(@JAVADOC, @CLASSPATHDOCS, '-classpath', "${CLASSPATH_ORIG}:_jh_build.$ext", '-d', "debian/_jh_build.javadoc/api", '-quiet', @javadoc_opts, @srcfiles); + } + } else { + return; + } + + my $dir = dirname($jarfile); + my $resolved_dir = realpath($dir) // error("Cannot resolve $dir: $!"); + my $jarpath = "${resolved_dir}/${basename}"; + complex_doit(qq{cd debian/_jh_build.$ext && @JAR cfm "$jarpath" ../_jh_manifest.$ext *}); + doit(@JAR, 'uf', $jarpath, @JH_JAR_EXTRA) if @JH_JAR_EXTRA; + return; +} + +sub _classpath_docs { + my $source = sourcepackage(); + return map { + chomp; + ('-link', $_) + } `for i in \$(grep-dctrl --no-field-names --show-field Build-Depends,Build-Depends-Indep -F source "${source}" debian/control | tr , ' ' | sed 's/([^)]*)//g') ; do dpkg -L \$i 2>/dev/null | grep /usr/share/doc/.*/api\$; done`; +} + +# By default, jh_build does nothing without a debian/javabuild file or explicit arguments. +# PROMISE: DH NOOP WITHOUT pkgfile(javabuild) + +if (@ARGV) { + push(@builds, [@ARGV]); +} elsif (-f 'debian/javabuild') { + @builds = filedoublearray('debian/javabuild') +} + +if (@builds) { + if (not $JAVA_HOME) { + $JAVA_HOME = '/usr/lib/jvm/default-java' if -d '/usr/lib/jvm/default-java'; + } + if (not $JAVA_HOME) { + error("Cannot find any JAVA_HOME: aborting"); + } + @JAVAC = ("${JAVA_HOME}/bin/javac"); + @JAVADOC = ("${JAVA_HOME}/bin/javadoc", '-locale', 'en_US'); + @JAR = ("${JAVA_HOME}/bin/jar"); + @CLASSPATHDOCS = _classpath_docs(); + for my $build (@builds) { + do_build(@{$build}); + } +} + +=head1 EXAMPLE + + jh_build foo.jar src/java/main + +Will generate B<foo.jar> from compiling all the java files in F<src/java/main> +and generate a javadoc from it. -jarfile="${ARGV[0]}" +=head1 SEE ALSO -if [ -z "$jarfile" ]; then - if [ -f debian/javabuild ]; then - cat debian/javabuild | while read line; do - dobuild $line - done - fi -else - dobuild "${ARGV[@]}" -fi +L<debhelper(7)> +This program is a part of javahelper and uses debhelper as backend. There are +also tutorials in /usr/share/doc/javahelper. +=cut diff --git a/jh_build.1 b/jh_build.1 deleted file mode 100644 index f559a91..0000000 --- a/jh_build.1 +++ /dev/null @@ -1,32 +0,0 @@ -.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.36. -.TH JAVAHELPER "1" "January 2008" "Javahelper Version 0.5" "User Commands" -.SH NAME -Javahelper \- Part of the Java Helper packaging tools -Refer to the tutorials in /usr/share/doc/javahelper for more detail -.SH SYNOPSIS -.B jh_build -[\fIoptions\fR] [\fI<jar> <src>\fR] -.SH OPTIONS -.HP -\fB\-h\fR \fB\-\-help\fR: show this text -.HP -\fB\-V\fR \fB\-\-version\fR: show the version -.HP -\fB\-m\fR<class> \fB\-\-main=\fR<class>: Use this class as the main class -.HP -\fB\-j\fR<java\-home> \fB\-\-java\-home=\fR<java\-home>: Set the JAVA_HOME variable -.HP -\fB\-o\fR<javac\-opts> \fB\-\-javacopts=\fR<javac\-opts>: Options to the Java compiler -.HP -\fB\-J\fR \fB\-\-javadoc\fR: Build javadoc -.HP -\fB\-N\fR \fB\-\-no-javadoc\fR: Don't build javadoc -.HP -\fB\-\-javadoc-opts=\fR<javadocc\-opts>: Options to the Javadoc compiler -.HP -\fB\-\-clean\fR: clean the build tree -.SS "Environment Variables:" -.IP -JAVA_HOME: path to the JDK to use -CLASSPATH: classpath to compile with and set in the manifest -JH_JAR_EXTRA: extra files to be included in the jar |