1*333d2b36SAndroid Build Coastguard Worker// Copyright 2023 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage aconfig 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 19*333d2b36SAndroid Build Coastguard Worker 20*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 21*333d2b36SAndroid Build Coastguard Worker) 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Workervar ( 24*333d2b36SAndroid Build Coastguard Worker pctx = android.NewPackageContext("android/soong/aconfig") 25*333d2b36SAndroid Build Coastguard Worker 26*333d2b36SAndroid Build Coastguard Worker // For aconfig_declarations: Generate cache file 27*333d2b36SAndroid Build Coastguard Worker aconfigRule = pctx.AndroidStaticRule("aconfig", 28*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 29*333d2b36SAndroid Build Coastguard Worker Command: `${aconfig} create-cache` + 30*333d2b36SAndroid Build Coastguard Worker ` --package ${package}` + 31*333d2b36SAndroid Build Coastguard Worker ` ${container}` + 32*333d2b36SAndroid Build Coastguard Worker ` ${declarations}` + 33*333d2b36SAndroid Build Coastguard Worker ` ${values}` + 34*333d2b36SAndroid Build Coastguard Worker ` ${default-permission}` + 35*333d2b36SAndroid Build Coastguard Worker ` ${allow-read-write}` + 36*333d2b36SAndroid Build Coastguard Worker ` --cache ${out}.tmp` + 37*333d2b36SAndroid Build Coastguard Worker ` && ( if cmp -s ${out}.tmp ${out} ; then rm ${out}.tmp ; else mv ${out}.tmp ${out} ; fi )`, 38*333d2b36SAndroid Build Coastguard Worker // ` --build-id ${release_version}` + 39*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{ 40*333d2b36SAndroid Build Coastguard Worker "${aconfig}", 41*333d2b36SAndroid Build Coastguard Worker }, 42*333d2b36SAndroid Build Coastguard Worker Restat: true, 43*333d2b36SAndroid Build Coastguard Worker }, "release_version", "package", "container", "declarations", "values", "default-permission", "allow-read-write") 44*333d2b36SAndroid Build Coastguard Worker 45*333d2b36SAndroid Build Coastguard Worker // For create-device-config-sysprops: Generate aconfig flag value map text file 46*333d2b36SAndroid Build Coastguard Worker aconfigTextRule = pctx.AndroidStaticRule("aconfig_text", 47*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 48*333d2b36SAndroid Build Coastguard Worker Command: `${aconfig} dump-cache --dedup --format='{fully_qualified_name}:{permission}={state:bool}'` + 49*333d2b36SAndroid Build Coastguard Worker ` --cache ${in}` + 50*333d2b36SAndroid Build Coastguard Worker ` --out ${out}.tmp` + 51*333d2b36SAndroid Build Coastguard Worker ` && ( if cmp -s ${out}.tmp ${out} ; then rm ${out}.tmp ; else mv ${out}.tmp ${out} ; fi )`, 52*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{ 53*333d2b36SAndroid Build Coastguard Worker "${aconfig}", 54*333d2b36SAndroid Build Coastguard Worker }, 55*333d2b36SAndroid Build Coastguard Worker Restat: true, 56*333d2b36SAndroid Build Coastguard Worker }) 57*333d2b36SAndroid Build Coastguard Worker 58*333d2b36SAndroid Build Coastguard Worker // For all_aconfig_declarations: Combine all parsed_flags proto files 59*333d2b36SAndroid Build Coastguard Worker AllDeclarationsRule = pctx.AndroidStaticRule("All_aconfig_declarations_dump", 60*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 61*333d2b36SAndroid Build Coastguard Worker Command: `${aconfig} dump-cache --dedup --format protobuf --out ${out} ${cache_files}`, 62*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{ 63*333d2b36SAndroid Build Coastguard Worker "${aconfig}", 64*333d2b36SAndroid Build Coastguard Worker }, 65*333d2b36SAndroid Build Coastguard Worker }, "cache_files") 66*333d2b36SAndroid Build Coastguard Worker AllDeclarationsRuleTextProto = pctx.AndroidStaticRule("All_aconfig_declarations_dump_textproto", 67*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 68*333d2b36SAndroid Build Coastguard Worker Command: `${aconfig} dump-cache --dedup --format textproto --out ${out} ${cache_files}`, 69*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{ 70*333d2b36SAndroid Build Coastguard Worker "${aconfig}", 71*333d2b36SAndroid Build Coastguard Worker }, 72*333d2b36SAndroid Build Coastguard Worker }, "cache_files") 73*333d2b36SAndroid Build Coastguard Worker 74*333d2b36SAndroid Build Coastguard Worker CreateStorageRule = pctx.AndroidStaticRule("aconfig_create_storage", 75*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 76*333d2b36SAndroid Build Coastguard Worker Command: `${aconfig} create-storage --container ${container} --file ${file_type} --out ${out} ${cache_files}`, 77*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{ 78*333d2b36SAndroid Build Coastguard Worker "${aconfig}", 79*333d2b36SAndroid Build Coastguard Worker }, 80*333d2b36SAndroid Build Coastguard Worker }, "container", "file_type", "cache_files") 81*333d2b36SAndroid Build Coastguard Worker 82*333d2b36SAndroid Build Coastguard Worker // For exported_java_aconfig_library: Generate a JAR from all 83*333d2b36SAndroid Build Coastguard Worker // java_aconfig_libraries to be consumed by apps built outside the 84*333d2b36SAndroid Build Coastguard Worker // platform 85*333d2b36SAndroid Build Coastguard Worker exportedJavaRule = pctx.AndroidStaticRule("exported_java_aconfig_library", 86*333d2b36SAndroid Build Coastguard Worker // For each aconfig cache file, if the cache contains any 87*333d2b36SAndroid Build Coastguard Worker // exported flags, generate Java flag lookup code for the 88*333d2b36SAndroid Build Coastguard Worker // exported flags (only). Finally collect all generated code 89*333d2b36SAndroid Build Coastguard Worker // into the ${out} JAR file. 90*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 91*333d2b36SAndroid Build Coastguard Worker Command: `rm -rf ${out}.tmp` + 92*333d2b36SAndroid Build Coastguard Worker `&& for cache in ${cache_files}; do ` + 93*333d2b36SAndroid Build Coastguard Worker ` if [ -n "$$(${aconfig} dump-cache --dedup --cache $$cache --filter=is_exported:true --format='{fully_qualified_name}')" ]; then ` + 94*333d2b36SAndroid Build Coastguard Worker ` ${aconfig} create-java-lib --cache $$cache --mode=exported --out ${out}.tmp; ` + 95*333d2b36SAndroid Build Coastguard Worker ` fi ` + 96*333d2b36SAndroid Build Coastguard Worker `done` + 97*333d2b36SAndroid Build Coastguard Worker `&& $soong_zip -write_if_changed -jar -o ${out} -C ${out}.tmp -D ${out}.tmp` + 98*333d2b36SAndroid Build Coastguard Worker `&& rm -rf ${out}.tmp`, 99*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{ 100*333d2b36SAndroid Build Coastguard Worker "$aconfig", 101*333d2b36SAndroid Build Coastguard Worker "$soong_zip", 102*333d2b36SAndroid Build Coastguard Worker }, 103*333d2b36SAndroid Build Coastguard Worker }, "cache_files") 104*333d2b36SAndroid Build Coastguard Worker) 105*333d2b36SAndroid Build Coastguard Worker 106*333d2b36SAndroid Build Coastguard Workerfunc init() { 107*333d2b36SAndroid Build Coastguard Worker RegisterBuildComponents(android.InitRegistrationContext) 108*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("aconfig", "aconfig") 109*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("soong_zip", "soong_zip") 110*333d2b36SAndroid Build Coastguard Worker} 111*333d2b36SAndroid Build Coastguard Worker 112*333d2b36SAndroid Build Coastguard Workerfunc RegisterBuildComponents(ctx android.RegistrationContext) { 113*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("aconfig_declarations", DeclarationsFactory) 114*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("aconfig_values", ValuesFactory) 115*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("aconfig_value_set", ValueSetFactory) 116*333d2b36SAndroid Build Coastguard Worker ctx.RegisterParallelSingletonType("all_aconfig_declarations", AllAconfigDeclarationsFactory) 117*333d2b36SAndroid Build Coastguard Worker ctx.RegisterParallelSingletonType("exported_java_aconfig_library", ExportedJavaDeclarationsLibraryFactory) 118*333d2b36SAndroid Build Coastguard Worker} 119