From 6fe5bf0adba030bc2398eea82905639c3152756a Mon Sep 17 00:00:00 2001 From: Dan Shi Date: Thu, 25 Oct 2018 23:21:38 -0700 Subject: [PATCH] Copy shared libraries used by tests to testcases directory This change collects the shared libraries files used by tests in suite, and deploy the files to testcases/lib*. The shared libraries then can be zipped in general-tests.zip and device-tests.zip. And the host test can be run in TradeFed host based on build artifacts. Bug: 111486845 Test: m -j general-tests; m -j device-tests Confirm the test can run in testcases directory: out/host/linux-x86/testcases$ ./net_test_avrcp/x86_64/net_test_avrcp unzip general-tests.zip, confirm net_test_avrcp can run. Change-Id: I4f9322118aa4891226ea318cbd1bcee6ca48b050 --- core/definitions.mk | 7 +++++-- core/main.mk | 36 ++++++++++++++++++++++++++++++++++++ core/tasks/device-tests.mk | 8 ++++++-- core/tasks/general-tests.mk | 18 +++++++++++++++++- 4 files changed, 64 insertions(+), 5 deletions(-) diff --git a/core/definitions.mk b/core/definitions.mk index 362680e382..0e959d6e41 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -3007,14 +3007,17 @@ endef # 1. Copy the files to the many suite output directories. # And for test config files, we'll check the .xml is well-formed before copy. # 2. Add all the files to each suite's dependent files list. -# 3. Do the dependency addition to my_all_targets +# 3. Do the dependency addition to my_all_targets. +# 4. Save the module name to COMPATIBILITY.$(suite).MODULES for each suite. # Requires for each suite: use my_compat_dist_config_$(suite) to define the test config. # and use my_compat_dist_$(suite) to define the others. define create-suite-dependencies $(foreach suite, $(LOCAL_COMPATIBILITY_SUITE), \ $(eval COMPATIBILITY.$(suite).FILES := \ $$(COMPATIBILITY.$(suite).FILES) $$(foreach f,$$(my_compat_dist_$(suite)),$$(call word-colon,2,$$(f))) \ - $$(foreach f,$$(my_compat_dist_config_$(suite)),$$(call word-colon,2,$$(f))))) \ + $$(foreach f,$$(my_compat_dist_config_$(suite)),$$(call word-colon,2,$$(f)))) \ + $(eval COMPATIBILITY.$(suite).MODULES := \ + $$(COMPATIBILITY.$(suite).MODULES) $$(my_register_name))) \ $(eval $(my_all_targets) : $(call copy-many-files, \ $(sort $(foreach suite,$(LOCAL_COMPATIBILITY_SUITE),$(my_compat_dist_$(suite))))) \ $(call copy-many-xml-files-checked, \ diff --git a/core/main.mk b/core/main.mk index 65b74a02d3..fdf14de5ad 100644 --- a/core/main.mk +++ b/core/main.mk @@ -725,11 +725,44 @@ $(foreach m,$($(if $(2),$($(1)2ND_ARCH_VAR_PREFIX))$(1)DEPENDENCIES_ON_SHARED_LI $(eval r := $(filter $($(root))/%,$(call module-installed-files,\ $(deps))))\ $(if $(filter $(1),HOST_),\ + $(eval ALL_MODULES.$(mod).HOST_SHARED_LIBRARY_FILES := $$(ALL_MODULES.$(mod).HOST_SHARED_LIBRARY_FILES) $(word 2,$(p)) $(r))\ + $(eval ALL_MODULES.$(mod).HOST_SHARED_LIBRARIES := $$(ALL_MODULES.$(mod).HOST_SHARED_LIBRARIES) $(deps))\ $(eval $(call add-required-host-so-deps,$(word 2,$(p)),$(r))),\ $(eval $(call add-required-deps,$(word 2,$(p)),$(r))))\ $(eval ALL_MODULES.$(mod).REQUIRED += $(deps))) endef +# Recursively resolve host shared library dependency for a given module. +# $(1): module name +# Returns all dependencies of shared library. +define get-all-shared-libs-deps +$(if $(_all_deps_for_$(1)_set_),$(_all_deps_for_$(1)_),\ + $(eval _all_deps_for_$(1)_ :=) \ + $(foreach dep,$(ALL_MODULES.$(1).HOST_SHARED_LIBRARIES),\ + $(foreach m,$(call get-all-shared-libs-deps,$(dep)),\ + $(eval _all_deps_for_$(1)_ := $$(_all_deps_for_$(1)_) $(m))\ + $(eval _all_deps_for_$(1)_ := $(sort $(_all_deps_for_$(1)_))))\ + $(eval _all_deps_for_$(1)_ := $$(_all_deps_for_$(1)_) $(dep))\ + $(eval _all_deps_for_$(1)_ := $(sort $(_all_deps_for_$(1)_) $(dep)))\ + $(eval _all_deps_for_$(1)_set_ := true))\ +$(_all_deps_for_$(1)_)) +endef + +# Scan all modules in general-tests and device-tests suite and flatten the +# shared library dependencies. +define update-host-shared-libs-deps-for-suites +$(foreach suite,general-tests device-tests,\ + $(foreach m,$(COMPATIBILITY.$(suite).MODULES),\ + $(eval my_deps := $(call get-all-shared-libs-deps,$(m)))\ + $(foreach dep,$(my_deps),\ + $(foreach f,$(ALL_MODULES.$(dep).HOST_SHARED_LIBRARY_FILES),\ + $(eval target := $(HOST_OUT_TESTCASES)/$(lastword $(subst /, ,$(dir $(f))))/$(notdir $(f)))\ + $(eval COMPATIBILITY.$(suite).HOST_SHARED_LIBRARY.FILES := \ + $$(COMPATIBILITY.$(suite).HOST_SHARED_LIBRARY.FILES) $(f):$(target))\ + $(eval COMPATIBILITY.$(suite).HOST_SHARED_LIBRARY.FILES := \ + $(sort $(COMPATIBILITY.$(suite).HOST_SHARED_LIBRARY.FILES))))))) +endef + $(call resolve-shared-libs-depes,TARGET_) ifdef TARGET_2ND_ARCH $(call resolve-shared-libs-depes,TARGET_,true) @@ -738,6 +771,9 @@ $(call resolve-shared-libs-depes,HOST_) ifdef HOST_2ND_ARCH $(call resolve-shared-libs-depes,HOST_,true) endif +# Update host side shared library dependencies for tests in suite device-tests and general-tests. +# This should be called after calling resolve-shared-libs-depes for HOST_2ND_ARCH. +$(call update-host-shared-libs-deps-for-suites) ifdef HOST_CROSS_OS $(call resolve-shared-libs-depes,HOST_CROSS_,,true) endif diff --git a/core/tasks/device-tests.mk b/core/tasks/device-tests.mk index a2b626e96a..0028ce4d4f 100644 --- a/core/tasks/device-tests.mk +++ b/core/tasks/device-tests.mk @@ -18,12 +18,16 @@ device-tests-zip := $(PRODUCT_OUT)/device-tests.zip # Create an artifact to include a list of test config files in device-tests. device-tests-list-zip := $(PRODUCT_OUT)/device-tests_list.zip +my_host_shared_lib_for_device_tests := $(call copy-many-files,$(COMPATIBILITY.device-tests.HOST_SHARED_LIBRARY.FILES)) $(device-tests-zip) : .KATI_IMPLICIT_OUTPUTS := $(device-tests-list-zip) $(device-tests-zip) : PRIVATE_device_tests_list := $(PRODUCT_OUT)/device-tests_list - -$(device-tests-zip) : $(COMPATIBILITY.device-tests.FILES) $(SOONG_ZIP) +$(device-tests-zip) : PRIVATE_HOST_SHARED_LIBS := $(my_host_shared_lib_for_device_tests) +$(device-tests-zip) : $(COMPATIBILITY.device-tests.FILES) $(my_host_shared_lib_for_device_tests) $(SOONG_ZIP) echo $(sort $(COMPATIBILITY.device-tests.FILES)) | tr " " "\n" > $@.list grep $(HOST_OUT_TESTCASES) $@.list > $@-host.list || true + $(hide) for shared_lib in $(PRIVATE_HOST_SHARED_LIBS); do \ + echo $$shared_lib >> $@-host.list; \ + done grep $(TARGET_OUT_TESTCASES) $@.list > $@-target.list || true $(hide) $(SOONG_ZIP) -d -o $@ -P host -C $(HOST_OUT) -l $@-host.list -P target -C $(PRODUCT_OUT) -l $@-target.list rm -f $(PRIVATE_device_tests_list) diff --git a/core/tasks/general-tests.mk b/core/tasks/general-tests.mk index 9619bbe6b7..36ab1016a3 100644 --- a/core/tasks/general-tests.mk +++ b/core/tasks/general-tests.mk @@ -22,17 +22,33 @@ intermediates_dir := $(call intermediates-dir-for,PACKAGING,general-tests) general_tests_zip := $(PRODUCT_OUT)/general-tests.zip # Create an artifact to include a list of test config files in general-tests. general_tests_list_zip := $(PRODUCT_OUT)/general-tests_list.zip + +# Filter shared entries between general-tests and device-tests's HOST_SHARED_LIBRARY.FILES, +# to avoid warning about overriding commands. +my_host_shared_lib_for_general_tests := \ + $(foreach m,$(filter $(COMPATIBILITY.device-tests.HOST_SHARED_LIBRARY.FILES),\ + $(COMPATIBILITY.general-tests.HOST_SHARED_LIBRARY.FILES)),$(call word-colon,2,$(m))) +my_general_tests_shared_lib_files := \ + $(filter-out $(COMPATIBILITY.device-tests.HOST_SHARED_LIBRARY.FILES),\ + $(COMPATIBILITY.general-tests.HOST_SHARED_LIBRARY.FILES)) + +my_host_shared_lib_for_general_tests += $(call copy-many-files,$(my_general_tests_shared_lib_files)) + $(general_tests_zip) : PRIVATE_general_tests_list_zip := $(general_tests_list_zip) $(general_tests_zip) : .KATI_IMPLICIT_OUTPUTS := $(general_tests_list_zip) $(general_tests_zip) : PRIVATE_TOOLS := $(general_tests_tools) $(general_tests_zip) : PRIVATE_INTERMEDIATES_DIR := $(intermediates_dir) -$(general_tests_zip) : $(COMPATIBILITY.general-tests.FILES) $(general_tests_tools) $(SOONG_ZIP) +$(general_tests_zip) : PRIVATE_HOST_SHARED_LIBS := $(my_host_shared_lib_for_general_tests) +$(general_tests_zip) : $(COMPATIBILITY.general-tests.FILES) $(general_tests_tools) $(my_host_shared_lib_for_general_tests) $(SOONG_ZIP) rm -rf $(PRIVATE_INTERMEDIATES_DIR) rm -f $@ $(PRIVATE_general_tests_list_zip) mkdir -p $(PRIVATE_INTERMEDIATES_DIR) $(PRIVATE_INTERMEDIATES_DIR)/tools echo $(sort $(COMPATIBILITY.general-tests.FILES)) | tr " " "\n" > $(PRIVATE_INTERMEDIATES_DIR)/list grep $(HOST_OUT_TESTCASES) $(PRIVATE_INTERMEDIATES_DIR)/list > $(PRIVATE_INTERMEDIATES_DIR)/host.list || true grep $(TARGET_OUT_TESTCASES) $(PRIVATE_INTERMEDIATES_DIR)/list > $(PRIVATE_INTERMEDIATES_DIR)/target.list || true + $(hide) for shared_lib in $(PRIVATE_HOST_SHARED_LIBS); do \ + echo $$shared_lib >> $(PRIVATE_INTERMEDIATES_DIR)/host.list; \ + done cp -fp $(PRIVATE_TOOLS) $(PRIVATE_INTERMEDIATES_DIR)/tools/ $(SOONG_ZIP) -d -o $@ \ -P host -C $(PRIVATE_INTERMEDIATES_DIR) -D $(PRIVATE_INTERMEDIATES_DIR)/tools \