2020-04-28 15:57:42 +02:00
/ *
* Copyright ( C ) 2020 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 .
* /
package apex
import (
2020-05-14 16:15:01 +02:00
"github.com/google/blueprint"
2020-06-24 12:17:19 +02:00
"android/soong/android"
2020-04-28 15:57:42 +02:00
)
func init ( ) {
2023-04-25 09:39:59 +02:00
registerApexDepsInfoComponents ( android . InitRegistrationContext )
}
func registerApexDepsInfoComponents ( ctx android . RegistrationContext ) {
2023-05-16 02:58:37 +02:00
ctx . RegisterParallelSingletonType ( "apex_depsinfo_singleton" , apexDepsInfoSingletonFactory )
2020-04-28 15:57:42 +02:00
}
type apexDepsInfoSingleton struct {
2020-07-02 13:51:47 +02:00
allowedApexDepsInfoCheckResult android . OutputPath
2020-04-28 15:57:42 +02:00
}
func apexDepsInfoSingletonFactory ( ) android . Singleton {
return & apexDepsInfoSingleton { }
}
2020-07-02 13:51:47 +02:00
var (
// Generate new apex allowed_deps.txt by merging all internal dependencies.
generateApexDepsInfoFilesRule = pctx . AndroidStaticRule ( "generateApexDepsInfoFilesRule" , blueprint . RuleParams {
Command : "cat $out.rsp | xargs cat" +
// Only track non-external dependencies, i.e. those that end up in the binary
" | grep -v '(external)'" +
// Ignore comments in any of the files
" | grep -v '^#'" +
" | sort -u -f >$out" ,
2020-04-28 15:57:42 +02:00
Rspfile : "$out.rsp" ,
RspfileContent : "$in" ,
2020-07-02 13:51:47 +02:00
} )
// Diff two given lists while ignoring comments in the allowed deps file.
diffAllowedApexDepsInfoRule = pctx . AndroidStaticRule ( "diffAllowedApexDepsInfoRule" , blueprint . RuleParams {
Description : "Diff ${allowed_deps} and ${new_allowed_deps}" ,
Command : `
if grep - v ' ^ # ' $ { allowed_deps } | diff - B - $ { new_allowed_deps } ; then
touch $ { out } ;
else
echo - e "\n******************************" ;
2023-02-07 18:08:35 +01:00
echo "ERROR: go/apex-allowed-deps-error contains more information" ;
2020-07-02 13:51:47 +02:00
echo "******************************" ;
echo "Detected changes to allowed dependencies in updatable modules." ;
2021-03-11 17:45:04 +01:00
echo "To fix and update packages/modules/common/build/allowed_deps.txt, please run:" ;
2021-08-02 17:43:05 +02:00
echo - e "$$ (croot && packages/modules/common/build/update-apex-allowed-deps.sh)\n" ;
echo "When submitting the generated CL, you must include the following information" ;
echo "in the commit message if you are adding a new dependency:" ;
2023-02-07 18:08:35 +01:00
echo "Apex-Size-Increase: Expected binary size increase for affected APEXes (or the size of the .jar / .so file of the new library)" ;
echo "Previous-Platform-Support: Are the maintainers of the new dependency committed to supporting previous platform releases?" ;
echo "Aosp-First: Is the new dependency being developed AOSP-first or internal?" ;
echo "Test-Info: What’ s the testing strategy for the new dependency? Does it have its own tests, and are you adding integration tests? How/when are the tests run?" ;
2021-08-02 17:43:05 +02:00
echo "You do not need OWNERS approval to submit the change, but mainline-modularization@" ;
echo "will periodically review additions and may require changes." ;
2020-07-02 13:51:47 +02:00
echo - e "******************************\n" ;
exit 1 ;
fi ;
` ,
} , "allowed_deps" , "new_allowed_deps" )
2020-04-28 15:57:42 +02:00
)
func ( s * apexDepsInfoSingleton ) GenerateBuildActions ( ctx android . SingletonContext ) {
2020-06-24 12:17:19 +02:00
updatableFlatLists := android . Paths { }
2020-04-28 15:57:42 +02:00
ctx . VisitAllModules ( func ( module android . Module ) {
if binaryInfo , ok := module . ( android . ApexBundleDepsInfoIntf ) ; ok {
2020-09-16 03:30:11 +02:00
apexInfo := ctx . ModuleProvider ( module , android . ApexInfoProvider ) . ( android . ApexInfo )
if path := binaryInfo . FlatListPath ( ) ; path != nil {
if binaryInfo . Updatable ( ) || apexInfo . Updatable {
updatableFlatLists = append ( updatableFlatLists , path )
}
2020-04-28 15:57:42 +02:00
}
}
} )
2021-03-18 12:04:09 +01:00
allowedDepsSource := android . ExistentPathForSource ( ctx , "packages/modules/common/build/allowed_deps.txt" )
2020-07-02 13:51:47 +02:00
newAllowedDeps := android . PathForOutput ( ctx , "apex" , "depsinfo" , "new-allowed-deps.txt" )
s . allowedApexDepsInfoCheckResult = android . PathForOutput ( ctx , newAllowedDeps . Rel ( ) + ".check" )
2021-03-18 12:04:09 +01:00
if ! allowedDepsSource . Valid ( ) {
// Unbundled projects may not have packages/modules/common/ checked out; ignore those.
ctx . Build ( pctx , android . BuildParams {
Rule : android . Touch ,
Output : s . allowedApexDepsInfoCheckResult ,
} )
} else {
allowedDeps := allowedDepsSource . Path ( )
ctx . Build ( pctx , android . BuildParams {
Rule : generateApexDepsInfoFilesRule ,
Inputs : append ( updatableFlatLists , allowedDeps ) ,
Output : newAllowedDeps ,
} )
ctx . Build ( pctx , android . BuildParams {
Rule : diffAllowedApexDepsInfoRule ,
Input : newAllowedDeps ,
Output : s . allowedApexDepsInfoCheckResult ,
Args : map [ string ] string {
"allowed_deps" : allowedDeps . String ( ) ,
"new_allowed_deps" : newAllowedDeps . String ( ) ,
} ,
} )
}
2020-07-30 19:26:28 +02:00
ctx . Phony ( "apex-allowed-deps-check" , s . allowedApexDepsInfoCheckResult )
2020-04-28 15:57:42 +02:00
}
2020-07-02 13:51:47 +02:00
func ( s * apexDepsInfoSingleton ) MakeVars ( ctx android . MakeVarsContext ) {
// Export check result to Make. The path is added to droidcore.
ctx . Strict ( "APEX_ALLOWED_DEPS_CHECK" , s . allowedApexDepsInfoCheckResult . String ( ) )
}