1d9f0492fSopenharmony_ci# Copyright (c) 2021 Huawei Device Co., Ltd.
2d9f0492fSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
3d9f0492fSopenharmony_ci# you may not use this file except in compliance with the License.
4d9f0492fSopenharmony_ci# You may obtain a copy of the License at
5d9f0492fSopenharmony_ci#
6d9f0492fSopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
7d9f0492fSopenharmony_ci#
8d9f0492fSopenharmony_ci# Unless required by applicable law or agreed to in writing, software
9d9f0492fSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
10d9f0492fSopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11d9f0492fSopenharmony_ci# See the License for the specific language governing permissions and
12d9f0492fSopenharmony_ci# limitations under the License.
13d9f0492fSopenharmony_ci
14d9f0492fSopenharmony_ciimport("//build/config/python.gni")
15d9f0492fSopenharmony_ciimport("//build/templates/common/copy.gni")
16d9f0492fSopenharmony_ci
17d9f0492fSopenharmony_ci# Append something (files or lines) to a file and install it.
18d9f0492fSopenharmony_ci#
19d9f0492fSopenharmony_ci# Variables:
20d9f0492fSopenharmony_ci#  source: file to be appended (Required)
21d9f0492fSopenharmony_ci#  deps: some targets deps on (Optional)
22d9f0492fSopenharmony_ci#  output: the final install file name (Optional);
23d9f0492fSopenharmony_ci#       If not set, it will install with the source file name
24d9f0492fSopenharmony_ci#  files: files to be appended to the end of source file (Optional)
25d9f0492fSopenharmony_ci#  lines: lines of strings to be appended to the end of souce file (Optional)
26d9f0492fSopenharmony_ci#
27d9f0492fSopenharmony_ci# Example:
28d9f0492fSopenharmony_ci# ohos_file_appender("cust_passwd") {
29d9f0492fSopenharmony_ci#   source = "//base/startup/init/services/etc/passwd"
30d9f0492fSopenharmony_ci#   deps = [ "//base/startup/init/services/etc:passwd" ]
31d9f0492fSopenharmony_ci#   files = [ "cust_passwd", "passwd2" ]
32d9f0492fSopenharmony_ci#   lines = [ "tses::1222:1222:/bin/false", "tses2::1223:1223:/bin/false" ]
33d9f0492fSopenharmony_ci#   output = "passwd"
34d9f0492fSopenharmony_ci# }
35d9f0492fSopenharmony_ci# It will append files and lines to source passwd file after deps targets
36d9f0492fSopenharmony_ci#
37d9f0492fSopenharmony_citemplate("ohos_file_appender") {
38d9f0492fSopenharmony_ci  assert(defined(invoker.source), "source full target name must be defined.")
39d9f0492fSopenharmony_ci
40d9f0492fSopenharmony_ci  _file_appender_target = "${target_name}_appended"
41d9f0492fSopenharmony_ci
42d9f0492fSopenharmony_ci  if (defined(invoker.output)) {
43d9f0492fSopenharmony_ci    _final_install_name = get_path_info(invoker.output, "file")
44d9f0492fSopenharmony_ci  } else {
45d9f0492fSopenharmony_ci    _final_install_name = get_path_info(invoker.source, "file")
46d9f0492fSopenharmony_ci  }
47d9f0492fSopenharmony_ci
48d9f0492fSopenharmony_ci  _appended_file =
49d9f0492fSopenharmony_ci      target_gen_dir + "/${target_name}.appended/" + _final_install_name
50d9f0492fSopenharmony_ci
51d9f0492fSopenharmony_ci  action_with_pydeps(_file_appender_target) {
52d9f0492fSopenharmony_ci    script = "//base/startup/init/services/etc/appender/file_appender.py"
53d9f0492fSopenharmony_ci    depfile = "${target_gen_dir}/${target_name}.d"
54d9f0492fSopenharmony_ci    if (defined(invoker.deps)) {
55d9f0492fSopenharmony_ci      deps = invoker.deps
56d9f0492fSopenharmony_ci    } else {
57d9f0492fSopenharmony_ci      deps = []
58d9f0492fSopenharmony_ci    }
59d9f0492fSopenharmony_ci    args = [
60d9f0492fSopenharmony_ci      "--output",
61d9f0492fSopenharmony_ci      rebase_path(_appended_file, root_build_dir),
62d9f0492fSopenharmony_ci      "--source-file",
63d9f0492fSopenharmony_ci      rebase_path(invoker.source, root_build_dir),
64d9f0492fSopenharmony_ci      "--depfile",
65d9f0492fSopenharmony_ci      rebase_path(depfile, root_build_dir),
66d9f0492fSopenharmony_ci    ]
67d9f0492fSopenharmony_ci    if (defined(invoker.files)) {
68d9f0492fSopenharmony_ci      foreach(file, invoker.files) {
69d9f0492fSopenharmony_ci        args += [
70d9f0492fSopenharmony_ci          "--append-file",
71d9f0492fSopenharmony_ci          rebase_path(file, root_build_dir),
72d9f0492fSopenharmony_ci        ]
73d9f0492fSopenharmony_ci      }
74d9f0492fSopenharmony_ci    }
75d9f0492fSopenharmony_ci    if (defined(invoker.lines)) {
76d9f0492fSopenharmony_ci      foreach(line, invoker.lines) {
77d9f0492fSopenharmony_ci        args += [
78d9f0492fSopenharmony_ci          "--append-line",
79d9f0492fSopenharmony_ci          line,
80d9f0492fSopenharmony_ci        ]
81d9f0492fSopenharmony_ci      }
82d9f0492fSopenharmony_ci    }
83d9f0492fSopenharmony_ci    inputs = [ invoker.source ]
84d9f0492fSopenharmony_ci    outputs = [ _appended_file ]
85d9f0492fSopenharmony_ci  }
86d9f0492fSopenharmony_ci
87d9f0492fSopenharmony_ci  ohos_copy(target_name) {
88d9f0492fSopenharmony_ci    forward_variables_from(invoker,
89d9f0492fSopenharmony_ci                           [
90d9f0492fSopenharmony_ci                             "testonly",
91d9f0492fSopenharmony_ci                             "visibility",
92d9f0492fSopenharmony_ci
93d9f0492fSopenharmony_ci                             "deps",
94d9f0492fSopenharmony_ci                             "public_configs",
95d9f0492fSopenharmony_ci                             "subsystem_name",
96d9f0492fSopenharmony_ci                             "part_name",
97d9f0492fSopenharmony_ci
98d9f0492fSopenharmony_ci                             # For generate_module_info
99d9f0492fSopenharmony_ci                             "install_images",
100d9f0492fSopenharmony_ci                             "module_install_dir",
101d9f0492fSopenharmony_ci                             "relative_install_dir",
102d9f0492fSopenharmony_ci                             "symlink_target_name",
103d9f0492fSopenharmony_ci
104d9f0492fSopenharmony_ci                             # Open source license related
105d9f0492fSopenharmony_ci                             "license_file",
106d9f0492fSopenharmony_ci                             "license_as_sources",
107d9f0492fSopenharmony_ci                           ])
108d9f0492fSopenharmony_ci    if (defined(deps)) {
109d9f0492fSopenharmony_ci      deps += [ ":$_file_appender_target" ]
110d9f0492fSopenharmony_ci    } else {
111d9f0492fSopenharmony_ci      deps = [ ":$_file_appender_target" ]
112d9f0492fSopenharmony_ci    }
113d9f0492fSopenharmony_ci    set_sources_assignment_filter([])
114d9f0492fSopenharmony_ci    sources = [ _appended_file ]
115d9f0492fSopenharmony_ci    outputs = [ "${target_out_dir}/${target_name}/${_final_install_name}" ]
116d9f0492fSopenharmony_ci    module_type = "etc"
117d9f0492fSopenharmony_ci    install_enable = true
118d9f0492fSopenharmony_ci    module_source_dir = "${target_out_dir}/${target_name}"
119d9f0492fSopenharmony_ci    module_install_name = _final_install_name
120d9f0492fSopenharmony_ci    if (defined(invoker.install_enable)) {
121d9f0492fSopenharmony_ci      install_enable = invoker.install_enable
122d9f0492fSopenharmony_ci    }
123d9f0492fSopenharmony_ci  }
124d9f0492fSopenharmony_ci}
125