Remove [jni_]link_type files

Now that mm/ONE_SHOT_MAKEFILE have been removed, we can expect to know
about all of our dependencies at the end of the build.

This removes 19k nodes from our build graph (aosp-master
aosp_arm64-eng), though in a default build, only 3k of those are used.

Test: ALLOW_MISSING_DEPENDENCIES=true, then trigger a missing dependency
Test: treehugger
Test: create link_type files, then apply CleanSpec.mk, ensure they're removed
Change-Id: I9506331e4a9911d2f26e59a2f72a97aef1644073
This commit is contained in:
Dan Willemsen 2019-07-30 12:56:59 -07:00
parent 5c3fc2a792
commit 0df0f6bbf1
4 changed files with 3 additions and 120 deletions

View file

@ -643,6 +643,9 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/odm/build.prop)
$(call add-clean-step, rm -rf $(OUT_DIR)/target/product/generic*/*/product)
$(call add-clean-step, rm -rf $(OUT_DIR)/target/product/generic*/*/system_ext)
# link_type and jni_link_type files are no longer needed
$(call add-clean-step, find $(OUT_DIR) -type f -name "*link_type" -print0 | xargs -0 rm -f)
# ************************************************
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
# ************************************************

View file

@ -604,7 +604,6 @@ TUNE2FS := $(HOST_OUT_EXECUTABLES)/tune2fs$(HOST_EXECUTABLE_SUFFIX)
JARJAR := $(HOST_OUT_JAVA_LIBRARIES)/jarjar.jar
DATA_BINDING_COMPILER := $(HOST_OUT_JAVA_LIBRARIES)/databinding-compiler.jar
FAT16COPY := build/make/tools/fat16copy.py
CHECK_LINK_TYPE := build/make/tools/check_link_type.py
CHECK_ELF_FILE := build/make/tools/check_elf_file.py
LPMAKE := $(HOST_OUT_EXECUTABLES)/lpmake$(HOST_EXECUTABLE_SUFFIX)
BUILD_IMAGE := $(HOST_OUT_EXECUTABLES)/build_image$(HOST_EXECUTABLE_SUFFIX)

View file

@ -970,45 +970,6 @@ ifdef link_type_error
$(error exiting from previous errors)
endif
# The intermediate filename for link type rules
#
# APPS are special -- they have up to three different rules:
# 1. The COMMON rule for Java libraries
# 2. The jni_link_type rule for embedded native code
# 3. The 2ND_jni_link_type for the second architecture native code
define link-type-file
$(eval _ltf_aux_variant:=$(link-type-aux-variant))\
$(if $(_ltf_aux_variant),$(call aux-variant-load-env,$(_ltf_aux_variant)))\
$(call intermediates-dir-for,$(link-type-class),$(link-type-name),$(filter AUX HOST HOST_CROSS,$(link-type-prefix)),$(link-type-common),$(link-type-2ndarchprefix),$(filter HOST_CROSS,$(link-type-prefix)))/$(if $(filter APPS,$(link-type-class)),$(if $(link-type-common),,$(link-type-2ndarchprefix)jni_))link_type\
$(if $(_ltf_aux_variant),$(call aux-variant-load-env,none))\
$(eval _ltf_aux_variant:=)
endef
# Write out the file-based link_type rules for the ALLOW_MISSING_DEPENDENCIES
# case. We always need to write the file for mm to work, but only need to
# check it if we weren't able to check it when reading the Android.mk files.
define link-type-file-rule
my_link_type_deps := $(foreach l,$($(1).DEPS),$(call link-type-file,$(l)))
my_link_type_file := $(call link-type-file,$(1))
$($(1).BUILT): | $$(my_link_type_file)
$$(my_link_type_file): PRIVATE_DEPS := $$(my_link_type_deps)
ifeq ($($(1).MISSING),true)
$$(my_link_type_file): $(CHECK_LINK_TYPE)
endif
$$(my_link_type_file): $$(my_link_type_deps)
@echo Check module type: $$@
$$(hide) mkdir -p $$(dir $$@) && rm -f $$@
ifeq ($($(1).MISSING),true)
$$(hide) $(CHECK_LINK_TYPE) --makefile $($(1).MAKEFILE) --module $(link-type-name) \
--type "$($(1).TYPE)" $(addprefix --allowed ,$($(1).ALLOWED)) \
$(addprefix --warn ,$($(1).WARN)) $$(PRIVATE_DEPS)
endif
$$(hide) echo "$($(1).TYPE)" >$$@
endef
$(foreach lt,$(ALL_LINK_TYPES),\
$(eval $(call link-type-file-rule,$(lt))))
# -------------------------------------------------------------------
# Figure out our module sets.
#

View file

@ -1,80 +0,0 @@
#!/usr/bin/env python
#
# Copyright (C) 2016 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.
"""Utility to verify modules link against acceptable module types"""
from __future__ import print_function
import argparse
import os
import sys
WARNING_MSG = ('\033[1m%(makefile)s: \033[35mwarning:\033[0m\033[1m '
'%(module)s (%(type)s) should not link to %(dep_name)s (%(dep_type)s)'
'\033[0m')
ERROR_MSG = ('\033[1m%(makefile)s: \033[31merror:\033[0m\033[1m '
'%(module)s (%(type)s) should not link to %(dep_name)s (%(dep_type)s)'
'\033[0m')
def parse_args():
"""Parse commandline arguments."""
parser = argparse.ArgumentParser(description='Check link types')
parser.add_argument('--makefile', help='Makefile defining module')
parser.add_argument('--module', help='The module being checked')
parser.add_argument('--type', help='The link type of module')
parser.add_argument('--allowed', help='Allow deps to use these types',
action='append', default=[], metavar='TYPE')
parser.add_argument('--warn', help='Warn if deps use these types',
action='append', default=[], metavar='TYPE')
parser.add_argument('deps', help='The dependencies to check',
metavar='DEP', nargs='*')
return parser.parse_args()
def print_msg(msg, args, dep_name, dep_type):
"""Print a warning or error message"""
print(msg % {
"makefile": args.makefile,
"module": args.module,
"type": args.type,
"dep_name": dep_name,
"dep_type": dep_type}, file=sys.stderr)
def main():
"""Program entry point."""
args = parse_args()
failed = False
for dep in args.deps:
dep_name = os.path.basename(os.path.dirname(dep))
if dep_name.endswith('_intermediates'):
dep_name = dep_name[:len(dep_name)-len('_intermediates')]
with open(dep, 'r') as dep_file:
dep_types = dep_file.read().strip().split(' ')
for dep_type in dep_types:
if dep_type in args.allowed:
continue
if dep_type in args.warn:
print_msg(WARNING_MSG, args, dep_name, dep_type)
else:
print_msg(ERROR_MSG, args, dep_name, dep_type)
failed = True
if failed:
sys.exit(1)
if __name__ == '__main__':
main()