blob: 99eadb57324b4cd3396ff073be0992e301702922 [file] [log] [blame]
#!/usr/bin/env python3
#
# Copyright 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.
"""Native project information."""
from __future__ import absolute_import
from aidegen.lib import native_module_info
from aidegen.lib import project_config
from aidegen.lib import project_info
class NativeProjectInfo():
"""Native project information.
Class attributes:
modules_info: An AidegenModuleInfo instance whose name_to_module_info is
a dictionary of module_bp_cc_deps.json.
Attributes:
module_names: A list of the native project's module names.
need_builds: A set of module names need to be built.
"""
modules_info = None
def __init__(self, target):
"""ProjectInfo initialize.
Args:
target: A native module or project path from users' input will be
checked if they contain include paths need to be generated,
e.g., in 'libui' module.
'out/soong/../android.frameworks.bufferhub@1.0_genc++_headers/gen'
we should call 'm android.frameworks.bufferhub@1.0' to
generate the include header files in,
'android.frameworks.bufferhub@1.0_genc++_headers/gen'
direcotry.
"""
self.module_names = [target] if self.modules_info.is_module(
target) else self.modules_info.get_module_names_in_targets_paths(
[target])
self.need_builds = {
mod_name
for mod_name in self.module_names
if self.modules_info.is_module_need_build(mod_name)
}
@classmethod
def _init_modules_info(cls):
"""Initializes the class attribute: modules_info."""
if cls.modules_info:
return
cls.modules_info = native_module_info.NativeModuleInfo()
@classmethod
def generate_projects(cls, targets):
"""Generates a list of projects in one time by a list of module names.
The method will collect all needed to build modules and build their
source and include files for them. But if users set the skip build flag
it won't build anything.
Usage:
Call this method before native IDE project files are generated.
For example,
native_project_info.NativeProjectInfo.generate_projects(targets)
native_project_file = native_util.generate_clion_projects(targets)
...
Args:
targets: A list of native modules or project paths which will be
checked if they contain source or include paths need to be
generated.
"""
config = project_config.ProjectConfig.get_instance()
if config.is_skip_build:
return
cls._init_modules_info()
need_builds = cls._get_need_builds(targets)
if need_builds:
project_info.batch_build_dependencies(config.verbose, need_builds)
@classmethod
def _get_need_builds(cls, targets):
"""Gets need to be built modules from targets.
Args:
targets: A list of native modules or project paths which will be
checked if they contain source or include paths need to be
generated.
Returns:
A set of module names which need to be built.
"""
need_builds = set()
for target in targets:
project = NativeProjectInfo(target)
if project.need_builds:
need_builds.update(project.need_builds)
return need_builds