diff --git a/core/base_rules.mk b/core/base_rules.mk index 38f04f1f9..0294cf208 100644 --- a/core/base_rules.mk +++ b/core/base_rules.mk @@ -87,6 +87,7 @@ endif # file, tag the module as "gnu". Search for "*_GPL*", "*_LGPL*" and "*_MPL*" # so that we can also find files like MODULE_LICENSE_GPL_AND_AFL # +license_files := $(call find-parent-file,$(LOCAL_PATH),MODULE_LICENSE*) gpl_license_file := $(call find-parent-file,$(LOCAL_PATH),MODULE_LICENSE*_GPL* MODULE_LICENSE*_MPL* MODULE_LICENSE*_LGPL*) ifneq ($(gpl_license_file),) my_module_tags += gnu @@ -643,6 +644,21 @@ endif INSTALLABLE_FILES.$(LOCAL_INSTALLED_MODULE).MODULE := $(my_register_name) +########################################################## +# Track module-level dependencies. +# Use $(LOCAL_MODULE) instead of $(my_register_name) to ignore module's bitness. +ALL_DEPS.MODULES := $(sort $(ALL_DEPS.MODULES) $(LOCAL_MODULE)) +ALL_DEPS.$(LOCAL_MODULE).ALL_DEPS := $(sort \ + $(ALL_MODULES.$(LOCAL_MODULE).ALL_DEPS) \ + $(LOCAL_STATIC_LIBRARIES) \ + $(LOCAL_WHOLE_STATIC_LIBRARIES) \ + $(LOCAL_SHARED_LIBRARIES) \ + $(LOCAL_STATIC_JAVA_LIBRARIES) \ + $(LOCAL_JAVA_LIBRARIES)\ + $(LOCAL_JNI_SHARED_LIBRARIES)) + +ALL_DEPS.$(LOCAL_MODULE).LICENSE := $(sort $(ALL_DEPS.$(LOCAL_MODULE).LICENSE) $(license_files)) + ########################################################### ## Take care of my_module_tags ########################################################### diff --git a/core/tasks/deps_licenses.mk b/core/tasks/deps_licenses.mk new file mode 100644 index 000000000..bb20fa042 --- /dev/null +++ b/core/tasks/deps_licenses.mk @@ -0,0 +1,59 @@ +# +# Copyright (C) 2015 The Android Open Source Project +# +# 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. +# + +# Print modules and their transitive dependencies with license files. +# To invoke, run "make deps-license PROJ_PATH= DEP_PATH=". +# PROJ_PATH restricts the paths of the source modules; DEP_PATH restricts the paths of the dependency modules. +# Both can be makefile patterns supported by makefile function $(filter). +# Example: "make deps-license packages/app/% external/%" prints all modules in packages/app/ with their dpendencies in external/. +# The printout lines look like " :: :: ". + +ifneq (,$(filter deps-license,$(MAKECMDGOALS))) +ifndef PROJ_PATH +$(error To "make deps-license" you must specify PROJ_PATH and DEP_PATH.) +endif +ifndef DEP_PATH +$(error To "make deps-license" you must specify PROJ_PATH and DEP_PATH.) +endif + +# Expand a module's dependencies transitively. +# $(1): the variable name to hold the result. +# $(2): the initial module name. +define get-module-all-dependencies +$(eval _gmad_new := $(sort $(filter-out $($(1)),\ + $(foreach m,$(2),$(ALL_DEPS.$(m).ALL_DEPS)))))\ +$(if $(_gmad_new),$(eval $(1) += $(_gmad_new))\ + $(call get-module-all-dependencies,$(1),$(_gmad_new))) +endef + +define print-deps-license +$(foreach m, $(ALL_DEPS.MODULES),\ + $(eval m_p := $(sort $(ALL_MODULES.$(m).PATH) $(ALL_MODULES.$(m)$(TARGET_2ND_ARCH_MODULE_SUFFIX).PATH)))\ + $(if $(filter $(PROJ_PATH),$(m_p)),\ + $(eval deps :=)\ + $(eval $(call get-module-all-dependencies,deps,$(m)))\ + $(info $(m) :: $(m_p) :: $(ALL_DEPS.$(m).LICENSE))\ + $(foreach d,$(deps),\ + $(eval d_p := $(sort $(ALL_MODULES.$(d).PATH) $(ALL_MODULES.$(d)$(TARGET_2ND_ARCH_MODULE_SUFFIX).PATH)))\ + $(if $(filter $(DEP_PATH),$(d_p)),\ + $(info $(space)$(space)$(space)$(space)$(d) :: $(d_p) :: $(ALL_DEPS.$(d).LICENSE)))))) +endef + +.PHONY: deps-license +deps-license: + @$(call print-deps-license) + +endif