From ac692c5eae3072db12efd78f5d777a097212550d Mon Sep 17 00:00:00 2001 From: Joe Onorato Date: Tue, 18 Jul 2023 17:29:14 -0700 Subject: [PATCH] Make aconfig c++ generate only one header and only one .cc file Bug: 283479529 Test: m aconfig_hello_world_cc && adb push $TOP/out/target/product/panther/system/bin/aconfig_hello_world_cc /system/bin && adb shell aconfig_hello_world_cc Change-Id: I1890aff70262343e18a62fb2efb2fd0e13a48fb2 --- tools/aconfig/src/codegen_cpp.rs | 372 +++++++----------- .../templates/c_exported_header.template | 21 - .../aconfig/templates/c_source_file.template | 28 -- .../templates/cpp_exported_header.template | 23 ++ .../templates/cpp_prod_flag_provider.template | 24 -- .../templates/cpp_source_file.template | 94 ++++- .../templates/cpp_test_flag_provider.template | 48 --- tools/aconfig/test_cc/Android.bp | 17 + tools/aconfig/test_cc/aconfig_hello_world.cpp | 22 ++ 9 files changed, 305 insertions(+), 344 deletions(-) delete mode 100644 tools/aconfig/templates/c_exported_header.template delete mode 100644 tools/aconfig/templates/c_source_file.template delete mode 100644 tools/aconfig/templates/cpp_prod_flag_provider.template delete mode 100644 tools/aconfig/templates/cpp_test_flag_provider.template create mode 100644 tools/aconfig/test_cc/Android.bp create mode 100644 tools/aconfig/test_cc/aconfig_hello_world.cpp diff --git a/tools/aconfig/src/codegen_cpp.rs b/tools/aconfig/src/codegen_cpp.rs index c17af1f402..530af49866 100644 --- a/tools/aconfig/src/codegen_cpp.rs +++ b/tools/aconfig/src/codegen_cpp.rs @@ -57,26 +57,6 @@ where template: include_str!("../templates/cpp_source_file.template"), dir: "", }, - FileSpec { - name: &format!("{}_flag_provider.h", header), - template: match codegen_mode { - CodegenMode::Production => { - include_str!("../templates/cpp_prod_flag_provider.template") - } - CodegenMode::Test => include_str!("../templates/cpp_test_flag_provider.template"), - }, - dir: "", - }, - FileSpec { - name: &format!("{}_c.h", header), - template: include_str!("../templates/c_exported_header.template"), - dir: "include", - }, - FileSpec { - name: &format!("{}_c.cc", header), - template: include_str!("../templates/c_source_file.template"), - dir: "", - }, ]; files.iter().map(|file| generate_file(file, &context)).collect() } @@ -138,12 +118,13 @@ mod tests { const EXPORTED_PROD_HEADER_EXPECTED: &str = r#" #pragma once +#ifdef __cplusplus + #include namespace com::android::aconfig::test { class flag_provider_interface { public: - virtual ~flag_provider_interface() = default; virtual bool disabled_ro() = 0; @@ -174,14 +155,32 @@ inline bool enabled_rw() { } } + +extern "C" { +#endif // __cplusplus + +bool com_android_aconfig_test_disabled_ro(); + +bool com_android_aconfig_test_disabled_rw(); + +bool com_android_aconfig_test_enabled_ro(); + +bool com_android_aconfig_test_enabled_rw(); + +#ifdef __cplusplus +} // extern "C" +#endif "#; const EXPORTED_TEST_HEADER_EXPECTED: &str = r#" #pragma once +#ifdef __cplusplus + #include namespace com::android::aconfig::test { + class flag_provider_interface { public: @@ -245,164 +244,9 @@ inline void reset_flags() { } } -"#; - const PROD_FLAG_PROVIDER_HEADER_EXPECTED: &str = r#" -#pragma once - -#include "com_android_aconfig_test.h" -#include - -namespace com::android::aconfig::test { -class flag_provider : public flag_provider_interface { -public: - - virtual bool disabled_ro() override { - return false; - } - - virtual bool disabled_rw() override { - return server_configurable_flags::GetServerConfigurableFlag( - "aconfig_test", - "com.android.aconfig.test.disabled_rw", - "false") == "true"; - } - - virtual bool enabled_ro() override { - return true; - } - - virtual bool enabled_rw() override { - return server_configurable_flags::GetServerConfigurableFlag( - "aconfig_test", - "com.android.aconfig.test.enabled_rw", - "true") == "true"; - } -}; -} -"#; - - const TEST_FLAG_PROVIDER_HEADER_EXPECTED: &str = r#" -#pragma once - -#include "com_android_aconfig_test.h" -#include - -#include -#include - -namespace com::android::aconfig::test { -class flag_provider : public flag_provider_interface { -private: - std::unordered_map overrides_; - -public: - - flag_provider() - : overrides_() - {} - - virtual bool disabled_ro() override { - auto it = overrides_.find("disabled_ro"); - if (it != overrides_.end()) { - return it->second; - } else { - return false; - } - } - - virtual void disabled_ro(bool val) override { - overrides_["disabled_ro"] = val; - } - - virtual bool disabled_rw() override { - auto it = overrides_.find("disabled_rw"); - if (it != overrides_.end()) { - return it->second; - } else { - return server_configurable_flags::GetServerConfigurableFlag( - "aconfig_test", - "com.android.aconfig.test.disabled_rw", - "false") == "true"; - } - } - - virtual void disabled_rw(bool val) override { - overrides_["disabled_rw"] = val; - } - - virtual bool enabled_ro() override { - auto it = overrides_.find("enabled_ro"); - if (it != overrides_.end()) { - return it->second; - } else { - return true; - } - } - - virtual void enabled_ro(bool val) override { - overrides_["enabled_ro"] = val; - } - - virtual bool enabled_rw() override { - auto it = overrides_.find("enabled_rw"); - if (it != overrides_.end()) { - return it->second; - } else { - return server_configurable_flags::GetServerConfigurableFlag( - "aconfig_test", - "com.android.aconfig.test.enabled_rw", - "true") == "true"; - } - } - - virtual void enabled_rw(bool val) override { - overrides_["enabled_rw"] = val; - } - - virtual void reset_flags() override { - overrides_.clear(); - } -}; -} -"#; - - const SOURCE_FILE_EXPECTED: &str = r#" -#include "com_android_aconfig_test.h" -#include "com_android_aconfig_test_flag_provider.h" - -namespace com::android::aconfig::test { - std::unique_ptr provider_ = - std::make_unique(); -} -"#; - - const C_EXPORTED_PROD_HEADER_EXPECTED: &str = r#" -#pragma once - -#ifdef __cplusplus extern "C" { -#endif - -bool com_android_aconfig_test_disabled_ro(); - -bool com_android_aconfig_test_disabled_rw(); - -bool com_android_aconfig_test_enabled_ro(); - -bool com_android_aconfig_test_enabled_rw(); - -#ifdef __cplusplus -} -#endif -"#; - - const C_EXPORTED_TEST_HEADER_EXPECTED: &str = r#" -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif +#endif // __cplusplus bool com_android_aconfig_test_disabled_ro(); @@ -422,14 +266,50 @@ void set_com_android_aconfig_test_enabled_rw(bool val); void com_android_aconfig_test_reset_flags(); + #ifdef __cplusplus -} +} // extern "C" #endif + + "#; - const C_PROD_SOURCE_FILE_EXPECTED: &str = r#" -#include "com_android_aconfig_test_c.h" + const PROD_SOURCE_FILE_EXPECTED: &str = r#" #include "com_android_aconfig_test.h" +#include + +namespace com::android::aconfig::test { + + class flag_provider : public flag_provider_interface { + public: + + virtual bool disabled_ro() override { + return false; + } + + virtual bool disabled_rw() override { + return server_configurable_flags::GetServerConfigurableFlag( + "aconfig_test", + "com.android.aconfig.test.disabled_rw", + "false") == "true"; + } + + virtual bool enabled_ro() override { + return true; + } + + virtual bool enabled_rw() override { + return server_configurable_flags::GetServerConfigurableFlag( + "aconfig_test", + "com.android.aconfig.test.enabled_rw", + "true") == "true"; + } + + }; + + std::unique_ptr provider_ = + std::make_unique(); +} bool com_android_aconfig_test_disabled_ro() { return false; @@ -446,16 +326,97 @@ bool com_android_aconfig_test_enabled_ro() { bool com_android_aconfig_test_enabled_rw() { return com::android::aconfig::test::enabled_rw(); } + "#; - const C_TEST_SOURCE_FILE_EXPECTED: &str = r#" -#include "com_android_aconfig_test_c.h" + const TEST_SOURCE_FILE_EXPECTED: &str = r#" #include "com_android_aconfig_test.h" +#include + +namespace com::android::aconfig::test { + + class flag_provider : public flag_provider_interface { + private: + std::unordered_map overrides_; + + public: + flag_provider() + : overrides_() + {} + + virtual bool disabled_ro() override { + auto it = overrides_.find("disabled_ro"); + if (it != overrides_.end()) { + return it->second; + } else { + return false; + } + } + + virtual void disabled_ro(bool val) override { + overrides_["disabled_ro"] = val; + } + + virtual bool disabled_rw() override { + auto it = overrides_.find("disabled_rw"); + if (it != overrides_.end()) { + return it->second; + } else { + return server_configurable_flags::GetServerConfigurableFlag( + "aconfig_test", + "com.android.aconfig.test.disabled_rw", + "false") == "true"; + } + } + + virtual void disabled_rw(bool val) override { + overrides_["disabled_rw"] = val; + } + + virtual bool enabled_ro() override { + auto it = overrides_.find("enabled_ro"); + if (it != overrides_.end()) { + return it->second; + } else { + return true; + } + } + + virtual void enabled_ro(bool val) override { + overrides_["enabled_ro"] = val; + } + + virtual bool enabled_rw() override { + auto it = overrides_.find("enabled_rw"); + if (it != overrides_.end()) { + return it->second; + } else { + return server_configurable_flags::GetServerConfigurableFlag( + "aconfig_test", + "com.android.aconfig.test.enabled_rw", + "true") == "true"; + } + } + + virtual void enabled_rw(bool val) override { + overrides_["enabled_rw"] = val; + } + + + virtual void reset_flags() override { + overrides_.clear(); + } + }; + + std::unique_ptr provider_ = + std::make_unique(); +} bool com_android_aconfig_test_disabled_ro() { return com::android::aconfig::test::disabled_ro(); } + void set_com_android_aconfig_test_disabled_ro(bool val) { com::android::aconfig::test::disabled_ro(val); } @@ -464,6 +425,7 @@ bool com_android_aconfig_test_disabled_rw() { return com::android::aconfig::test::disabled_rw(); } + void set_com_android_aconfig_test_disabled_rw(bool val) { com::android::aconfig::test::disabled_rw(val); } @@ -472,6 +434,7 @@ bool com_android_aconfig_test_enabled_ro() { return com::android::aconfig::test::enabled_ro(); } + void set_com_android_aconfig_test_enabled_ro(bool val) { com::android::aconfig::test::enabled_ro(val); } @@ -480,14 +443,17 @@ bool com_android_aconfig_test_enabled_rw() { return com::android::aconfig::test::enabled_rw(); } + void set_com_android_aconfig_test_enabled_rw(bool val) { com::android::aconfig::test::enabled_rw(val); } void com_android_aconfig_test_reset_flags() { - com::android::aconfig::test::reset_flags(); + com::android::aconfig::test::reset_flags(); } + "#; + fn test_generate_cpp_code(mode: CodegenMode) { let parsed_flags = crate::test::parse_test_flags(); let generated = @@ -514,50 +480,14 @@ void com_android_aconfig_test_reset_flags() { ) ); - target_file_path = String::from("com_android_aconfig_test_flag_provider.h"); - assert!(generated_files_map.contains_key(&target_file_path)); - assert_eq!( - None, - crate::test::first_significant_code_diff( - match mode { - CodegenMode::Production => PROD_FLAG_PROVIDER_HEADER_EXPECTED, - CodegenMode::Test => TEST_FLAG_PROVIDER_HEADER_EXPECTED, - }, - generated_files_map.get(&target_file_path).unwrap() - ) - ); - target_file_path = String::from("com_android_aconfig_test.cc"); assert!(generated_files_map.contains_key(&target_file_path)); - assert_eq!( - None, - crate::test::first_significant_code_diff( - SOURCE_FILE_EXPECTED, - generated_files_map.get(&target_file_path).unwrap() - ) - ); - - target_file_path = String::from("include/com_android_aconfig_test_c.h"); - assert!(generated_files_map.contains_key(&target_file_path)); assert_eq!( None, crate::test::first_significant_code_diff( match mode { - CodegenMode::Production => C_EXPORTED_PROD_HEADER_EXPECTED, - CodegenMode::Test => C_EXPORTED_TEST_HEADER_EXPECTED, - }, - generated_files_map.get(&target_file_path).unwrap() - ) - ); - - target_file_path = String::from("com_android_aconfig_test_c.cc"); - assert!(generated_files_map.contains_key(&target_file_path)); - assert_eq!( - None, - crate::test::first_significant_code_diff( - match mode { - CodegenMode::Production => C_PROD_SOURCE_FILE_EXPECTED, - CodegenMode::Test => C_TEST_SOURCE_FILE_EXPECTED, + CodegenMode::Production => PROD_SOURCE_FILE_EXPECTED, + CodegenMode::Test => TEST_SOURCE_FILE_EXPECTED, }, generated_files_map.get(&target_file_path).unwrap() ) diff --git a/tools/aconfig/templates/c_exported_header.template b/tools/aconfig/templates/c_exported_header.template deleted file mode 100644 index ca812a77a3..0000000000 --- a/tools/aconfig/templates/c_exported_header.template +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -#ifdef __cplusplus -extern "C" \{ -#endif - -{{ for item in class_elements }} -bool {header}_{item.flag_name}(); - -{{ if for_test }} -void set_{header}_{item.flag_name}(bool val); -{{ -endif }} -{{ endfor - }} - -{{ if for_test }} -void {header}_reset_flags(); -{{ -endif }} - -#ifdef __cplusplus -} -#endif diff --git a/tools/aconfig/templates/c_source_file.template b/tools/aconfig/templates/c_source_file.template deleted file mode 100644 index 384221dab6..0000000000 --- a/tools/aconfig/templates/c_source_file.template +++ /dev/null @@ -1,28 +0,0 @@ -#include "{header}_c.h" -#include "{header}.h" - -{{ for item in class_elements}} -bool {header}_{item.flag_name}() \{ - {{ if for_test }} - return {cpp_namespace}::{item.flag_name}(); - {{ -else- }} - {{ if not item.readwrite- }} - return {item.default_value}; - {{ -else- }} - return {cpp_namespace}::{item.flag_name}(); - {{ -endif }} - {{ -endif }} -} - -{{ if for_test }} -void set_{header}_{item.flag_name}(bool val) \{ - {cpp_namespace}::{item.flag_name}(val); -} -{{ -endif }} -{{ endfor -}} - -{{ if for_test }} -void {header}_reset_flags() \{ - {cpp_namespace}::reset_flags(); -} -{{ -endif }} diff --git a/tools/aconfig/templates/cpp_exported_header.template b/tools/aconfig/templates/cpp_exported_header.template index cd0185362e..4d56dbc7f0 100644 --- a/tools/aconfig/templates/cpp_exported_header.template +++ b/tools/aconfig/templates/cpp_exported_header.template @@ -1,5 +1,7 @@ #pragma once +#ifdef __cplusplus + #include namespace {cpp_namespace} \{ @@ -47,4 +49,25 @@ inline void reset_flags() \{ return provider_->reset_flags(); } {{ -endif }} + } + +extern "C" \{ +#endif // __cplusplus + +{{ for item in class_elements }} +bool {header}_{item.flag_name}(); + +{{ if for_test }} +void set_{header}_{item.flag_name}(bool val); +{{ -endif }} +{{ endfor - }} + +{{ if for_test }} +void {header}_reset_flags(); +{{ -endif }} + +#ifdef __cplusplus +} // extern "C" +#endif + diff --git a/tools/aconfig/templates/cpp_prod_flag_provider.template b/tools/aconfig/templates/cpp_prod_flag_provider.template deleted file mode 100644 index f908f1299f..0000000000 --- a/tools/aconfig/templates/cpp_prod_flag_provider.template +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -#include "{header}.h" -{{ if readwrite }} -#include -{{ endif }} - -namespace {cpp_namespace} \{ -class flag_provider : public flag_provider_interface \{ -public: - {{ for item in class_elements}} - virtual bool {item.flag_name}() override \{ - {{ if item.readwrite- }} - return server_configurable_flags::GetServerConfigurableFlag( - "{item.device_config_namespace}", - "{item.device_config_flag}", - "{item.default_value}") == "true"; - {{ -else- }} - return {item.default_value}; - {{ -endif }} - } - {{ endfor }} -}; -} diff --git a/tools/aconfig/templates/cpp_source_file.template b/tools/aconfig/templates/cpp_source_file.template index d267f03117..289e299096 100644 --- a/tools/aconfig/templates/cpp_source_file.template +++ b/tools/aconfig/templates/cpp_source_file.template @@ -1,8 +1,98 @@ - #include "{header}.h" -#include "{header}_flag_provider.h" +{{ if readwrite }} +#include +{{ endif }} namespace {cpp_namespace} \{ + +{{ if for_test }} + class flag_provider : public flag_provider_interface \{ + private: + std::unordered_map overrides_; + + public: + flag_provider() + : overrides_() + \{} + + {{ for item in class_elements}} + virtual bool {item.flag_name}() override \{ + auto it = overrides_.find("{item.flag_name}"); + if (it != overrides_.end()) \{ + return it->second; + } else \{ + {{ if item.readwrite- }} + return server_configurable_flags::GetServerConfigurableFlag( + "{item.device_config_namespace}", + "{item.device_config_flag}", + "{item.default_value}") == "true"; + {{ -else- }} + return {item.default_value}; + {{ -endif }} + } + } + + virtual void {item.flag_name}(bool val) override \{ + overrides_["{item.flag_name}"] = val; + } + {{ endfor }} + + virtual void reset_flags() override \{ + overrides_.clear(); + } + }; + +{{ -else- }} + + class flag_provider : public flag_provider_interface \{ + public: + {{ for item in class_elements}} + virtual bool {item.flag_name}() override \{ + {{ if item.readwrite- }} + return server_configurable_flags::GetServerConfigurableFlag( + "{item.device_config_namespace}", + "{item.device_config_flag}", + "{item.default_value}") == "true"; + {{ -else- }} + return {item.default_value}; + {{ -endif }} + } + {{ endfor }} + }; + + +{{ -endif }} + + std::unique_ptr provider_ = std::make_unique(); + } + + +{{ for item in class_elements}} +bool {header}_{item.flag_name}() \{ + {{ if for_test }} + return {cpp_namespace}::{item.flag_name}(); + {{ -else- }} + {{ if not item.readwrite- }} + return {item.default_value}; + {{ -else- }} + return {cpp_namespace}::{item.flag_name}(); + {{ -endif }} + {{ -endif }} +} + +{{ if for_test }} +void set_{header}_{item.flag_name}(bool val) \{ + {cpp_namespace}::{item.flag_name}(val); +} +{{ -endif }} +{{ endfor -}} + +{{ if for_test }} +void {header}_reset_flags() \{ + {cpp_namespace}::reset_flags(); +} +{{ -endif }} + diff --git a/tools/aconfig/templates/cpp_test_flag_provider.template b/tools/aconfig/templates/cpp_test_flag_provider.template deleted file mode 100644 index 03f10a524c..0000000000 --- a/tools/aconfig/templates/cpp_test_flag_provider.template +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once - -#include "{header}.h" - -{{ if readwrite }} -#include -{{ endif }} - -#include -#include - -namespace {cpp_namespace} \{ -class flag_provider : public flag_provider_interface \{ -private: - std::unordered_map overrides_; - -public: - flag_provider() - : overrides_() - \{} - - {{ for item in class_elements}} - virtual bool {item.flag_name}() override \{ - auto it = overrides_.find("{item.flag_name}"); - if (it != overrides_.end()) \{ - return it->second; - } else \{ - {{ if item.readwrite- }} - return server_configurable_flags::GetServerConfigurableFlag( - "{item.device_config_namespace}", - "{item.device_config_flag}", - "{item.default_value}") == "true"; - {{ -else- }} - return {item.default_value}; - {{ -endif }} - } - } - - virtual void {item.flag_name}(bool val) override \{ - overrides_["{item.flag_name}"] = val; - } - {{ endfor }} - - virtual void reset_flags() override \{ - overrides_.clear(); - } -}; -} diff --git a/tools/aconfig/test_cc/Android.bp b/tools/aconfig/test_cc/Android.bp new file mode 100644 index 0000000000..b067559345 --- /dev/null +++ b/tools/aconfig/test_cc/Android.bp @@ -0,0 +1,17 @@ +cc_aconfig_library { + name: "aconfig_test_cc_library", + aconfig_declarations: "aconfig.test.flags", +} + +cc_binary { + name: "aconfig_hello_world_cc", + srcs: [ + "aconfig_hello_world.cpp", + ], + static_libs: [ + "aconfig_test_cc_library", + ], + shared_libs: [ + "server_configurable_flags", + ], +} diff --git a/tools/aconfig/test_cc/aconfig_hello_world.cpp b/tools/aconfig/test_cc/aconfig_hello_world.cpp new file mode 100644 index 0000000000..b6840a3d08 --- /dev/null +++ b/tools/aconfig/test_cc/aconfig_hello_world.cpp @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2023 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. + */ + +#include +#include "com_android_aconfig_test.h" + +int main() { + printf("hello flag %d\n", com_android_aconfig_test_disabled_rw()); +}