1# Copyright (c) 2024 Huawei Device Co., Ltd.
2# Licensed under the Apache License, Version 2.0 (the "License");
3# you may not use this file except in compliance with the License.
4# You may obtain a copy of the License at
5#
6#     http://www.apache.org/licenses/LICENSE-2.0
7#
8# Unless required by applicable law or agreed to in writing, software
9# distributed under the License is distributed on an "AS IS" BASIS,
10# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11# See the License for the specific language governing permissions and
12# limitations under the License.
13
14import("//foundation/arkui/ace_engine/ace_config.gni")
15import("$ace_root/frameworks/bridge/cj_frontend/platform.gni")
16
17# cj frontend source
18template("cj_frontend") {
19  forward_variables_from(invoker, "*")
20
21  ohos_shared_library(target_name) {
22    subsystem_name = ace_engine_subsystem
23    part_name = ace_engine_part
24    innerapi_tags = [ "platformsdk" ]
25    defines += invoker.defines
26    defines += platform_config.common_defines
27    configs = [ "$ace_root:ace_config" ]
28    include_dirs = [ "$ace_root/frameworks" ]
29
30    if (!defined(deps)) {
31      deps = []
32    }
33
34    external_deps = [
35      "ability_runtime:cj_environment",
36      "napi:cj_bind_ffi",
37      "napi:cj_bind_native",
38    ]
39
40    sources = [
41      "frontend/cj_frontend_abstract.cpp",
42      "frontend/cj_page_router_abstract.cpp",
43    ]
44
45    sources += [
46      "frontend/cj_frontend_loader.cpp",
47      "frontend/cj_frontend_ng.cpp",
48      "frontend/cj_page_router_ng.cpp",
49    ]
50
51    # actually that depends on variable `ace_config: enable_ng_build`, but `adapter` failed to stick on the plan.
52    # then we have to trace `defines` on each platform, the facts is that ohos-ng enables ng build, others are not.
53    if (invoker.platform != "ohos_ng") {
54      sources += [
55        "frontend/cj_frontend.cpp",
56        "frontend/cj_page_router.cpp",
57      ]
58    }
59
60    if (defined(invoker.deps)) {
61      deps += invoker.deps
62    }
63
64    sources += [
65      "cppview/canvas_gradient.cpp",
66      "cppview/canvas_path.cpp",
67      "cppview/canvas_renderer.cpp",
68      "cppview/data_change_listener.cpp",
69      "cppview/gesture.cpp",
70      "cppview/interactable_view.cpp",
71      "cppview/lazy_foreach.cpp",
72      "cppview/lazy_foreach_func.cpp",
73      "cppview/native_view.cpp",
74      "cppview/search_controller.cpp",
75      "cppview/shape_abstract.cpp",
76      "cppview/swiper_controller.cpp",
77      "cppview/view_abstract.cpp",
78      "cppview/view_stack_processor.cpp",
79      "interfaces/cj_ffi/animator/cj_animator.cpp",
80      "interfaces/cj_ffi/animator/cj_animator_ffi.cpp",
81      "interfaces/cj_ffi/base/cj_base_ffi.cpp",
82      "interfaces/cj_ffi/cj_alert_dialog_ffi.cpp",
83      "interfaces/cj_ffi/cj_alphabet_indexer_ffi.cpp",
84      "interfaces/cj_ffi/cj_animate_param_ffi.cpp",
85      "interfaces/cj_ffi/cj_badge_ffi.cpp",
86      "interfaces/cj_ffi/cj_blank_ffi.cpp",
87      "interfaces/cj_ffi/cj_button_ffi.cpp",
88      "interfaces/cj_ffi/cj_canvas_ffi.cpp",
89      "interfaces/cj_ffi/cj_checkbox_ffi.cpp",
90      "interfaces/cj_ffi/cj_checkbox_group_ffi.cpp",
91      "interfaces/cj_ffi/cj_circle_ffi.cpp",
92      "interfaces/cj_ffi/cj_collection_ffi.cpp",
93      "interfaces/cj_ffi/cj_column_ffi.cpp",
94      "interfaces/cj_ffi/cj_column_split_ffi.cpp",
95      "interfaces/cj_ffi/cj_common_ffi.cpp",
96      "interfaces/cj_ffi/cj_component_id_ffi.cpp",
97      "interfaces/cj_ffi/cj_container_base_ffi.cpp",
98      "interfaces/cj_ffi/cj_context_menu_ffi.cpp",
99      "interfaces/cj_ffi/cj_counter_ffi.cpp",
100      "interfaces/cj_ffi/cj_customdialog_controller_ffi.cpp",
101      "interfaces/cj_ffi/cj_data_change_listener_ffi.cpp",
102      "interfaces/cj_ffi/cj_data_ffi.cpp",
103      "interfaces/cj_ffi/cj_data_panel_ffi.cpp",
104      "interfaces/cj_ffi/cj_datepicker_ffi.cpp",
105      "interfaces/cj_ffi/cj_divider_ffi.cpp",
106      "interfaces/cj_ffi/cj_ellipse_ffi.cpp",
107      "interfaces/cj_ffi/cj_flex_ffi.cpp",
108      "interfaces/cj_ffi/cj_foreach_ffi.cpp",
109      "interfaces/cj_ffi/cj_gauge_ffi.cpp",
110      "interfaces/cj_ffi/cj_gesture_ffi.cpp",
111      "interfaces/cj_ffi/cj_grid_col_ffi.cpp",
112      "interfaces/cj_ffi/cj_grid_ffi.cpp",
113      "interfaces/cj_ffi/cj_grid_item_ffi.cpp",
114      "interfaces/cj_ffi/cj_grid_row_ffi.cpp",
115      "interfaces/cj_ffi/cj_hyperlink_ffi.cpp",
116      "interfaces/cj_ffi/cj_if_else_ffi.cpp",
117      "interfaces/cj_ffi/cj_image_animator_ffi.cpp",
118      "interfaces/cj_ffi/cj_image_ffi.cpp",
119      "interfaces/cj_ffi/cj_image_span_ffi.cpp",
120      "interfaces/cj_ffi/cj_interactable_view_ffi.cpp",
121      "interfaces/cj_ffi/cj_lazy_foreach_ffi.cpp",
122      "interfaces/cj_ffi/cj_line_ffi.cpp",
123      "interfaces/cj_ffi/cj_list_ffi.cpp",
124      "interfaces/cj_ffi/cj_list_item_ffi.cpp",
125      "interfaces/cj_ffi/cj_list_item_group_ffi.cpp",
126      "interfaces/cj_ffi/cj_loading_progress_ffi.cpp",
127      "interfaces/cj_ffi/cj_marquee_ffi.cpp",
128      "interfaces/cj_ffi/cj_menu_ffi.cpp",
129      "interfaces/cj_ffi/cj_menu_item_ffi.cpp",
130      "interfaces/cj_ffi/cj_menu_item_group_ffi.cpp",
131      "interfaces/cj_ffi/cj_native_view_ffi.cpp",
132      "interfaces/cj_ffi/cj_navigation_ffi.cpp",
133      "interfaces/cj_ffi/cj_navigator_ffi.cpp",
134      "interfaces/cj_ffi/cj_page_transition_ffi.cpp",
135      "interfaces/cj_ffi/cj_panel_ffi.cpp",
136      "interfaces/cj_ffi/cj_path_ffi.cpp",
137      "interfaces/cj_ffi/cj_pattern_lock.cpp",
138      "interfaces/cj_ffi/cj_pixel_unit_convert_ffi.cpp",
139      "interfaces/cj_ffi/cj_polygon_ffi.cpp",
140      "interfaces/cj_ffi/cj_polyline_ffi.cpp",
141      "interfaces/cj_ffi/cj_progress_ffi.cpp",
142      "interfaces/cj_ffi/cj_qrcode_ffi.cpp",
143      "interfaces/cj_ffi/cj_radio_ffi.cpp",
144      "interfaces/cj_ffi/cj_rating_ffi.cpp",
145      "interfaces/cj_ffi/cj_rect_ffi.cpp",
146      "interfaces/cj_ffi/cj_refresh_ffi.cpp",
147      "interfaces/cj_ffi/cj_relative_container_ffi.cpp",
148      "interfaces/cj_ffi/cj_richeditor_controller_ffi.cpp",
149      "interfaces/cj_ffi/cj_richeditor_ffi.cpp",
150      "interfaces/cj_ffi/cj_row_ffi.cpp",
151      "interfaces/cj_ffi/cj_row_split_ffi.cpp",
152      "interfaces/cj_ffi/cj_scroll_ffi.cpp",
153      "interfaces/cj_ffi/cj_scrollbar_ffi.cpp",
154      "interfaces/cj_ffi/cj_search_ffi.cpp",
155      "interfaces/cj_ffi/cj_select_ffi.cpp",
156      "interfaces/cj_ffi/cj_shape_ffi.cpp",
157      "interfaces/cj_ffi/cj_side_bar_container_ffi.cpp",
158      "interfaces/cj_ffi/cj_slider_ffi.cpp",
159      "interfaces/cj_ffi/cj_span_ffi.cpp",
160      "interfaces/cj_ffi/cj_stack_ffi.cpp",
161      "interfaces/cj_ffi/cj_stepper_ffi.cpp",
162      "interfaces/cj_ffi/cj_stepper_item_ffi.cpp",
163      "interfaces/cj_ffi/cj_swiper_ffi.cpp",
164      "interfaces/cj_ffi/cj_tab_ffi.cpp",
165      "interfaces/cj_ffi/cj_text_clock_ffi.cpp",
166      "interfaces/cj_ffi/cj_text_ffi.cpp",
167      "interfaces/cj_ffi/cj_textarea_ffi.cpp",
168      "interfaces/cj_ffi/cj_textfield_ffi.cpp",
169      "interfaces/cj_ffi/cj_textinput_ffi.cpp",
170      "interfaces/cj_ffi/cj_textpicker_ffi.cpp",
171      "interfaces/cj_ffi/cj_texttimer_ffi.cpp",
172      "interfaces/cj_ffi/cj_toggle_ffi.cpp",
173      "interfaces/cj_ffi/cj_transitioneffect.cpp",
174      "interfaces/cj_ffi/cj_transitioneffect_ffi.cpp",
175      "interfaces/cj_ffi/cj_view_abstract_ffi.cpp",
176      "interfaces/cj_ffi/cj_view_context_ffi.cpp",
177      "interfaces/cj_ffi/cj_view_stack_processor_ffi.cpp",
178      "interfaces/cj_ffi/concurrency/cj_concurrency_ffi.cpp",
179      "interfaces/cj_ffi/font/cj_font_ffi.cpp",
180      "interfaces/cj_ffi/measure/cj_measure_ffi.cpp",
181      "interfaces/cj_ffi/prompt/cj_prompt_ffi.cpp",
182      "interfaces/cj_ffi/router/cj_router_ffi.cpp",
183      "interfaces/cj_ffi/state_manage/cj_environment.cpp",
184      "interfaces/cj_ffi/state_manage/cj_persistent_storage_ffi.cpp",
185      "interfaces/cj_ffi/utils.cpp",
186      "runtime/cj_runtime_delegate.cpp",
187    ]
188
189    deps += [ "$ace_root/build:libace_compatible" ]
190
191    external_deps += [
192      "bundle_framework:appexecfwk_base",
193      "bundle_framework:appexecfwk_core",
194    ]
195
196    deps += [ "${ace_root}/interfaces/inner_api/ace:ace_forward_compatibility" ]
197
198    external_deps += [ "napi:ace_container_scope" ]
199
200    if (platform_config.is_ohos) {
201      external_deps += [
202        "c_utils:utils",
203        "image_framework:cj_image_ffi",
204        "image_framework:image",
205        "image_framework:image_native",
206      ]
207    } else {
208      sources -= [
209        "interfaces/cj_ffi/cj_richeditor_controller_ffi.cpp",
210        "interfaces/cj_ffi/state_manage/cj_environment.cpp",
211        "interfaces/cj_ffi/state_manage/cj_persistent_storage_ffi.cpp",
212      ]
213
214      # add mock sources for ohos-sdk
215      sources += [
216        "interfaces/cj_ffi/mock/cj_richtext.cpp",
217        "interfaces/cj_ffi/state_manage/mock/cj_state_manage_mock.cpp",
218      ]
219    }
220
221    if (defined(config.web_components_support) &&
222        config.web_components_support) {
223      external_deps += [
224        "ability_runtime:app_context",
225        "webview:cj_webview_ffi",
226        "webview:libnweb",
227      ]
228      sources += [
229        "interfaces/cj_ffi/cj_richtext_ffi.cpp",
230        "interfaces/cj_ffi/cj_web_ffi.cpp",
231      ]
232    } else {
233      sources += [ "interfaces/cj_ffi/mock/cj_web_mock.cpp" ]
234    }
235
236    if (defined(config.video_components_support) &&
237        config.video_components_support) {
238      sources += [ "interfaces/cj_ffi/cj_video_ffi.cpp" ]
239      if (defined(config.video_support_jsstack) &&
240          config.video_support_jsstack) {
241        external_deps += [ "hiview:libxpower_event_js" ]
242      }
243    } else {
244      sources += [ "interfaces/cj_ffi/mock/cj_video_mock.cpp" ]
245    }
246  }
247}
248
249foreach(item, ace_platforms) {
250  platform = item.name
251  engine_config = {
252  }
253  engine_config = item.config
254  cj_frontend("cj_frontend_" + item.name) {
255    # platform = item.name
256    defines = []
257    config = {
258    }
259
260    if (defined(item.config)) {
261      config = item.config
262    }
263
264    if (defined(config.defines)) {
265      defines = config.defines
266    }
267  }
268}
269