1# Copyright (c) 2021-2023 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("//build/ohos.gni") 15import("//foundation/arkui/ace_engine/ace_config.gni") 16import("//foundation/arkui/ace_engine/build/ace_gen_obj.gni") 17import("../../../build/uicast.gni") 18 19# declarative frontend source 20template("declarative_frontend") { 21 forward_variables_from(invoker, "*") 22 23 ohos_source_set(target_name) { 24 subsystem_name = ace_engine_subsystem 25 part_name = ace_engine_part 26 defines += invoker.defines 27 configs = [ "$ace_root:ace_config" ] 28 29 if (enable_ng_build) { 30 sources = [ 31 "ng/declarative_frontend_ng.cpp", 32 "ng/frontend_delegate_declarative_ng.cpp", 33 "ng/page_router_manager.cpp", 34 ] 35 } else { 36 sources = [ 37 "declarative_frontend.cpp", 38 "frontend_delegate_declarative.cpp", 39 "ng/page_router_manager.cpp", 40 ] 41 } 42 43 deps = [ "$ace_root/frameworks/core/components/theme:build_theme_code" ] 44 } 45} 46 47foreach(item, ace_platforms) { 48 declarative_frontend("declarative_frontend_" + item.name) { 49 defines = [] 50 config = { 51 } 52 53 if (defined(item.config)) { 54 config = item.config 55 } 56 57 if (defined(config.defines)) { 58 defines = config.defines 59 } 60 } 61} 62 63# js resources objects 64base_output_path = get_label_info(":gen_js_proxyclass", "target_out_dir") 65jsproxyclass_obj_path = base_output_path + "/js_proxy_class.o" 66jsenumstyle_obj_path = base_output_path + "/js_enum_style.o" 67jsmocksystemplugin_obj_path = base_output_path + "/js_mock_system_plugin.o" 68 69gen_obj("js_proxyclass") { 70 input = "engine/stateMgmt.js" 71 if (use_mac || use_mingw_win || use_linux || target_os == "ios") { 72 jsproxyclass_obj_path = base_output_path + "/js_proxy_class.c" 73 } 74 output = jsproxyclass_obj_path 75 snapshot_dep = [] 76} 77 78gen_obj("js_enum_style") { 79 input = "engine/jsEnumStyle.js" 80 if (use_mac || use_mingw_win || use_linux || target_os == "ios") { 81 jsenumstyle_obj_path = base_output_path + "/js_enum_style.c" 82 } 83 output = jsenumstyle_obj_path 84 snapshot_dep = [] 85} 86 87gen_obj("js_mock_system_plugin") { 88 input = "$root_out_dir/obj/third_party/jsframework/dist/jsMockSystemPlugin.js" 89 if (use_mac || use_mingw_win || use_linux || target_os == "ios") { 90 jsmocksystemplugin_obj_path = base_output_path + "/js_mock_system_plugin.c" 91 } 92 output = jsmocksystemplugin_obj_path 93 snapshot_dep = [ "//third_party/jsframework:gen_snapshot" ] 94} 95 96# build declarative javascript engine source 97template("declarative_js_engine") { 98 forward_variables_from(invoker, "*") 99 100 ohos_source_set(target_name) { 101 subsystem_name = ace_engine_subsystem 102 part_name = ace_engine_part 103 defines += invoker.defines 104 if (target_cpu == "arm64") { 105 if (!is_mingw) { 106 defines += [ "_ARM64_" ] 107 } 108 } 109 if (current_os == "ohos" && current_cpu == "x86_64") { 110 defines += [ "SIMULATOR_64" ] 111 } 112 113 deps = [] 114 configs = [ "$ace_root:ace_config" ] 115 116 sources = [ 117 "engine/bindings_implementation.cpp", 118 "engine/declarative_engine_loader.cpp", 119 "engine/functions/js_animator_function.cpp", 120 "engine/functions/js_click_function.cpp", 121 "engine/functions/js_clipboard_function.cpp", 122 "engine/functions/js_drag_function.cpp", 123 "engine/functions/js_focus_function.cpp", 124 "engine/functions/js_foreach_function.cpp", 125 "engine/functions/js_function.cpp", 126 "engine/functions/js_gesture_function.cpp", 127 "engine/functions/js_hover_function.cpp", 128 "engine/functions/js_key_function.cpp", 129 "engine/functions/js_mouse_function.cpp", 130 "engine/functions/js_on_area_change_function.cpp", 131 "engine/functions/js_page_transition_function.cpp", 132 "engine/functions/js_pan_function.cpp", 133 "engine/functions/js_touch_function.cpp", 134 "engine/functions/js_webview_function.cpp", 135 "engine/js_types.cpp", 136 "interfaces/profiler/js_profiler.cpp", 137 "jsview/action_sheet/js_action_sheet.cpp", 138 "jsview/dialog/js_alert_dialog.cpp", 139 "jsview/dialog/js_custom_dialog_controller.cpp", 140 "jsview/js_animator.cpp", 141 "jsview/js_badge.cpp", 142 "jsview/js_blank.cpp", 143 "jsview/js_button.cpp", 144 "jsview/js_calendar.cpp", 145 "jsview/js_calendar_controller.cpp", 146 "jsview/js_canvas.cpp", 147 "jsview/js_canvas_gradient.cpp", 148 "jsview/js_canvas_image_data.cpp", 149 "jsview/js_canvas_path.cpp", 150 "jsview/js_canvas_renderer.cpp", 151 "jsview/js_checkbox.cpp", 152 "jsview/js_checkboxgroup.cpp", 153 "jsview/js_circle.cpp", 154 "jsview/js_clipboard.cpp", 155 "jsview/js_column.cpp", 156 "jsview/js_column_split.cpp", 157 "jsview/js_common_view.cpp", 158 "jsview/js_container_base.cpp", 159 "jsview/js_counter.cpp", 160 "jsview/js_data_panel.cpp", 161 "jsview/js_datepicker.cpp", 162 "jsview/js_distributed.cpp", 163 "jsview/js_divider.cpp", 164 "jsview/js_ellipse.cpp", 165 "jsview/js_environment.cpp", 166 "jsview/js_flex.cpp", 167 "jsview/js_flex_impl.cpp", 168 "jsview/js_foreach.cpp", 169 "jsview/js_gauge.cpp", 170 "jsview/js_gesture.cpp", 171 "jsview/js_grid.cpp", 172 "jsview/js_grid_col.cpp", 173 "jsview/js_grid_container.cpp", 174 "jsview/js_grid_item.cpp", 175 "jsview/js_grid_row.cpp", 176 "jsview/js_hyperlink.cpp", 177 "jsview/js_if_else.cpp", 178 "jsview/js_image.cpp", 179 "jsview/js_image_animator.cpp", 180 "jsview/js_indexer.cpp", 181 "jsview/js_interactable_view.cpp", 182 "jsview/js_lazy_foreach.cpp", 183 "jsview/js_line.cpp", 184 "jsview/js_list.cpp", 185 "jsview/js_list_item.cpp", 186 "jsview/js_list_item_group.cpp", 187 "jsview/js_loading_progress.cpp", 188 "jsview/js_local_storage.cpp", 189 "jsview/js_marquee.cpp", 190 "jsview/js_matrix2d.cpp", 191 "jsview/js_menu.cpp", 192 "jsview/js_menu_item.cpp", 193 "jsview/js_menu_item_group.cpp", 194 "jsview/js_navdestination.cpp", 195 "jsview/js_navigation.cpp", 196 "jsview/js_navigator.cpp", 197 "jsview/js_navrouter.cpp", 198 "jsview/js_offscreen_canvas.cpp", 199 "jsview/js_offscreen_rendering_context.cpp", 200 "jsview/js_page_transition.cpp", 201 "jsview/js_pan_handler.cpp", 202 "jsview/js_path.cpp", 203 "jsview/js_path2d.cpp", 204 "jsview/js_pattern_lock.cpp", 205 "jsview/js_persistent.cpp", 206 "jsview/js_polygon.cpp", 207 "jsview/js_polyline.cpp", 208 "jsview/js_progress.cpp", 209 "jsview/js_qrcode.cpp", 210 "jsview/js_radio.cpp", 211 "jsview/js_rect.cpp", 212 "jsview/js_refresh.cpp", 213 "jsview/js_relative_container.cpp", 214 "jsview/js_render_image.cpp", 215 "jsview/js_rendering_context.cpp", 216 "jsview/js_rendering_context_settings.cpp", 217 "jsview/js_row.cpp", 218 "jsview/js_row_split.cpp", 219 "jsview/js_scroll.cpp", 220 "jsview/js_scroller.cpp", 221 "jsview/js_search.cpp", 222 "jsview/js_select.cpp", 223 "jsview/js_shape.cpp", 224 "jsview/js_shape_abstract.cpp", 225 "jsview/js_sheet.cpp", 226 "jsview/js_side_bar.cpp", 227 "jsview/js_slider.cpp", 228 "jsview/js_sliding_panel.cpp", 229 "jsview/js_span.cpp", 230 "jsview/js_stack.cpp", 231 "jsview/js_stepper.cpp", 232 "jsview/js_stepper_item.cpp", 233 "jsview/js_swiper.cpp", 234 "jsview/js_tab_content.cpp", 235 "jsview/js_tabs.cpp", 236 "jsview/js_tabs_controller.cpp", 237 "jsview/js_text.cpp", 238 "jsview/js_text_clock.cpp", 239 "jsview/js_textarea.cpp", 240 "jsview/js_textfield.cpp", 241 "jsview/js_textinput.cpp", 242 "jsview/js_textpicker.cpp", 243 "jsview/js_texttimer.cpp", 244 "jsview/js_toggle.cpp", 245 "jsview/js_touch_handler.cpp", 246 "jsview/js_utils.cpp", 247 "jsview/js_view.cpp", 248 "jsview/js_view_abstract.cpp", 249 "jsview/js_view_context.cpp", 250 "jsview/js_view_functions.cpp", 251 "jsview/js_view_measure_layout.cpp", 252 "jsview/js_view_stack_processor.cpp", 253 "jsview/js_water_flow.cpp", 254 "jsview/js_water_flow_item.cpp", 255 "jsview/menu/js_context_menu.cpp", 256 "jsview/scroll_bar/js_scroll_bar.cpp", 257 "sharedata/js_share_data.cpp", 258 "view_stack_processor.cpp", 259 260 # Models implemenations for classic fw 261 "jsview/models/animator_model_impl.cpp", 262 "jsview/models/checkbox_model_impl.cpp", 263 "jsview/models/checkboxgroup_model_impl.cpp", 264 "jsview/models/circle_model_impl.cpp", 265 "jsview/models/column_model_impl.cpp", 266 "jsview/models/counter_model_impl.cpp", 267 "jsview/models/data_panel_model_impl.cpp", 268 "jsview/models/divider_model_impl.cpp", 269 "jsview/models/ellipse_model_impl.cpp", 270 "jsview/models/flex_model_impl.cpp", 271 "jsview/models/for_each_model_impl.cpp", 272 "jsview/models/gauge_model_impl.cpp", 273 "jsview/models/grid_col_model_impl.cpp", 274 "jsview/models/grid_container_model_impl.cpp", 275 "jsview/models/grid_item_model_impl.cpp", 276 "jsview/models/grid_model_impl.cpp", 277 "jsview/models/grid_row_model_impl.cpp", 278 "jsview/models/hyperlink_model_impl.cpp", 279 "jsview/models/if_else_model_impl.cpp", 280 "jsview/models/image_model_impl.cpp", 281 "jsview/models/lazy_for_each_model_impl.cpp", 282 "jsview/models/line_model_impl.cpp", 283 "jsview/models/linear_split_model_impl.cpp", 284 "jsview/models/list_item_group_model_impl.cpp", 285 "jsview/models/list_item_model_impl.cpp", 286 "jsview/models/list_model_impl.cpp", 287 "jsview/models/loading_progress_model_impl.cpp", 288 "jsview/models/marquee_model_impl.cpp", 289 "jsview/models/navigator_model_impl.cpp", 290 "jsview/models/page_transition_model_impl.cpp", 291 "jsview/models/path_model_impl.cpp", 292 "jsview/models/patternlock_model_impl.cpp", 293 "jsview/models/picker_model_impl.cpp", 294 "jsview/models/polygon_model_impl.cpp", 295 "jsview/models/progress_model_impl.cpp", 296 "jsview/models/qrcode_model_impl.cpp", 297 "jsview/models/radio_model_impl.cpp", 298 "jsview/models/rect_model_impl.cpp", 299 "jsview/models/refresh_model_impl.cpp", 300 "jsview/models/row_model_impl.cpp", 301 "jsview/models/scroll_model_impl.cpp", 302 "jsview/models/search_model_impl.cpp", 303 "jsview/models/shape_abstract_model_impl.cpp", 304 "jsview/models/shape_model_impl.cpp", 305 "jsview/models/slider_model_impl.cpp", 306 "jsview/models/sliding_panel_model_impl.cpp", 307 "jsview/models/span_model_impl.cpp", 308 "jsview/models/stack_model_impl.cpp", 309 "jsview/models/stepper_item_model_impl.cpp", 310 "jsview/models/stepper_model_impl.cpp", 311 "jsview/models/swiper_model_impl.cpp", 312 "jsview/models/tab_content_model_impl.cpp", 313 "jsview/models/tabs_model_impl.cpp", 314 "jsview/models/text_clock_model_impl.cpp", 315 "jsview/models/text_field_model_impl.cpp", 316 "jsview/models/text_model_impl.cpp", 317 "jsview/models/text_timer_model_impl.cpp", 318 "jsview/models/textpicker_model_impl.cpp", 319 "jsview/models/timepicker_model_impl.cpp", 320 "jsview/models/toggle_model_impl.cpp", 321 "jsview/models/view_abstract_model_impl.cpp", 322 "jsview/models/view_full_update_model_impl.cpp", 323 "jsview/models/view_partial_update_model_impl.cpp", 324 "jsview/models/water_flow_item_model_impl.cpp", 325 "jsview/models/water_flow_model_impl.cpp", 326 ] 327 328 defines += uicast_configs.uicast_defines 329 sources += uicast_configs.uicast_frontend_sources 330 331 # rich components needed by phone and TV. wearable like watch do not need them 332 if (defined(config.rich_components_support) && 333 config.rich_components_support) { 334 sources += [ 335 "jsview/js_camera.cpp", 336 "jsview/js_piece.cpp", 337 "jsview/js_rating.cpp", 338 "jsview/models/rating_model_impl.cpp", 339 ] 340 if (defined(config.video_components_support) && 341 config.video_components_support) { 342 sources += [ 343 "jsview/js_video.cpp", 344 "jsview/js_video_controller.cpp", 345 "jsview/models/video_model_impl.cpp", 346 ] 347 } 348 } 349 350 if (defined(config.xcomponent_components_support) && 351 config.xcomponent_components_support) { 352 sources += [ 353 "jsview/js_xcomponent.cpp", 354 "jsview/js_xcomponent_controller.cpp", 355 "jsview/models/xcomponent_model_impl.cpp", 356 ] 357 } 358 359 if (defined(config.enable_ability_component) && 360 config.enable_ability_component) { 361 sources += [ 362 "jsview/js_ability_component.cpp", 363 "jsview/js_ability_component_controller.cpp", 364 "jsview/models/ability_component_model_impl.cpp", 365 ] 366 } 367 368 if (defined(config.web_components_support) && 369 config.web_components_support) { 370 sources += [ 371 "jsview/js_richtext.cpp", 372 "jsview/js_web.cpp", 373 "jsview/js_web_controller.cpp", 374 ] 375 } 376 377 if (defined(config.form_components_support) && 378 config.form_components_support) { 379 sources += [ "jsview/js_form.cpp" ] 380 } 381 382 if (defined(config.remote_window_support) && config.remote_window_support) { 383 sources += [ "jsview/js_remote_window.cpp" ] 384 } 385 386 if (defined(config.plugin_components_support) && 387 config.plugin_components_support) { 388 deps += 389 [ "$ace_flutter_engine_root:third_party_flutter_engine_$platform" ] 390 sources += [ "jsview/js_plugin.cpp" ] 391 } 392 393 if (defined(config.preview_support) && config.preview_support) { 394 sources += [ "jsview/js_previewer_mock.cpp" ] 395 } 396 397 if (defined(config.use_build_in_js_engine) && 398 config.use_build_in_js_engine) { 399 deps += [ "$ace_root/frameworks/bridge:framework_bridge_$platform" ] 400 defines += [ "BUILT_IN_JS_ENGINE" ] 401 } else { 402 sources += [ 403 "$ace_root/frameworks/bridge/js_frontend/engine/common/js_engine.cpp", 404 ] 405 deps += [ "$ace_root/build:libace" ] 406 if (defined(config.build_container_scope_lib) && 407 config.build_container_scope_lib) { 408 deps += [ "$ace_napi:ace_container_scope" ] 409 } 410 } 411 412 deps += [ "engine/$engine_path:declarative_js_engine_bridge_${engine_name}_$platform" ] 413 414 deps += [ 415 ":gen_obj_src_js_enum_style", 416 ":gen_obj_src_js_proxyclass", 417 ] 418 419 deps += uicast_configs.uicast_root_deps 420 421 include_dirs = [ "//foundation/window/window_manager/interfaces/innerkits" ] 422 include_dirs += uicast_configs.uicast_root_include 423 424 if (platform == "windows" || platform == "mac" || platform == "linux") { 425 deps += [ ":gen_obj_src_js_mock_system_plugin" ] 426 } else { 427 if (defined(config.plugin_components_support) && 428 config.plugin_components_support) { 429 if (!use_mingw_win && !use_mac && !use_linux) { 430 external_deps = [ 431 "multimedia_image_framework:image", 432 "multimedia_image_framework:image_native", 433 ] 434 } 435 } else { 436 external_deps = [ 437 "multimedia_image_framework:image", 438 "multimedia_image_framework:image_native", 439 ] 440 } 441 } 442 } 443} 444 445# build ng declarative javascript engine source 446template("declarative_js_engine_ng") { 447 forward_variables_from(invoker, "*") 448 449 ohos_source_set(target_name) { 450 subsystem_name = ace_engine_subsystem 451 part_name = ace_engine_part 452 defines += invoker.defines 453 if (target_cpu == "arm64") { 454 if (!is_mingw) { 455 defines += [ "_ARM64_" ] 456 } 457 } 458 if (current_os == "ohos" && current_cpu == "x86_64") { 459 defines += [ "SIMULATOR_64" ] 460 } 461 462 deps = [] 463 configs = [ "$ace_root:ace_config" ] 464 465 sources = [ 466 "engine/bindings_implementation.cpp", 467 "engine/declarative_engine_loader.cpp", 468 "engine/functions/js_animator_function.cpp", 469 "engine/functions/js_click_function.cpp", 470 "engine/functions/js_clipboard_function.cpp", 471 "engine/functions/js_drag_function.cpp", 472 "engine/functions/js_focus_function.cpp", 473 "engine/functions/js_foreach_function.cpp", 474 "engine/functions/js_function.cpp", 475 "engine/functions/js_gesture_function.cpp", 476 "engine/functions/js_hover_function.cpp", 477 "engine/functions/js_key_function.cpp", 478 "engine/functions/js_mouse_function.cpp", 479 "engine/functions/js_on_area_change_function.cpp", 480 "engine/functions/js_page_transition_function.cpp", 481 "engine/functions/js_pan_function.cpp", 482 "engine/functions/js_touch_function.cpp", 483 "engine/functions/js_webview_function.cpp", 484 "engine/js_types.cpp", 485 "jsview/js_environment.cpp", 486 "jsview/js_local_storage.cpp", 487 "jsview/js_persistent.cpp", 488 "jsview/js_view_functions.cpp", 489 "jsview/js_view_measure_layout.cpp", 490 "sharedata/js_share_data.cpp", 491 492 # jsviews 493 "jsview/js_column.cpp", 494 "jsview/js_container_base.cpp", 495 "jsview/js_flex.cpp", 496 "jsview/js_grid_container.cpp", 497 "jsview/js_image.cpp", 498 "jsview/js_interactable_view.cpp", 499 "jsview/js_lazy_foreach.cpp", 500 "jsview/js_list.cpp", 501 "jsview/js_list_item.cpp", 502 "jsview/js_row.cpp", 503 "jsview/js_stack.cpp", 504 "jsview/js_text.cpp", 505 "jsview/js_view.cpp", 506 "jsview/js_view_abstract.cpp", 507 ] 508 509 sources += [ 510 "$ace_root/frameworks/bridge/js_frontend/engine/common/js_engine.cpp", 511 ] 512 513 if (defined(config.video_components_support) && 514 config.video_components_support) { 515 sources += [ "jsview/js_video.cpp" ] 516 } 517 518 if (defined(config.use_build_in_js_engine) && 519 config.use_build_in_js_engine) { 520 deps += [ "$ace_root/frameworks/bridge:framework_bridge_ng_$platform" ] 521 defines += [ "BUILT_IN_JS_ENGINE" ] 522 } else { 523 deps += [ "$ace_root/build:libace" ] 524 if (defined(config.build_container_scope_lib) && 525 config.build_container_scope_lib) { 526 deps += [ "$ace_napi:ace_container_scope" ] 527 } 528 } 529 530 deps += [ "engine/$engine_path:declarative_js_engine_bridge_${engine_name}_$platform" ] 531 532 deps += [ 533 ":gen_obj_src_js_enum_style", 534 ":gen_obj_src_js_proxyclass", 535 ] 536 } 537} 538 539# dynamic generate js_engine targets 540foreach(item, ace_platforms) { 541 platform = item.name 542 engine_config = { 543 } 544 engine_config = item.config 545 support_engines = [] 546 support_engines = engine_config.js_engines 547 foreach(engine, support_engines) { 548 declarative_js_engine( 549 "declarative_js_engine_${engine.engine_name}_$platform") { 550 platform = item.name 551 engine_name = engine.engine_name 552 engine_path = engine.engine_path 553 defines = engine.engine_defines 554 555 config = { 556 } 557 if (defined(item.config)) { 558 config = item.config 559 } 560 if (defined(config.defines)) { 561 defines += config.defines 562 } 563 } 564 565 declarative_js_engine_ng( 566 "declarative_js_engine_ng_${engine.engine_name}_$platform") { 567 platform = item.name 568 engine_name = engine.engine_name 569 engine_path = engine.engine_path 570 defines = engine.engine_defines 571 572 config = { 573 } 574 if (defined(item.config)) { 575 config = item.config 576 } 577 if (defined(config.defines)) { 578 defines += config.defines 579 } 580 } 581 } 582} 583