1# Copyright (c) 2021-2022 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 ] 325 326 defines += uicast_configs.uicast_defines 327 sources += uicast_configs.uicast_frontend_sources 328 329 # rich components needed by phone and TV. wearable like watch do not need them 330 if (defined(config.rich_components_support) && 331 config.rich_components_support) { 332 sources += [ 333 "jsview/js_camera.cpp", 334 "jsview/js_piece.cpp", 335 "jsview/js_rating.cpp", 336 "jsview/models/rating_model_impl.cpp", 337 ] 338 if (defined(config.video_components_support) && 339 config.video_components_support) { 340 sources += [ 341 "jsview/js_video.cpp", 342 "jsview/js_video_controller.cpp", 343 "jsview/models/video_model_impl.cpp", 344 ] 345 } 346 } 347 348 if (defined(config.xcomponent_components_support) && 349 config.xcomponent_components_support) { 350 sources += [ 351 "jsview/js_xcomponent.cpp", 352 "jsview/js_xcomponent_controller.cpp", 353 "jsview/models/xcomponent_model_impl.cpp", 354 ] 355 } 356 357 if (defined(config.enable_ability_component) && 358 config.enable_ability_component) { 359 sources += [ 360 "jsview/js_ability_component.cpp", 361 "jsview/js_ability_component_controller.cpp", 362 "jsview/models/ability_component_model_impl.cpp", 363 ] 364 } 365 366 if (defined(config.web_components_support) && 367 config.web_components_support) { 368 sources += [ 369 "jsview/js_richtext.cpp", 370 "jsview/js_web.cpp", 371 "jsview/js_web_controller.cpp", 372 ] 373 } 374 375 if (defined(config.form_components_support) && 376 config.form_components_support) { 377 sources += [ "jsview/js_form.cpp" ] 378 } 379 380 if (defined(config.remote_window_support) && config.remote_window_support) { 381 sources += [ "jsview/js_remote_window.cpp" ] 382 } 383 384 if (defined(config.plugin_components_support) && 385 config.plugin_components_support) { 386 deps += 387 [ "$ace_flutter_engine_root:third_party_flutter_engine_$platform" ] 388 sources += [ "jsview/js_plugin.cpp" ] 389 } 390 391 if (defined(config.preview_support) && config.preview_support) { 392 sources += [ "jsview/js_previewer_mock.cpp" ] 393 } 394 395 if (defined(config.use_build_in_js_engine) && 396 config.use_build_in_js_engine) { 397 deps += [ "$ace_root/frameworks/bridge:framework_bridge_$platform" ] 398 defines += [ "BUILT_IN_JS_ENGINE" ] 399 } else { 400 sources += [ 401 "$ace_root/frameworks/bridge/js_frontend/engine/common/js_engine.cpp", 402 ] 403 deps += [ "$ace_root/build:libace" ] 404 if (defined(config.build_container_scope_lib) && 405 config.build_container_scope_lib) { 406 deps += [ "$ace_napi:ace_container_scope" ] 407 } 408 } 409 410 deps += [ "engine/$engine_path:declarative_js_engine_bridge_${engine_name}_$platform" ] 411 412 deps += [ 413 ":gen_obj_src_js_enum_style", 414 ":gen_obj_src_js_proxyclass", 415 ] 416 417 deps += uicast_configs.uicast_root_deps 418 419 include_dirs = [ "//foundation/window/window_manager/interfaces/innerkits" ] 420 include_dirs += uicast_configs.uicast_root_include 421 422 if (platform == "windows" || platform == "mac" || platform == "linux") { 423 deps += [ ":gen_obj_src_js_mock_system_plugin" ] 424 } else { 425 if (defined(config.plugin_components_support) && 426 config.plugin_components_support) { 427 if (!use_mingw_win && !use_mac && !use_linux) { 428 external_deps = [ 429 "multimedia_image_framework:image", 430 "multimedia_image_framework:image_native", 431 ] 432 } 433 } else { 434 external_deps = [ 435 "multimedia_image_framework:image", 436 "multimedia_image_framework:image_native", 437 ] 438 } 439 } 440 } 441} 442 443# build ng declarative javascript engine source 444template("declarative_js_engine_ng") { 445 forward_variables_from(invoker, "*") 446 447 ohos_source_set(target_name) { 448 subsystem_name = ace_engine_subsystem 449 part_name = ace_engine_part 450 defines += invoker.defines 451 if (target_cpu == "arm64") { 452 if (!is_mingw) { 453 defines += [ "_ARM64_" ] 454 } 455 } 456 if (current_os == "ohos" && current_cpu == "x86_64") { 457 defines += [ "SIMULATOR_64" ] 458 } 459 460 deps = [] 461 configs = [ "$ace_root:ace_config" ] 462 463 sources = [ 464 "engine/bindings_implementation.cpp", 465 "engine/declarative_engine_loader.cpp", 466 "engine/functions/js_animator_function.cpp", 467 "engine/functions/js_click_function.cpp", 468 "engine/functions/js_clipboard_function.cpp", 469 "engine/functions/js_drag_function.cpp", 470 "engine/functions/js_focus_function.cpp", 471 "engine/functions/js_foreach_function.cpp", 472 "engine/functions/js_function.cpp", 473 "engine/functions/js_gesture_function.cpp", 474 "engine/functions/js_hover_function.cpp", 475 "engine/functions/js_key_function.cpp", 476 "engine/functions/js_mouse_function.cpp", 477 "engine/functions/js_on_area_change_function.cpp", 478 "engine/functions/js_page_transition_function.cpp", 479 "engine/functions/js_pan_function.cpp", 480 "engine/functions/js_touch_function.cpp", 481 "engine/functions/js_webview_function.cpp", 482 "engine/js_types.cpp", 483 "jsview/js_environment.cpp", 484 "jsview/js_local_storage.cpp", 485 "jsview/js_persistent.cpp", 486 "jsview/js_view_functions.cpp", 487 "jsview/js_view_measure_layout.cpp", 488 "sharedata/js_share_data.cpp", 489 490 # jsviews 491 "jsview/js_column.cpp", 492 "jsview/js_container_base.cpp", 493 "jsview/js_flex.cpp", 494 "jsview/js_grid_container.cpp", 495 "jsview/js_image.cpp", 496 "jsview/js_interactable_view.cpp", 497 "jsview/js_lazy_foreach.cpp", 498 "jsview/js_list.cpp", 499 "jsview/js_list_item.cpp", 500 "jsview/js_row.cpp", 501 "jsview/js_stack.cpp", 502 "jsview/js_text.cpp", 503 "jsview/js_view.cpp", 504 "jsview/js_view_abstract.cpp", 505 ] 506 507 sources += [ 508 "$ace_root/frameworks/bridge/js_frontend/engine/common/js_engine.cpp", 509 ] 510 511 if (defined(config.video_components_support) && 512 config.video_components_support) { 513 sources += [ "jsview/js_video.cpp" ] 514 } 515 516 if (defined(config.use_build_in_js_engine) && 517 config.use_build_in_js_engine) { 518 deps += [ "$ace_root/frameworks/bridge:framework_bridge_ng_$platform" ] 519 defines += [ "BUILT_IN_JS_ENGINE" ] 520 } else { 521 deps += [ "$ace_root/build:libace" ] 522 if (defined(config.build_container_scope_lib) && 523 config.build_container_scope_lib) { 524 deps += [ "$ace_napi:ace_container_scope" ] 525 } 526 } 527 528 deps += [ "engine/$engine_path:declarative_js_engine_bridge_${engine_name}_$platform" ] 529 530 deps += [ 531 ":gen_obj_src_js_enum_style", 532 ":gen_obj_src_js_proxyclass", 533 ] 534 } 535} 536 537# dynamic generate js_engine targets 538foreach(item, ace_platforms) { 539 platform = item.name 540 engine_config = { 541 } 542 engine_config = item.config 543 support_engines = [] 544 support_engines = engine_config.js_engines 545 foreach(engine, support_engines) { 546 declarative_js_engine( 547 "declarative_js_engine_${engine.engine_name}_$platform") { 548 platform = item.name 549 engine_name = engine.engine_name 550 engine_path = engine.engine_path 551 defines = engine.engine_defines 552 553 config = { 554 } 555 if (defined(item.config)) { 556 config = item.config 557 } 558 if (defined(config.defines)) { 559 defines += config.defines 560 } 561 } 562 563 declarative_js_engine_ng( 564 "declarative_js_engine_ng_${engine.engine_name}_$platform") { 565 platform = item.name 566 engine_name = engine.engine_name 567 engine_path = engine.engine_path 568 defines = engine.engine_defines 569 570 config = { 571 } 572 if (defined(item.config)) { 573 config = item.config 574 } 575 if (defined(config.defines)) { 576 defines += config.defines 577 } 578 } 579 } 580} 581