Skip to content
Commits on Source (3)
javatools (0.72.2) UNRELEASED; urgency=medium
* Team upload.
* Rewrite jh_build into a proper debhelper command enabling it
to understand "-N".
-- Niels Thykier <niels@thykier.net> Wed, 02 Jan 2019 08:35:39 +0000
javatools (0.72.1) unstable; urgency=medium
* Fixed the installation of java-arch.sh
......
jh_build.1
jh_depends.1
jh_makepkg.1
jh_repack.1
......
......@@ -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
......
#!/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
}
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/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);
}
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;
}
# 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
}
JAVAC="${JAVA_HOME}/bin/javac"
JAVADOC="${JAVA_HOME}/bin/javadoc -locale en_US"
JAR="${JAVA_HOME}/bin/jar"
jarfile="${ARGV[0]}"
if [ -z "$jarfile" ]; then
if [ -f debian/javabuild ]; then
cat debian/javabuild | while read line; do
dobuild $line
done
fi
else
dobuild "${ARGV[@]}"
fi
_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.
=head1 SEE ALSO
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
.\" 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