summaryrefslogtreecommitdiffstats
path: root/libjava/Makefile.am
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/Makefile.am')
-rw-r--r--libjava/Makefile.am144
1 files changed, 86 insertions, 58 deletions
diff --git a/libjava/Makefile.am b/libjava/Makefile.am
index be1affd0fce..c0aa90926d8 100644
--- a/libjava/Makefile.am
+++ b/libjava/Makefile.am
@@ -228,6 +228,63 @@ BOOTCLASSPATH = $(here)'$(CLASSPATH_SEPARATOR)'$(srcdir)'$(CLASSPATH_SEPARATOR)'
## ################################################################
+# Files for which we build .lo files
+all_native_compiled_source_files = \
+ $(java_source_files) \
+ $(built_java_source_files) \
+ $(xlib_java_source_files)
+
+# Files for which we build .class files
+# It *must* begin with $(all_native_compiled_source_files)
+all_java_source_files = \
+ $(all_native_compiled_source_files) \
+ $(gtk_awt_peer_source_files) \
+ $(gnu_xml_source_files) \
+ $(javax_imageio_source_files) \
+ $(javax_xml_source_files) \
+ $(gnu_java_beans_source_files) \
+ gnu/gcj/tools/gcj_dbtool/Main.java
+
+EXTRA_DIST = $(all_java_source_files)
+
+# Build a list of native and bytecode-compiled directories. The Makefile
+# depends on them, because they affect the definition of two variables
+# below.
+# Each directory's filelist file depends on the corresponding Java source files
+# Each class file depends on the its directory's .stamp file
+# Below, one .lo file is built per directory when the stamp file changes
+
+Makefile.deps: $(srcdir)/Makefile.in
+ @: $(call write_entries_to_file,$(all_java_source_files),files.tmplist)
+ sed 's,/[^/]*$$,,' \
+ files.tmplist | sort | uniq > bytecodes.list
+ sed -n '1,$(words $(all_native_compiled_source_files))s,/[^/]*$$,,p' \
+ files.tmplist | sort | uniq > native.list
+ echo 's,^\(.*\)/\([^/]*\)\.java$$,\1.list: \0\' > tmpsed
+ echo '\1/\2.class: \1.stamp,' >> tmpsed
+ sed -ftmpsed files.tmplist \
+ > Makefile.deps
+ rm files.tmplist tmpsed
+
+all_native_compiled_dirs := $(shell test -f native.list && cat native.list)
+all_java_dirs := $(shell test -f bytecodes.list && cat bytecodes.list)
+all_java_lo_files = $(all_native_compiled_dirs:=.lo)
+all_java_deps_files = $(all_java_dirs:=.deps)
+all_java_stamp_files = $(all_java_dirs:=.stamp)
+all_java_filelist_files = $(all_java_dirs:=.list)
+
+# In the future these may be defined manually, if we decide to split libgcj.so
+# into multiple shared libraries. For now, everything but xlib goes into
+# all_libgcj_lo_files
+all_xlib_lo_files = gnu/gcj/xlib.lo gnu/awt/xlib.lo
+all_libgcj_lo_files = $(filter-out $(all_xlib_lo_files), $(all_java_lo_files))
+
+# Include automatically generated dependencies between Java source files.
+-include Makefile.deps $(all_java_deps_files)
+
+all_property_files = $(property_files) \
+ java/util/logging/logging.properties
+
##
## How to build libgcj.a and libgcj.jar
##
@@ -246,23 +303,22 @@ libgij_la_LDFLAGS = -rpath $(toolexeclibdir) \
# subsections in the linker, such as Alpha and MIPS.
libgcj0_convenience_la_SOURCES = prims.cc jni.cc exception.cc stacktrace.cc \
link.cc defineclass.cc interpret.cc verify.cc \
- $(nat_source_files) $(math_c_source_files) $(java_source_files) \
- $(built_java_source_files) \
+ $(nat_source_files) $(math_c_source_files) \
$(BOEHMGC_SRC) $(NOGC_SRC) \
$(BACKTRACE_SRC) \
$(POSIX_PLATFORM_SRC) $(WIN32_PLATFORM_SRC) $(ECOS_PLATFORM_SRC) \
$(DARWIN_CRT_SRC) \
$(POSIX_THREAD_SRC) $(WIN32_THREAD_SRC) $(NO_THREAD_SRC)
libgcj0_convenience_la_LIBADD = \
+ $(all_libgcj_lo_files) \
gnu-xml.lo javax-imageio.lo \
javax-xml.lo gnu-java-beans.lo \
external/sax/libsax-gcj.la \
external/w3c_dom/libw3c-gcj.la
+libgcj0_convenience_la_DEPENDENCIES = $(libgcj0_convenience_la_LIBADD)
noinst_LTLIBRARIES = libgcj0_convenience.la
-libgcj_la_SOURCES =
-
## Objects from C++ sources in subdirs.
nat_files = $(nat_source_files:.cc=.lo)
xlib_nat_files = $(xlib_nat_source_files:.cc=.lo)
@@ -344,7 +400,7 @@ jni/gtk-peer/gtk_jawt.c \
jni/classpath/native_state.c
## Java sources for Gtk peers.
-gtk_awt_peer_sources = \
+gtk_awt_peer_source_files = \
gnu/java/awt/peer/gtk/GdkTextLayout.java \
gnu/java/awt/peer/gtk/GdkFontMetrics.java \
gnu/java/awt/peer/gtk/GdkFontPeer.java \
@@ -393,7 +449,7 @@ gnu/java/awt/peer/gtk/GThreadMutex.java \
gnu/java/awt/peer/gtk/GThreadNativeMethodRunner.java
-gtk_jni_headers = $(patsubst %.java,jniinclude/%.h,$(subst /,_,$(gtk_awt_peer_sources)))
+gtk_jni_headers = $(patsubst %.java,jniinclude/%.h,$(subst /,_,$(gtk_awt_peer_source_files)))
jniinclude/gnu_java_awt_peer_gtk_GdkGraphics.h: gnu/java/awt/peer/gtk/GdkGraphics.java
jniinclude/gnu_java_awt_peer_gtk_GdkGraphics2D.h: gnu/java/awt/peer/gtk/GdkGraphics2D.java
@@ -510,11 +566,10 @@ libgcjawt_la_LDFLAGS = \
$(LIBGCJ_LD_SYMBOLIC)
libgcjawt_la_LINK = $(LIBLINK)
-lib_gnu_awt_xlib_la_SOURCES = \
- $(xlib_java_source_files) \
- $(xlib_nat_source_files)
-lib_gnu_awt_xlib_la_DEPENDENCIES = libgcj-$(gcc_version).jar libgcj.la libgcj.spec
-lib_gnu_awt_xlib_la_LIBADD = $(xlib_javao_files)
+lib_gnu_awt_xlib_la_SOURCES = $(xlib_nat_source_files)
+lib_gnu_awt_xlib_la_LIBADD = $(all_xlib_lo_files)
+lib_gnu_awt_xlib_la_DEPENDENCIES = libgcj-$(gcc_version).jar libgcj.la libgcj.spec \
+ $(lib_gnu_awt_xlib_la_LIBADD)
## We require libstdc++-v3 to be in the same build tree.
lib_gnu_awt_xlib_la_CPPFLAGS = \
$(AM_CPPFLAGS) \
@@ -528,21 +583,6 @@ lib_gnu_awt_xlib_la_LDFLAGS = ../libstdc++-v3/src/libstdc++.la \
-version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LIBGCJ_LD_SYMBOLIC)
lib_gnu_awt_xlib_la_LINK = $(LIBLINK)
-all_java_source_files = \
- $(java_source_files) \
- $(built_java_source_files) \
- $(gtk_awt_peer_sources) \
- $(xlib_java_source_files) \
- $(gnu_xml_source_files) \
- $(javax_imageio_source_files) \
- $(javax_xml_source_files) \
- $(gnu_java_beans_source_files)
-
-all_java_class_files = $(all_java_source_files:.java=.class)
-
-all_property_files = $(property_files) \
- java/util/logging/logging.properties
-
## Build property files into the library.
property_files = \
gnu/regexp/MessagesBundle.properties \
@@ -554,32 +594,24 @@ propertyo_files = $(property_files:.properties=.properties.lo)
%.properties.lo: %.properties
$(LTGCJCOMPILE) -o $@ -c $< -Wc,--resource,`echo $@ | sed "s/\.lo$$//"`
-if ONESTEP
-
-# Compile all classfiles in one go.
+# Compile one directory in one go. If the files have to be compiled with the
+# binary compatibility ABI, only make the .class here -- the .lo is made
+# elsewhere in this Makefile.
-classes.stamp: $(all_java_source_files) gnu/gcj/tools/gcj_dbtool/Main.java
- @echo Compiling Java sourcefiles...
- @: $(call write_entries_to_file,$?,libgcj.sourcelist)
- $(JAVAC) $(JCFLAGS) -classpath '' -bootclasspath $(BOOTCLASSPATH) -d $(here) @libgcj.sourcelist
- echo > classes.stamp
-# This next rule seems backward, but reflects the fact that 1) all
-# classfiles are compiled in one go when classes.stamp is built and 2)
-# anything which depends on a particular .class file must wait until
-# this file is built.
-$(all_java_class_files) gnu/gcj/tools/gcj_dbtool/Main.class: classes.stamp
+%.list:
+ @: $(shell $(mkinstalldirs) $(basename $@))
+ @: $(call write_entries_to_file,$^,$@)
-else # !ONESTEP
+$(all_java_lo_files): %.lo: %.stamp
+ $(LTGCJCOMPILE) -o $@ -c @${<:.stamp=.list}
-# Compile each classfile individually.
+$(all_java_stamp_files): %.stamp: %.list
+ $(JAVAC) $(JCFLAGS) -classpath '' -bootclasspath $(BOOTCLASSPATH) -d $(here) \
+ -MD -MF ${@:.stamp=.deps} @$<
+ echo timestamp > $@
-.java.class:
- $(JAVAC) $(JCFLAGS) -classpath '' -bootclasspath $(BOOTCLASSPATH) -d $(here) $<
-
-classes.stamp: $(all_java_class_files) $(all_property_files)
- echo > classes.stamp
-
-endif
+classes.stamp: $(all_property_files) $(all_java_stamp_files)
+ echo timestamp > classes.stamp
libgcj-$(gcc_version).jar: classes.stamp
-@rm -f libgcj-$(gcc_version).jar
@@ -605,7 +637,9 @@ libgcj-$(gcc_version).jar: classes.stamp
$(ZIP) -ufM0E@ $@; \
done
-CLEANFILES = libgcj-$(gcc_version).jar classes.stamp
+CLEANFILES = libgcj-$(gcc_version).jar classes.stamp $(all_java_stamp_files) \
+ $(all_java_deps_files) $(all_java_filelist_files)
+DISTCLEANFILES = Makefile.deps native.dirs bytecompile.dirs
mostlyclean-local:
## Use libtool rm to remove each libtool object
@@ -628,16 +662,10 @@ clean-nat:
SUFFIXES = .class .java .h .properties
-$(javao_files) $(xlib_javao_files): %.lo: %.java
- $(LTGCJCOMPILE) -o $@ -c $<
-
## Pass the list of object files to libtool in a temporary file to
## avoid tripping platform command line length limits.
-libgcj.la: $(libgcj_la_OBJECTS) $(libgcj_la_DEPENDENCIES)
- @echo Creating list of files to link...
- @: $(call write_entries_to_file,$(libgcj_la_OBJECTS),libgcj.objectlist)
- $(libgcj_la_LINK) -objectlist libgcj.objectlist \
- $(libgcj_la_LIBADD) \
+libgcj.la: $(libgcj_la_DEPENDENCIES)
+ $(libgcj_la_LINK) $(libgcj_la_LIBADD) \
-rpath $(toolexeclibdir) $(libgcj_la_LDFLAGS) $(LIBS)
lib-gnu-awt-xlib.la: $(lib_gnu_awt_xlib_la_OBJECTS) $(lib_gnu_awt_xlib_la_DEPENDENCIES)
@@ -700,7 +728,7 @@ gnu-java-beans.lo: $(gnu_java_beans_source_files)
## Depend on the sources, even though we are going to compile the
## classes.
-gtk-awt-peer.lo: $(gtk_awt_peer_sources)
+gtk-awt-peer.lo: $(gtk_awt_peer_source_files)
## FIXME: this is ugly. We want to make sure the .class files have
## been built, but we don't want a real dependency on them as this
## would cause our target to be rebuilt whenever any .java file is
OpenPOWER on IntegriCloud