| # |
| # Copyright (c) 2015-2017 Nest Labs, Inc. |
| # All rights reserved. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| |
| # |
| # Description: |
| # This file contains make rules for compiling Java code and building jars. |
| # |
| |
| # |
| # Java Rules Usage |
| # ================ |
| # |
| # Projects wishing to build Java code should include this file at the *end* |
| # of their Makefile.am files. Additionally, projects must declare a set of |
| # automake local dependencies to cause Java code to be compile for standard |
| # targets. E.g.: |
| # |
| # include $(abs_top_srcdir)/build/make/java.mk |
| # |
| # all-local: all-JARS |
| # install-data-local: install-data-JARS |
| # uninstall-local: uninstall-JARS |
| # mostlyclean-local: mostlyclean-local-JARS |
| # |
| # Jars to be built must be declared in the JARS variable *before* java.mk is |
| # included, e.g.: |
| # |
| # JARS = \ |
| # WeaveDeviceManager.jar \ |
| # $(NULL) |
| # |
| # The building of individual jars is controlled by variables that begin |
| # with the name of the jar file. E.g. WeaveDeviceManager_jar_JFLAGS. These |
| # variable are: |
| # |
| # <name>_JAVA_SRCS -- The list of java source files to be compile and |
| # included in the jar. The file paths are relative to the "src" |
| # subdirectory, which by default is located in the same directory as the |
| # Makefile.am. E.g.: |
| # |
| # WeaveDeviceManager_jar_JAVA_SRCS = \ |
| # nl/Weave/DeviceManager/WeaveDeviceManager.java \ |
| # nl/Weave/DeviceManager/WeaveDeviceException.java \ |
| # nl/Weave/DeviceManager/DeviceFeatures.java \ |
| # $(NULL) |
| # |
| # <name>_JFLAGS -- Flags to be passed to the Java compiler. |
| # |
| # <name>_JAVA_MAIN_CLASS -- Specifies the application entry point class |
| # for the jar. Must be a fully qualified class name. |
| # |
| # <name>_JAVA_CLASSPATHS -- Additional class paths and/or jars to be passed |
| # to the Java compiler. Multiple entries must be separated by colons. |
| # |
| # <name>_JAVA_EXTRA_SRC_DIRS -- Additional directories containing Java source |
| # files that are used to satisfy references during compilation, but are |
| # not included in the compile output. Multiple entries must be separated |
| # by colons. |
| # |
| # <name>_JAVA_NATIVE_LIB -- The name of a native library to be included in a |
| # platform-specific native subdirectory with the jar file. The name given |
| # must be both a make target, on which the jar will depend, and the name |
| # of a shared-library file located in the .libs subdirectory of the module's |
| # build directory. This should typically be the name of a libtool .la file |
| # which is built by other rules in the module's Makefile.am. |
| # |
| # <name>_JAVA_STRIP_NATIVE_LIB -- Set to "true" to cause the native library to |
| # be stripped before being included in the jar file. |
| # |
| # <name>_JAVA_SRC_DIR -- The directory containing the Java source files. |
| # Defaults to the global value $(JAVA_SRC_DIR), which in turn defaults to |
| # the module's "src" directory, i.e. $(srcdir)/src. |
| # |
| # <name>_JAVA_BIN_DIR -- The directory into which the compile Java class files. |
| # should be placed. Defaults to the global value $(JAVA_BIN_DIR), which in |
| # turn defaults to the "bin" subdirectory in the module's build directory, |
| # i.e. $(builddir)/bin. |
| # |
| # <name>_JAVA_INSTALL_DIR -- The directory into which the generated jar file is |
| # installed. Defaults to the global value $(JAVA_INSTALL_DIR), which in turn |
| # defaults to $(datadir)/java. |
| # |
| # <name>_MAVEN_PROJECT_FILE -- The name of a Maven project file (pom) to be |
| # included in the jar file. The pom file will be scanned for groupId and |
| # artifactId fields, which will be used to form the path of the pom file |
| # within the jar file; i.e. META-INF/maven/<groupId>/<artifactId>/pom.xml. |
| # |
| |
| AM_V_JAR = $(am__v_JAR_$(V)) |
| am__v_JAR_ = $(am__v_JAR_$(AM_DEFAULT_VERBOSITY)) |
| am__v_JAR_0 = @echo " JAR " $@; |
| am__v_JAR_1 = |
| |
| AM_V_JAVAC = $(am__v_JAVAC_$(V)) |
| am__v_JAVAC_ = $(am__v_JAVAC_$(AM_DEFAULT_VERBOSITY)) |
| am__v_JAVAC_0 = @echo " JAVAC "; |
| am__v_JAVAC_1 = |
| |
| JAVA_SRC_DIR ?= $(srcdir)/src |
| |
| JAVA_BIN_DIR ?= $(builddir)/bin |
| |
| JAVA_INSTALL_DIR ?= $(datadir)/java |
| |
| JAVA_NATIVE_LIB_HOST_OS = $(shell echo $(host_os) | sed -n -e 's/linux-gnu/linux/; s/darwin[0-9.]*/darwin/; p' ) |
| |
| JAVA_NATIVE_LIB_HOST_CPU = $(host_cpu) |
| |
| JAVA_NATIVE_BIN_DIR ?= $(builddir)/bin/native/$(JAVA_NATIVE_LIB_HOST_OS)/$(JAVA_NATIVE_LIB_HOST_CPU) |
| |
| HOST_SHARED_LIB_EXT = $(shell $(LIBTOOL) --config | sed -n -e '/^shrext_cmds=/ { s/^shrext_cmds=/echo /; s/"//g; s/\\`/`/g; p; }' | sh ) |
| |
| JAVA_STRIP_NATIVE_LIB = false |
| |
| ifeq ($(JAVA_NATIVE_LIB_HOST_OS),darwin) |
| else |
| endif |
| |
| define JarRules |
| # Arguments: |
| # $(1): jar variable prefix |
| # $(2): jar file name |
| |
| $(1)_JAVA_SRC_DIR ?= $(JAVA_SRC_DIR) |
| $(1)_JAVA_BIN_DIR ?= $(JAVA_BIN_DIR) |
| $(1)_JAVA_INSTALL_DIR ?= $(JAVA_INSTALL_DIR) |
| $(1)_JAVA_NATIVE_BIN_DIR ?= $(JAVA_NATIVE_BIN_DIR) |
| |
| ifeq ($(JAVA_NATIVE_LIB_HOST_OS),darwin) |
| $(1)_JAVA_STRIP_NATIVE_LIB = false |
| else |
| $(1)_JAVA_STRIP_NATIVE_LIB ?= $(JAVA_STRIP_NATIVE_LIB) |
| endif |
| |
| $(1)_JAVA_ABS_SRCS ?= $$(addprefix $$($(1)_JAVA_SRC_DIR)/,$$($(1)_JAVA_SRCS)) |
| |
| ifdef $(1)_MAVEN_PROJECT_FILE |
| $(1)_ABS_MAVEN_PROJECT_FILE := $$(addprefix $(srcdir)/,$$($(1)_MAVEN_PROJECT_FILE)) |
| $(1)_MAVEN_GROUP_ID ?= $$(shell sed -n -e '/<groupId>/ { s@.*<groupId>\(.*\)</groupId>.*@\1@; p; }' $$($(1)_ABS_MAVEN_PROJECT_FILE) ) |
| $(1)_MAVEN_ARTIFACT_ID ?= $$(shell sed -n -e '/<artifactId>/ { s@.*<artifactId>\(.*\)</artifactId>.*@\1@; p; }' $$($(1)_ABS_MAVEN_PROJECT_FILE) ) |
| endif |
| |
| # Compile Java source files |
| $(2).classes.stamp: $$($(1)_JAVA_ABS_SRCS) | $$($(1)_JAVA_BIN_DIR) |
| $$(AM_V_JAVAC)$$(JAVAC) $$(JFLAGS) $$($(1)_JFLAGS) -d $$($(1)_JAVA_BIN_DIR) -cp :$$($(1)_JAVA_CLASSPATHS) -sourcepath $$($(1)_JAVA_SRC_DIR):$$($(1)_JAVA_EXTRA_SRC_DIRS) $$($(1)_JAVA_ABS_SRCS) |
| $$(AM_V_at)touch $$(@) |
| |
| # Create jar |
| $(2): $(2).classes.stamp $$($(1)_JAVA_NATIVE_LIB) | $$(if $$($(1)_JAVA_NATIVE_LIB),$$($(1)_JAVA_NATIVE_BIN_DIR)) |
| ifdef $(1)_JAVA_NATIVE_LIB |
| cp .libs/$$(patsubst %.la,%$$(HOST_SHARED_LIB_EXT),$$($(1)_JAVA_NATIVE_LIB)) $$($(1)_JAVA_NATIVE_BIN_DIR) |
| if $$($(1)_JAVA_STRIP_NATIVE_LIB); then $(STRIP) $$($(1)_JAVA_NATIVE_BIN_DIR)/$$(patsubst %.la,%$$(HOST_SHARED_LIB_EXT),$$($(1)_JAVA_NATIVE_LIB)); fi |
| endif |
| ifdef $(1)_MAVEN_PROJECT_FILE |
| mkdir -p $$($(1)_JAVA_BIN_DIR)/META-INF/maven/$$($(1)_MAVEN_GROUP_ID)/$$($(1)_MAVEN_ARTIFACT_ID) |
| cp $$($(1)_ABS_MAVEN_PROJECT_FILE) $$($(1)_JAVA_BIN_DIR)/META-INF/maven/$$($(1)_MAVEN_GROUP_ID)/$$($(1)_MAVEN_ARTIFACT_ID)/pom.xml |
| endif |
| $$(AM_V_JAR)$$(JAR) c$$(if $$($(1)_JAVA_MAIN_CLASS),e)f $$($(1)_JAVA_MAIN_CLASS) $$(@) -C $$($(1)_JAVA_BIN_DIR) . |
| |
| # Create bin directory |
| $$($(1)_JAVA_BIN_DIR): |
| $$(create-directory) |
| |
| # Create native bin directory |
| $$($(1)_JAVA_NATIVE_BIN_DIR): |
| $$(create-directory) |
| |
| # Create install directory |
| $$(DESTDIR)$$($(1)_JAVA_INSTALL_DIR): |
| $$(create-directory) |
| |
| .PHONY: all-JARS install-data-JARS install-data-$(1) \ |
| uinstall-data-JARS uninstall-data-$(1) \ |
| mostlyclean-local-JARS mostlyclean-local-$(1) |
| |
| # Install jar |
| install-data-$(1): $(2) | $$(DESTDIR)$$($(1)_JAVA_INSTALL_DIR) |
| @$$(NORMAL_INSTALL) |
| echo " INSTALL $(2)"; \ |
| $$(INSTALL_DATA) "$(2)" "$$(DESTDIR)$$($(1)_JAVA_INSTALL_DIR)/$(2)"; \ |
| |
| # Uninstall jar |
| uninstall-data-$(1): |
| @$$(NORMAL_UNINSTALL) |
| rm -f "$$(DESTDIR)$$($(1)_JAVA_INSTALL_DIR)/$(2)"; \ |
| |
| # Clean |
| mostlyclean-local-$(1): |
| -$$(AM_V_at)rm -rf $$($(1)_JAVA_BIN_DIR) $(2) $(2).classes.stamp |
| |
| all-JARS: $(2) |
| |
| install-data-JARS: install-data-$(1) |
| |
| uninstall-JARS: uninstall-data-$(1) |
| |
| mostlyclean-local-JARS: mostlyclean-local-$(1) |
| |
| endef # JarRules |
| |
| # Instantiate jar build rules for each declared jar. |
| $(foreach jar,$(JARS),$(eval $(call JarRules,$(basename $(jar))_jar,$(jar)))) |
| |